Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit364509a

Browse files
pg_upgrade: Retrieve subscription count more efficiently.
Presently, pg_upgrade obtains the number of subscriptions in theto-be-upgraded cluster by first querying pg_subscription in everydatabase for the number of subscriptions in only that database.Then, in count_old_cluster_subscriptions(), it adds all the valuescollected in the first step. This is expensive, especially whenthere are many databases.Fortunately, there is a better way to retrieve the subscriptioncount. Since pg_subscription is a shared catalog, we only need toconnect to a single database and query it once. This commitmodifies pg_upgrade to use that approach, which also allows us totrim several lines of code. In passing, move the call toget_db_subscription_count(), which has been renamed toget_subscription_count(), from get_db_rel_and_slot_infos() to thededicated >= v17 section in check_and_dump_old_cluster().We may be able to make similar improvements toget_old_cluster_logical_slot_infos(), but that is left as a futureexercise.Reviewed-by: Michael Paquier, Amit KapilaDiscussion:https://postgr.es/m/ZprQJv_TxccN3tkr%40nathanBackpatch-through: 17
1 parent9f21482 commit364509a

File tree

3 files changed

+15
-53
lines changed

3 files changed

+15
-53
lines changed

‎src/bin/pg_upgrade/check.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -609,8 +609,10 @@ check_and_dump_old_cluster(bool live_check)
609609

610610
/*
611611
* Subscriptions and their dependencies can be migrated since PG17.
612-
* See comments atop get_db_subscription_count().
612+
* Before that the logical slots are not upgraded, so we will not be
613+
* able to upgrade the logical replication clusters completely.
613614
*/
615+
get_subscription_count(&old_cluster);
614616
check_old_cluster_subscription_state();
615617
}
616618

@@ -1797,17 +1799,14 @@ check_new_cluster_subscription_configuration(void)
17971799
{
17981800
PGresult*res;
17991801
PGconn*conn;
1800-
intnsubs_on_old;
18011802
intmax_replication_slots;
18021803

18031804
/* Subscriptions and their dependencies can be migrated since PG17. */
18041805
if (GET_MAJOR_VERSION(old_cluster.major_version)<1700)
18051806
return;
18061807

1807-
nsubs_on_old=count_old_cluster_subscriptions();
1808-
18091808
/* Quick return if there are no subscriptions to be migrated. */
1810-
if (nsubs_on_old==0)
1809+
if (old_cluster.nsubs==0)
18111810
return;
18121811

18131812
prep_status("Checking for new cluster configuration for subscriptions");
@@ -1821,10 +1820,10 @@ check_new_cluster_subscription_configuration(void)
18211820
pg_fatal("could not determine parameter settings on new cluster");
18221821

18231822
max_replication_slots=atoi(PQgetvalue(res,0,0));
1824-
if (nsubs_on_old>max_replication_slots)
1823+
if (old_cluster.nsubs>max_replication_slots)
18251824
pg_fatal("\"max_replication_slots\" (%d) must be greater than or equal to the number of "
18261825
"subscriptions (%d) on the old cluster",
1827-
max_replication_slots,nsubs_on_old);
1826+
max_replication_slots,old_cluster.nsubs);
18281827

18291828
PQclear(res);
18301829
PQfinish(conn);

‎src/bin/pg_upgrade/info.c

Lines changed: 7 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ static void print_db_infos(DbInfoArr *db_arr);
2828
staticvoidprint_rel_infos(RelInfoArr*rel_arr);
2929
staticvoidprint_slot_infos(LogicalSlotInfoArr*slot_arr);
3030
staticvoidget_old_cluster_logical_slot_infos(DbInfo*dbinfo,boollive_check);
31-
staticvoidget_db_subscription_count(DbInfo*dbinfo);
3231

3332

3433
/*
@@ -293,15 +292,8 @@ get_db_rel_and_slot_infos(ClusterInfo *cluster, bool live_check)
293292

294293
get_rel_infos(cluster,pDbInfo);
295294

296-
/*
297-
* Retrieve the logical replication slots infos and the subscriptions
298-
* count for the old cluster.
299-
*/
300295
if (cluster==&old_cluster)
301-
{
302296
get_old_cluster_logical_slot_infos(pDbInfo,live_check);
303-
get_db_subscription_count(pDbInfo);
304-
}
305297
}
306298

307299
if (cluster==&old_cluster)
@@ -748,54 +740,25 @@ count_old_cluster_logical_slots(void)
748740
}
749741

750742
/*
751-
* get_db_subscription_count()
752-
*
753-
* Gets the number of subscriptions in the database referred to by "dbinfo".
743+
* get_subscription_count()
754744
*
755-
* Note: This function will not do anything if the old cluster is pre-PG17.
756-
* This is because before that the logical slots are not upgraded, so we will
757-
* not be able to upgrade the logical replication clusters completely.
745+
* Gets the number of subscriptions in the cluster.
758746
*/
759-
staticvoid
760-
get_db_subscription_count(DbInfo*dbinfo)
747+
void
748+
get_subscription_count(ClusterInfo*cluster)
761749
{
762750
PGconn*conn;
763751
PGresult*res;
764752

765-
/* Subscriptions can be migrated since PG17. */
766-
if (GET_MAJOR_VERSION(old_cluster.major_version)<1700)
767-
return;
768-
769-
conn=connectToServer(&old_cluster,dbinfo->db_name);
753+
conn=connectToServer(cluster,"template1");
770754
res=executeQueryOrDie(conn,"SELECT count(*) "
771-
"FROM pg_catalog.pg_subscription WHERE subdbid = %u",
772-
dbinfo->db_oid);
773-
dbinfo->nsubs=atoi(PQgetvalue(res,0,0));
755+
"FROM pg_catalog.pg_subscription");
756+
cluster->nsubs=atoi(PQgetvalue(res,0,0));
774757

775758
PQclear(res);
776759
PQfinish(conn);
777760
}
778761

779-
/*
780-
* count_old_cluster_subscriptions()
781-
*
782-
* Returns the number of subscriptions for all databases.
783-
*
784-
* Note: this function always returns 0 if the old_cluster is PG16 and prior
785-
* because we gather subscriptions only for cluster versions greater than or
786-
* equal to PG17. See get_db_subscription_count().
787-
*/
788-
int
789-
count_old_cluster_subscriptions(void)
790-
{
791-
intnsubs=0;
792-
793-
for (intdbnum=0;dbnum<old_cluster.dbarr.ndbs;dbnum++)
794-
nsubs+=old_cluster.dbarr.dbs[dbnum].nsubs;
795-
796-
returnnsubs;
797-
}
798-
799762
staticvoid
800763
free_db_and_rel_infos(DbInfoArr*db_arr)
801764
{

‎src/bin/pg_upgrade/pg_upgrade.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,6 @@ typedef struct
197197
* path */
198198
RelInfoArrrel_arr;/* array of all user relinfos */
199199
LogicalSlotInfoArrslot_arr;/* array of all LogicalSlotInfo */
200-
intnsubs;/* number of subscriptions */
201200
}DbInfo;
202201

203202
/*
@@ -296,6 +295,7 @@ typedef struct
296295
charmajor_version_str[64];/* string PG_VERSION of cluster */
297296
uint32bin_version;/* version returned from pg_ctl */
298297
constchar*tablespace_suffix;/* directory specification */
298+
intnsubs;/* number of subscriptions */
299299
}ClusterInfo;
300300

301301

@@ -430,7 +430,7 @@ FileNameMap *gen_db_file_maps(DbInfo *old_db,
430430
constchar*new_pgdata);
431431
voidget_db_rel_and_slot_infos(ClusterInfo*cluster,boollive_check);
432432
intcount_old_cluster_logical_slots(void);
433-
intcount_old_cluster_subscriptions(void);
433+
voidget_subscription_count(ClusterInfo*cluster);
434434

435435
/* option.c */
436436

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp