diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 404b396559..334717c0e9 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -1493,6 +1493,12 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) snprintf(originname, sizeof(originname), "pg_%u", subid); replorigin_drop_by_name(originname, true, false); + /* + * Tell the cumulative stats system that the subscription is getting + * dropped. + */ + pgstat_drop_subscription(subid); + /* * If there is no slot associated with the subscription, we can finish * here. @@ -1580,12 +1586,6 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) } PG_END_TRY(); - /* - * Tell the cumulative stats system that the subscription is getting - * dropped. - */ - pgstat_drop_subscription(subid); - table_close(rel, NoLock); } diff --git a/src/test/subscription/t/026_stats.pl b/src/test/subscription/t/026_stats.pl index 59a09ce6dc..4719321e4d 100644 --- a/src/test/subscription/t/026_stats.pl +++ b/src/test/subscription/t/026_stats.pl @@ -267,6 +267,26 @@ is( $node_subscriber->safe_psql( qq(f), qq(Subscription stats for subscription '$sub1_name' should be removed.)); +# Get subscription 2 oid +my $sub2_oid = $node_subscriber->safe_psql($db, + qq(SELECT oid FROM pg_subscription WHERE subname = '$sub2_name')); + +# Diassociate the subscription 2 from its replication slot and drop it +$node_subscriber->safe_psql( + $db, + qq( +ALTER SUBSCRIPTION $sub2_name DISABLE; +ALTER SUBSCRIPTION $sub2_name SET (slot_name = NONE); +DROP SUBSCRIPTION $sub2_name; + )); + +# Subscription stats for sub2 should be gone +is( $node_subscriber->safe_psql( + $db, qq(SELECT pg_stat_have_stats('subscription', 0, $sub2_oid))), + qq(f), + qq(Subscription stats for subscription '$sub2_name' should be removed.)); +$node_publisher->safe_psql($db, + qq(SELECT pg_drop_replication_slot('$sub2_name'))); $node_subscriber->stop('fast'); $node_publisher->stop('fast');