diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2023-01-06 11:11:51 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2023-01-06 11:11:51 -0500 |
commit | cd4b2334db4980bbf86a8ba1d446db17e62ca342 (patch) | |
tree | a2aa57485228787eb940a9c8a777a95c99dee4e6 /src/backend/replication/pgoutput | |
parent | 211d80c065626d1a9188188d78ede85d799b93b1 (diff) | |
download | postgresql-cd4b2334db4980bbf86a8ba1d446db17e62ca342.tar.gz postgresql-cd4b2334db4980bbf86a8ba1d446db17e62ca342.zip |
Invalidate pgoutput's replication-decisions cache upon schema rename.
A schema rename should cause reporting the new qualified names of
tables to logical replication subscribers, but that wasn't happening.
Flush the RelationSyncCache to make it happen.
(If you ask me, the new test case shows that the behavior in this area
is still pretty dubious, but apparently it's operating as designed.)
Vignesh C
Discussion: https://postgr.es/m/CALDaNm32vLRv5KdrDFeVC-CU+4Wg1daA55hMqOxDGJBzvd76-w@mail.gmail.com
Diffstat (limited to 'src/backend/replication/pgoutput')
-rw-r--r-- | src/backend/replication/pgoutput/pgoutput.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 77372425163..876adab38e5 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -1929,7 +1929,22 @@ init_rel_sync_cache(MemoryContext cachectx) Assert(RelationSyncCache != NULL); + /* We must update the cache entry for a relation after a relcache flush */ CacheRegisterRelcacheCallback(rel_sync_cache_relation_cb, (Datum) 0); + + /* + * Flush all cache entries after a pg_namespace change, in case it was a + * schema rename affecting a relation being replicated. + */ + 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); @@ -2325,8 +2340,8 @@ 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, and - * pg_publication_namespace. + * Called for invalidations on pg_publication, pg_publication_rel, + * pg_publication_namespace, and pg_namespace. */ static void rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue) @@ -2337,14 +2352,14 @@ rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue) /* * We can get here if the plugin was used in SQL interface as the * RelSchemaSyncCache is destroyed when the decoding finishes, but there - * is no way to unregister the relcache invalidation callback. + * is no way to unregister the invalidation callbacks. */ if (RelationSyncCache == NULL) return; /* - * There is no way to find which entry in our cache the hash belongs to so - * mark the whole cache as invalid. + * We have no easy way to identify which cache entries this invalidation + * event might have affected, so just mark them all invalid. */ hash_seq_init(&status, RelationSyncCache); while ((entry = (RelationSyncEntry *) hash_seq_search(&status)) != NULL) |