mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
WAL Log invalidations at command end with wal_level=logical.
When wal_level=logical, write invalidations at command end into WAL so that decoding can use this information. This patch is required to allow the streaming of in-progress transactions in logical decoding. The actual work to allow streaming will be committed as a separate patch. We still add the invalidations to the cache and write them to WAL at commit time in RecordTransactionCommit(). This uses the existing XLOG_INVALIDATIONS xlog record type, from the RM_STANDBY_ID resource manager (see LogStandbyInvalidations for details). So existing code relying on those invalidations (e.g. redo) does not need to be changed. The invalidations written at command end uses a new xlog record type XLOG_XACT_INVALIDATIONS, from RM_XACT_ID resource manager. See LogLogicalInvalidations for details. These new xlog records are ignored by existing redo procedures, which still rely on the invalidations written to commit records. The invalidations are decoded and accumulated in top-transaction, and then executed during replay. This obviates the need to decode the invalidations as part of a commit record. Bump XLOG_PAGE_MAGIC, since this introduces XLOG_XACT_INVALIDATIONS. Author: Dilip Kumar, Tomas Vondra, Amit Kapila Reviewed-by: Amit Kapila Tested-by: Neha Sharma and Mahendra Singh Thalor Discussion: https://postgr.es/m/688b0b7f-2f6c-d827-c27b-216a8e3ea700@2ndquadrant.com
This commit is contained in:
54
src/backend/utils/cache/inval.c
vendored
54
src/backend/utils/cache/inval.c
vendored
@ -85,6 +85,9 @@
|
||||
* worth trying to avoid sending such inval traffic in the future, if those
|
||||
* problems can be overcome cheaply.
|
||||
*
|
||||
* When wal_level=logical, write invalidations into WAL at each command end to
|
||||
* support the decoding of the in-progress transactions. See
|
||||
* CommandEndInvalidationMessages.
|
||||
*
|
||||
* Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
@ -1094,6 +1097,11 @@ CommandEndInvalidationMessages(void)
|
||||
|
||||
ProcessInvalidationMessages(&transInvalInfo->CurrentCmdInvalidMsgs,
|
||||
LocalExecuteInvalidationMessage);
|
||||
|
||||
/* WAL Log per-command invalidation messages for wal_level=logical */
|
||||
if (XLogLogicalInfoActive())
|
||||
LogLogicalInvalidations();
|
||||
|
||||
AppendInvalidationMessages(&transInvalInfo->PriorCmdInvalidMsgs,
|
||||
&transInvalInfo->CurrentCmdInvalidMsgs);
|
||||
}
|
||||
@ -1501,3 +1509,49 @@ CallSyscacheCallbacks(int cacheid, uint32 hashvalue)
|
||||
i = ccitem->link - 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* LogLogicalInvalidations
|
||||
*
|
||||
* Emit WAL for invalidations. This is currently only used for logging
|
||||
* invalidations at the command end or at commit time if any invalidations
|
||||
* are pending.
|
||||
*/
|
||||
void
|
||||
LogLogicalInvalidations()
|
||||
{
|
||||
xl_xact_invals xlrec;
|
||||
SharedInvalidationMessage *invalMessages;
|
||||
int nmsgs = 0;
|
||||
|
||||
/* Quick exit if we haven't done anything with invalidation messages. */
|
||||
if (transInvalInfo == NULL)
|
||||
return;
|
||||
|
||||
ProcessInvalidationMessagesMulti(&transInvalInfo->CurrentCmdInvalidMsgs,
|
||||
MakeSharedInvalidMessagesArray);
|
||||
|
||||
Assert(!(numSharedInvalidMessagesArray > 0 &&
|
||||
SharedInvalidMessagesArray == NULL));
|
||||
|
||||
invalMessages = SharedInvalidMessagesArray;
|
||||
nmsgs = numSharedInvalidMessagesArray;
|
||||
SharedInvalidMessagesArray = NULL;
|
||||
numSharedInvalidMessagesArray = 0;
|
||||
|
||||
if (nmsgs > 0)
|
||||
{
|
||||
/* prepare record */
|
||||
memset(&xlrec, 0, MinSizeOfXactInvals);
|
||||
xlrec.nmsgs = nmsgs;
|
||||
|
||||
/* perform insertion */
|
||||
XLogBeginInsert();
|
||||
XLogRegisterData((char *) (&xlrec), MinSizeOfXactInvals);
|
||||
XLogRegisterData((char *) invalMessages,
|
||||
nmsgs * sizeof(SharedInvalidationMessage));
|
||||
XLogInsert(RM_XACT_ID, XLOG_XACT_INVALIDATIONS);
|
||||
|
||||
pfree(invalMessages);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user