From 0dd03d8d3476810bae5304472ad5d1aba057388b Mon Sep 17 00:00:00 2001 From: Hayato Kuroda Date: Mon, 3 Mar 2025 19:40:10 +0900 Subject: [PATCH v3 1/3] Avoid Invalidating all entries when ALTER PUBLICATION is executed When the ALTER PUBLICATION command is executed, all entries in RelationSyncCache will be discarded anyway. This mechanism works well but is sometimes not efficient. For example, when the ALTER PUBLICATION DROP TABLE is executed, 1) the specific entry in RelationSyncCache will be removed, and then 2) all entries will be discarded. This patch avoids dropping all entries in RelationSyncCache when ALTER PUBLICATION is executed. Theoretically, it is enough to invalidate the related relacache since RelacheCallback has already been registered. Author: Shlok Kyal and Hayato Kuroda --- src/backend/replication/pgoutput/pgoutput.c | 25 +++++++++------------ 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 7d464f656a..aebf032892 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -1965,23 +1965,21 @@ init_rel_sync_cache(MemoryContext cachectx) /* * Flush all cache entries after a pg_namespace change, in case it was a * schema rename affecting a relation being replicated. + * + * XXX: it may be feasible to avoid setting rel_sync_cache_publication_cb() + * as a syscache callback. One approach is to introduce a new type of + * invalidation message. It can be sent when a schema is modified and + * contains oid of relations included by the schema. Then, pgoutput can set + * a new callback for the message invalidating listed relations. Another + * approach is to store a hash value of pg_namespace.oid that relations + * belong to RelSyncCache entries. Syscache invalidation callbacks are + * passed the hash value of oid for the invalidated tuple, so syscache + * callback can lookup entries and invalidate if matched. */ CacheRegisterSyscacheCallback(NAMESPACEOID, rel_sync_cache_publication_cb, (Datum) 0); - /* - * Flush all cache entries after any publication changes. (We need no - * callback entry for pg_publication, because publication_invalidation_cb - * will take care of it.) - */ - CacheRegisterSyscacheCallback(PUBLICATIONRELMAP, - rel_sync_cache_publication_cb, - (Datum) 0); - CacheRegisterSyscacheCallback(PUBLICATIONNAMESPACEMAP, - rel_sync_cache_publication_cb, - (Datum) 0); - relation_callbacks_registered = true; } @@ -2397,8 +2395,7 @@ rel_sync_cache_relation_cb(Datum arg, Oid relid) /* * Publication relation/schema map syscache invalidation callback * - * Called for invalidations on pg_publication, pg_publication_rel, - * pg_publication_namespace, and pg_namespace. + * Called for invalidations on pg_publication and pg_namespace. */ static void rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue) -- 2.43.5