mirror of
https://github.com/postgres/postgres.git
synced 2026-02-20 08:20:55 -05:00
Repeatedly rewriting a mapped catalog table with VACUUM FULL or CLUSTER could cause logical decoding to fail with: ERROR, "could not map filenode \"%s\" to relation OID" To trigger the problem the rewritten catalog had to have live tuples with toasted columns. The problem was triggered as during catalog table rewrites the heap_insert() check that prevents logical decoding information to be emitted for system catalogs, failed to treat the new heap's toast table as a system catalog (because the new heap is not recognized as a catalog table via RelationIsLogicallyLogged()). The relmapper, in contrast to the normal catalog contents, does not contain historical information. After a single rewrite of a mapped table the new relation is known to the relmapper, but if the table is rewritten twice before logical decoding occurs, the relfilenode cannot be mapped to a relation anymore. Which then leads us to error out. This only happens for toast tables, because the main table contents aren't re-inserted with heap_insert(). The fix is simple, add a new heap_insert() flag that prevents logical decoding information from being emitted, and accept during decoding that there might not be tuple data for toast tables. Unfortunately that does not fix pre-existing logical decoding errors. Doing so would require not throwing an error when a filenode cannot be mapped to a relation during decoding, and that seems too likely to hide bugs. If it's crucial to fix decoding for an existing slot, temporarily changing the ERROR in ReorderBufferCommit() to a WARNING appears to be the best fix. Author: Andres Freund Discussion: https://postgr.es/m/20180914021046.oi7dm4ra3ot2g2kt@alap3.anarazel.de Backpatch: 9.4-, where logical decoding was introduced |
||
|---|---|---|
| .. | ||
| amapi.h | ||
| amvalidate.h | ||
| attnum.h | ||
| brin.h | ||
| brin_internal.h | ||
| brin_page.h | ||
| brin_pageops.h | ||
| brin_revmap.h | ||
| brin_tuple.h | ||
| brin_xlog.h | ||
| bufmask.h | ||
| clog.h | ||
| commit_ts.h | ||
| genam.h | ||
| generic_xlog.h | ||
| gin.h | ||
| gin_private.h | ||
| ginblock.h | ||
| ginxlog.h | ||
| gist.h | ||
| gist_private.h | ||
| gistscan.h | ||
| gistxlog.h | ||
| hash.h | ||
| hash_xlog.h | ||
| heapam.h | ||
| heapam_xlog.h | ||
| hio.h | ||
| htup.h | ||
| htup_details.h | ||
| itup.h | ||
| multixact.h | ||
| nbtree.h | ||
| nbtxlog.h | ||
| parallel.h | ||
| printsimple.h | ||
| printtup.h | ||
| reloptions.h | ||
| relscan.h | ||
| rewriteheap.h | ||
| rmgr.h | ||
| rmgrlist.h | ||
| sdir.h | ||
| session.h | ||
| skey.h | ||
| slru.h | ||
| spgist.h | ||
| spgist_private.h | ||
| spgxlog.h | ||
| stratnum.h | ||
| subtrans.h | ||
| sysattr.h | ||
| timeline.h | ||
| transam.h | ||
| tsmapi.h | ||
| tupconvert.h | ||
| tupdesc.h | ||
| tupdesc_details.h | ||
| tupmacs.h | ||
| tuptoaster.h | ||
| twophase.h | ||
| twophase_rmgr.h | ||
| valid.h | ||
| visibilitymap.h | ||
| xact.h | ||
| xlog.h | ||
| xlog_internal.h | ||
| xlogdefs.h | ||
| xloginsert.h | ||
| xlogreader.h | ||
| xlogrecord.h | ||
| xlogutils.h | ||