Refactor code in charge of grabbing the relations of a subscription
authorMichael Paquier <[email protected]>
Wed, 27 Jul 2022 10:50:06 +0000 (19:50 +0900)
committerMichael Paquier <[email protected]>
Wed, 27 Jul 2022 10:50:06 +0000 (19:50 +0900)
GetSubscriptionRelations() and GetSubscriptionNotReadyRelations() share
mostly the same code, which scans pg_subscription_rel and fetches all
the relations of a given subscription.  The only difference is that the
second routine looks for all the relations not in a ready state.  This
commit refactors the code to use a single routine, shaving a bit of
code.

Author: Vignesh C
Reviewed-By: Kyotaro Horiguchi, Amit Kapila, Michael Paquier, Peter
Smith
Discussion: https://postgr.es/m/CALDaNm0eW-9g4G_EzHebnFT5zZoasWCS_EzZQ5BgnLZny9S=pg@mail.gmail.com

src/backend/catalog/pg_subscription.c
src/backend/commands/subscriptioncmds.c
src/backend/replication/logical/tablesync.c
src/include/catalog/pg_subscription_rel.h

index 33ae3da8aeb80709772832a49afcae932b4e70f4..c7d2537fb5dadef4f7a529c28b0fd6ac043eb2e5 100644 (file)
@@ -533,65 +533,14 @@ HasSubscriptionRelations(Oid subid)
 }
 
 /*
- * Get all relations for subscription.
+ * Get the relations for the subscription.
  *
- * Returned list is palloc'ed in current memory context.
+ * If not_ready is true, return only the relations that are not in a ready
+ * state, otherwise return all the relations of the subscription.  The
+ * returned list is palloc'ed in the current memory context.
  */
 List *
-GetSubscriptionRelations(Oid subid)
-{
-   List       *res = NIL;
-   Relation    rel;
-   HeapTuple   tup;
-   ScanKeyData skey[1];
-   SysScanDesc scan;
-
-   rel = table_open(SubscriptionRelRelationId, AccessShareLock);
-
-   ScanKeyInit(&skey[0],
-               Anum_pg_subscription_rel_srsubid,
-               BTEqualStrategyNumber, F_OIDEQ,
-               ObjectIdGetDatum(subid));
-
-   scan = systable_beginscan(rel, InvalidOid, false,
-                             NULL, 1, skey);
-
-   while (HeapTupleIsValid(tup = systable_getnext(scan)))
-   {
-       Form_pg_subscription_rel subrel;
-       SubscriptionRelState *relstate;
-       Datum       d;
-       bool        isnull;
-
-       subrel = (Form_pg_subscription_rel) GETSTRUCT(tup);
-
-       relstate = (SubscriptionRelState *) palloc(sizeof(SubscriptionRelState));
-       relstate->relid = subrel->srrelid;
-       relstate->state = subrel->srsubstate;
-       d = SysCacheGetAttr(SUBSCRIPTIONRELMAP, tup,
-                           Anum_pg_subscription_rel_srsublsn, &isnull);
-       if (isnull)
-           relstate->lsn = InvalidXLogRecPtr;
-       else
-           relstate->lsn = DatumGetLSN(d);
-
-       res = lappend(res, relstate);
-   }
-
-   /* Cleanup */
-   systable_endscan(scan);
-   table_close(rel, AccessShareLock);
-
-   return res;
-}
-
-/*
- * Get all relations for subscription that are not in a ready state.
- *
- * Returned list is palloc'ed in current memory context.
- */
-List *
-GetSubscriptionNotReadyRelations(Oid subid)
+GetSubscriptionRelations(Oid subid, bool not_ready)
 {
    List       *res = NIL;
    Relation    rel;
@@ -607,10 +556,11 @@ GetSubscriptionNotReadyRelations(Oid subid)
                BTEqualStrategyNumber, F_OIDEQ,
                ObjectIdGetDatum(subid));
 
-   ScanKeyInit(&skey[nkeys++],
-               Anum_pg_subscription_rel_srsubstate,
-               BTEqualStrategyNumber, F_CHARNE,
-               CharGetDatum(SUBREL_STATE_READY));
+   if (not_ready)
+       ScanKeyInit(&skey[nkeys++],
+                   Anum_pg_subscription_rel_srsubstate,
+                   BTEqualStrategyNumber, F_CHARNE,
+                   CharGetDatum(SUBREL_STATE_READY));
 
    scan = systable_beginscan(rel, InvalidOid, false,
                              NULL, nkeys, skey);
index bd0cc0848d70eeffc214ca80d255f64790621c6a..f73dfb6067fb10e806822b88ebfea735572fee2b 100644 (file)
@@ -814,7 +814,7 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data,
        pubrel_names = fetch_table_list(wrconn, sub->publications);
 
        /* Get local table list. */
-       subrel_states = GetSubscriptionRelations(sub->oid);
+       subrel_states = GetSubscriptionRelations(sub->oid, false);
 
        /*
         * Build qsorted array of local table oids for faster lookup. This can
@@ -1494,7 +1494,7 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel)
     * the apply and tablesync workers and they can't restart because of
     * exclusive lock on the subscription.
     */
-   rstates = GetSubscriptionNotReadyRelations(subid);
+   rstates = GetSubscriptionRelations(subid, true);
    foreach(lc, rstates)
    {
        SubscriptionRelState *rstate = (SubscriptionRelState *) lfirst(lc);
index 670c6fcada571fd57f4d1cadab289ab3e66d520d..6a01ffd273f28504d5313a847d85a81c5fd46a55 100644 (file)
@@ -1479,7 +1479,7 @@ FetchTableStates(bool *started_tx)
        }
 
        /* Fetch all non-ready tables. */
-       rstates = GetSubscriptionNotReadyRelations(MySubscription->oid);
+       rstates = GetSubscriptionRelations(MySubscription->oid, true);
 
        /* Allocate the tracking info in a permanent memory context. */
        oldctx = MemoryContextSwitchTo(CacheMemoryContext);
index 9df99c3418106ad35592331641a5eba18d7149a8..8e88de7b2bf270a1c5dabe429cf94154f275cffe 100644 (file)
@@ -88,7 +88,6 @@ extern char GetSubscriptionRelState(Oid subid, Oid relid, XLogRecPtr *sublsn);
 extern void RemoveSubscriptionRel(Oid subid, Oid relid);
 
 extern bool HasSubscriptionRelations(Oid subid);
-extern List *GetSubscriptionRelations(Oid subid);
-extern List *GetSubscriptionNotReadyRelations(Oid subid);
+extern List *GetSubscriptionRelations(Oid subid, bool not_ready);
 
 #endif                         /* PG_SUBSCRIPTION_REL_H */