diff options
Diffstat (limited to 'src/backend/access/transam')
-rw-r--r-- | src/backend/access/transam/xlog.c | 124 | ||||
-rw-r--r-- | src/backend/access/transam/xlogfuncs.c | 59 |
2 files changed, 6 insertions, 177 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 diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index b76b2688911..316edbe3c58 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -24,7 +24,6 @@ #include "catalog/pg_type.h" #include "funcapi.h" #include "miscadmin.h" -#include "postmaster/checksumhelper.h" #include "replication/walreceiver.h" #include "storage/smgr.h" #include "utils/builtins.h" @@ -699,61 +698,3 @@ pg_backup_start_time(PG_FUNCTION_ARGS) PG_RETURN_DATUM(xtime); } - -/* - * Disables checksums for the cluster, unless already disabled. - * - * Has immediate effect - the checksums are set to off right away. - */ -Datum -disable_data_checksums(PG_FUNCTION_ARGS) -{ - /* - * If we don't need to write new checksums, then clearly they are already - * disabled. - */ - if (!DataChecksumsNeedWrite()) - ereport(ERROR, - (errmsg("data checksums already disabled"))); - - ShutdownChecksumHelperIfRunning(); - - SetDataChecksumsOff(); - - PG_RETURN_VOID(); -} - -/* - * Enables checksums for the cluster, unless already enabled. - * - * Supports vacuum-like cost-based throttling, to limit system load. - * Starts a background worker that updates checksums on existing data. - */ -Datum -enable_data_checksums(PG_FUNCTION_ARGS) -{ - int cost_delay = PG_GETARG_INT32(0); - int cost_limit = PG_GETARG_INT32(1); - - if (cost_delay < 0) - ereport(ERROR, - (errmsg("cost delay cannot be less than zero"))); - if (cost_limit <= 0) - ereport(ERROR, - (errmsg("cost limit must be a positive value"))); - - /* - * Allow state change from "off" or from "inprogress", since this is how - * we restart the worker if necessary. - */ - if (DataChecksumsNeedVerify()) - ereport(ERROR, - (errmsg("data checksums already enabled"))); - - SetDataChecksumsInProgress(); - if (!StartChecksumHelperLauncher(cost_delay, cost_limit)) - ereport(ERROR, - (errmsg("failed to start checksum helper process"))); - - PG_RETURN_VOID(); -} |