diff options
author | Magnus Hagander <magnus@hagander.net> | 2018-04-09 19:02:42 +0200 |
---|---|---|
committer | Magnus Hagander <magnus@hagander.net> | 2018-04-09 19:03:42 +0200 |
commit | a228cc13aeabff308d6dfc98a1015865f5393fce (patch) | |
tree | 4704837fb075ccf7c8e5ecc10f341e527ed0e16d /src/backend/access/transam/xlog.c | |
parent | 03c11796a95cc20a4559a103019d4d22a116a13c (diff) | |
download | postgresql-a228cc13aeabff308d6dfc98a1015865f5393fce.tar.gz postgresql-a228cc13aeabff308d6dfc98a1015865f5393fce.zip |
Revert "Allow on-line enabling and disabling of data checksums"
This reverts the backend sides of commit 1fde38beaa0c3e66c340efc7cc0dc272d6254bb0.
I have, at least for now, left the pg_verify_checksums tool in place, as
this tool can be very valuable without the rest of the patch as well,
and since it's a read-only tool that only runs when the cluster is down
it should be a lot safer.
Diffstat (limited to 'src/backend/access/transam/xlog.c')
-rw-r--r-- | src/backend/access/transam/xlog.c | 124 |
1 files changed, 6 insertions, 118 deletions
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 4a47395174c..a51df6b0b90 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -856,7 +856,6 @@ static void SetLatestXTime(TimestampTz xtime); static void SetCurrentChunkStartTime(TimestampTz xtime); static void CheckRequiredParameterValues(void); static void XLogReportParameters(void); -static void XlogChecksums(ChecksumType new_type); static void checkTimeLineSwitch(XLogRecPtr lsn, TimeLineID newTLI, TimeLineID prevTLI); static void LocalSetXLogInsertAllowed(void); @@ -1034,7 +1033,7 @@ XLogInsertRecord(XLogRecData *rdata, Assert(RedoRecPtr < Insert->RedoRecPtr); RedoRecPtr = Insert->RedoRecPtr; } - doPageWrites = (Insert->fullPageWrites || Insert->forcePageWrites || DataChecksumsInProgress()); + doPageWrites = (Insert->fullPageWrites || Insert->forcePageWrites); if (fpw_lsn != InvalidXLogRecPtr && fpw_lsn <= RedoRecPtr && doPageWrites) { @@ -4674,6 +4673,10 @@ ReadControlFile(void) (SizeOfXLogLongPHD - SizeOfXLogShortPHD); CalculateCheckpointSegments(); + + /* Make the initdb settings visible as GUC variables, too */ + SetConfigOption("data_checksums", DataChecksumsEnabled() ? "yes" : "no", + PGC_INTERNAL, PGC_S_OVERRIDE); } void @@ -4745,90 +4748,12 @@ GetMockAuthenticationNonce(void) * Are checksums enabled for data pages? */ bool -DataChecksumsNeedWrite(void) +DataChecksumsEnabled(void) { Assert(ControlFile != NULL); return (ControlFile->data_checksum_version > 0); } -bool -DataChecksumsNeedVerify(void) -{ - Assert(ControlFile != NULL); - - /* - * Only verify checksums if they are fully enabled in the cluster. In - * inprogress state they are only updated, not verified. - */ - return (ControlFile->data_checksum_version == PG_DATA_CHECKSUM_VERSION); -} - -bool -DataChecksumsInProgress(void) -{ - Assert(ControlFile != NULL); - return (ControlFile->data_checksum_version == PG_DATA_CHECKSUM_INPROGRESS_VERSION); -} - -void -SetDataChecksumsInProgress(void) -{ - Assert(ControlFile != NULL); - if (ControlFile->data_checksum_version > 0) - return; - - XlogChecksums(PG_DATA_CHECKSUM_INPROGRESS_VERSION); - - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->data_checksum_version = PG_DATA_CHECKSUM_INPROGRESS_VERSION; - UpdateControlFile(); - LWLockRelease(ControlFileLock); -} - -void -SetDataChecksumsOn(void) -{ - Assert(ControlFile != NULL); - - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - - if (ControlFile->data_checksum_version != PG_DATA_CHECKSUM_INPROGRESS_VERSION) - { - LWLockRelease(ControlFileLock); - elog(ERROR, "Checksums not in inprogress mode"); - } - - ControlFile->data_checksum_version = PG_DATA_CHECKSUM_VERSION; - UpdateControlFile(); - LWLockRelease(ControlFileLock); - - XlogChecksums(PG_DATA_CHECKSUM_VERSION); -} - -void -SetDataChecksumsOff(void) -{ - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - - ControlFile->data_checksum_version = 0; - UpdateControlFile(); - LWLockRelease(ControlFileLock); - - XlogChecksums(0); -} - -/* guc hook */ -const char * -show_data_checksums(void) -{ - if (ControlFile->data_checksum_version == PG_DATA_CHECKSUM_VERSION) - return "on"; - else if (ControlFile->data_checksum_version == PG_DATA_CHECKSUM_INPROGRESS_VERSION) - return "inprogress"; - else - return "off"; -} - /* * Returns a fake LSN for unlogged relations. * @@ -7864,16 +7789,6 @@ StartupXLOG(void) CompleteCommitTsInitialization(); /* - * If we reach this point with checksums in inprogress state, we notify - * the user that they need to manually restart the process to enable - * checksums. - */ - if (ControlFile->data_checksum_version == PG_DATA_CHECKSUM_INPROGRESS_VERSION) - ereport(WARNING, - (errmsg("checksum state is \"inprogress\" with no worker"), - errhint("Either disable or enable checksums by calling the pg_disable_data_checksums() or pg_enable_data_checksums() functions."))); - - /* * All done with end-of-recovery actions. * * Now allow backends to write WAL and update the control file status in @@ -9627,22 +9542,6 @@ XLogReportParameters(void) } /* - * Log the new state of checksums - */ -static void -XlogChecksums(ChecksumType new_type) -{ - xl_checksum_state xlrec; - - xlrec.new_checksumtype = new_type; - - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, sizeof(xl_checksum_state)); - - XLogInsert(RM_XLOG_ID, XLOG_CHECKSUMS); -} - -/* * Update full_page_writes in shared memory, and write an * XLOG_FPW_CHANGE record if necessary. * @@ -10070,17 +9969,6 @@ xlog_redo(XLogReaderState *record) /* Keep track of full_page_writes */ lastFullPageWrites = fpw; } - else if (info == XLOG_CHECKSUMS) - { - xl_checksum_state state; - - memcpy(&state, XLogRecGetData(record), sizeof(xl_checksum_state)); - - LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); - ControlFile->data_checksum_version = state.new_checksumtype; - UpdateControlFile(); - LWLockRelease(ControlFileLock); - } } #ifdef WAL_DEBUG |