mirror of
https://github.com/postgres/postgres.git
synced 2025-10-22 14:32:25 +03:00
For inplace update, send nontransactional invalidations.
The inplace update survives ROLLBACK. The inval didn't, so another backend's DDL could then update the row without incorporating the inplace update. In the test this fixes, a mix of CREATE INDEX and ALTER TABLE resulted in a table with an index, yet relhasindex=f. That is a source of index corruption. Back-patch to v12 (all supported versions). The back branch versions don't change WAL, because those branches just added end-of-recovery SIResetAll(). All branches change the ABI of extern function PrepareToInvalidateCacheTuple(). No PGXN extension calls that, and there's no apparent use case in extensions. Reviewed by Nitin Motiani and (in earlier versions) Andres Freund. Discussion: https://postgr.es/m/20240523000548.58.nmisch@google.com
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include "storage/buf.h"
|
||||
#include "storage/bufpage.h"
|
||||
#include "storage/relfilelocator.h"
|
||||
#include "storage/sinval.h"
|
||||
#include "utils/relcache.h"
|
||||
|
||||
|
||||
@@ -425,9 +426,14 @@ typedef struct xl_heap_confirm
|
||||
typedef struct xl_heap_inplace
|
||||
{
|
||||
OffsetNumber offnum; /* updated tuple's offset on page */
|
||||
Oid dbId; /* MyDatabaseId */
|
||||
Oid tsId; /* MyDatabaseTableSpace */
|
||||
bool relcacheInitFileInval; /* invalidate relcache init files */
|
||||
int nmsgs; /* number of shared inval msgs */
|
||||
SharedInvalidationMessage msgs[FLEXIBLE_ARRAY_MEMBER];
|
||||
} xl_heap_inplace;
|
||||
|
||||
#define SizeOfHeapInplace (offsetof(xl_heap_inplace, offnum) + sizeof(OffsetNumber))
|
||||
#define MinSizeOfHeapInplace (offsetof(xl_heap_inplace, nmsgs) + sizeof(int))
|
||||
|
||||
/*
|
||||
* This is what we need to know about setting a visibility map bit
|
||||
|
@@ -31,7 +31,7 @@
|
||||
/*
|
||||
* Each page of XLOG file has a header like this:
|
||||
*/
|
||||
#define XLOG_PAGE_MAGIC 0xD117 /* can be used as WAL version indicator */
|
||||
#define XLOG_PAGE_MAGIC 0xD118 /* can be used as WAL version indicator */
|
||||
|
||||
typedef struct XLogPageHeaderData
|
||||
{
|
||||
|
Reference in New Issue
Block a user