mirror of
https://github.com/postgres/postgres.git
synced 2025-08-21 10:42:50 +03:00
Revert "Skip WAL for new relfilenodes, under wal_level=minimal."
This reverts commit cb2fd7eac2
. Per
numerous buildfarm members, it was incompatible with parallel query, and
a test case assumed LP64. Back-patch to 9.5 (all supported versions).
Discussion: https://postgr.es/m/20200321224920.GB1763544@rfd.leadboat.com
This commit is contained in:
@@ -1004,44 +1004,23 @@ gistproperty(Oid index_oid, int attno,
|
||||
}
|
||||
|
||||
/*
|
||||
* Some indexes are not WAL-logged, but we need LSNs to detect concurrent page
|
||||
* splits anyway. This function provides a fake sequence of LSNs for that
|
||||
* purpose.
|
||||
* Temporary and unlogged GiST indexes are not WAL-logged, but we need LSNs
|
||||
* to detect concurrent page splits anyway. This function provides a fake
|
||||
* sequence of LSNs for that purpose.
|
||||
*/
|
||||
XLogRecPtr
|
||||
gistGetFakeLSN(Relation rel)
|
||||
{
|
||||
static XLogRecPtr counter = FirstNormalUnloggedLSN;
|
||||
|
||||
if (rel->rd_rel->relpersistence == RELPERSISTENCE_TEMP)
|
||||
{
|
||||
/*
|
||||
* Temporary relations are only accessible in our session, so a simple
|
||||
* backend-local counter will do.
|
||||
*/
|
||||
static XLogRecPtr counter = FirstNormalUnloggedLSN;
|
||||
|
||||
return counter++;
|
||||
}
|
||||
else if (rel->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)
|
||||
{
|
||||
/*
|
||||
* WAL-logging on this relation will start after commit, so its LSNs
|
||||
* must be distinct numbers smaller than the LSN at the next commit.
|
||||
* Emit a dummy WAL record if insert-LSN hasn't advanced after the
|
||||
* last call.
|
||||
*/
|
||||
static XLogRecPtr lastlsn = InvalidXLogRecPtr;
|
||||
XLogRecPtr currlsn = GetXLogInsertRecPtr();
|
||||
|
||||
/* Shouldn't be called for WAL-logging relations */
|
||||
Assert(!RelationNeedsWAL(rel));
|
||||
|
||||
/* No need for an actual record if we already have a distinct LSN */
|
||||
if (!XLogRecPtrIsInvalid(lastlsn) && lastlsn == currlsn)
|
||||
currlsn = gistXLogAssignLSN();
|
||||
|
||||
lastlsn = currlsn;
|
||||
return currlsn;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
|
@@ -449,9 +449,6 @@ gist_redo(XLogReaderState *record)
|
||||
case XLOG_GIST_PAGE_DELETE:
|
||||
gistRedoPageDelete(record);
|
||||
break;
|
||||
case XLOG_GIST_ASSIGN_LSN:
|
||||
/* nop. See gistGetFakeLSN(). */
|
||||
break;
|
||||
default:
|
||||
elog(PANIC, "gist_redo: unknown op code %u", info);
|
||||
}
|
||||
@@ -595,24 +592,6 @@ gistXLogPageDelete(Buffer buffer, FullTransactionId xid,
|
||||
return recptr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Write an empty XLOG record to assign a distinct LSN.
|
||||
*/
|
||||
XLogRecPtr
|
||||
gistXLogAssignLSN(void)
|
||||
{
|
||||
int dummy = 0;
|
||||
|
||||
/*
|
||||
* Records other than SWITCH_WAL must have content. We use an integer 0 to
|
||||
* follow the restriction.
|
||||
*/
|
||||
XLogBeginInsert();
|
||||
XLogSetRecordFlags(XLOG_MARK_UNIMPORTANT);
|
||||
XLogRegisterData((char *) &dummy, sizeof(dummy));
|
||||
return XLogInsert(RM_GIST_ID, XLOG_GIST_ASSIGN_LSN);
|
||||
}
|
||||
|
||||
/*
|
||||
* Write XLOG record about reuse of a deleted page.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user