mirror of
https://github.com/postgres/postgres.git
synced 2025-10-29 22:49:41 +03:00
Allow on-line enabling and disabling of data checksums
This makes it possible to turn checksums on in a live cluster, without the previous need for dump/reload or logical replication (and to turn it off). Enabling checkusm starts a background process in the form of a launcher/worker combination that goes through the entire database and recalculates checksums on each and every page. Only when all pages have been checksummed are they fully enabled in the cluster. Any failure of the process will revert to checksums off and the process has to be started. This adds a new WAL record that indicates the state of checksums, so the process works across replicated clusters. Authors: Magnus Hagander and Daniel Gustafsson Review: Tomas Vondra, Michael Banck, Heikki Linnakangas, Andrey Borodin
This commit is contained in:
@@ -154,7 +154,7 @@ extern PGDLLIMPORT int wal_level;
|
||||
* of the bits make it to disk, but the checksum wouldn't match. Also WAL-log
|
||||
* them if forced by wal_log_hints=on.
|
||||
*/
|
||||
#define XLogHintBitIsNeeded() (DataChecksumsEnabled() || wal_log_hints)
|
||||
#define XLogHintBitIsNeeded() (DataChecksumsNeedWrite() || wal_log_hints)
|
||||
|
||||
/* Do we need to WAL-log information required only for Hot Standby and logical replication? */
|
||||
#define XLogStandbyInfoActive() (wal_level >= WAL_LEVEL_REPLICA)
|
||||
@@ -257,7 +257,13 @@ extern char *XLogFileNameP(TimeLineID tli, XLogSegNo segno);
|
||||
extern void UpdateControlFile(void);
|
||||
extern uint64 GetSystemIdentifier(void);
|
||||
extern char *GetMockAuthenticationNonce(void);
|
||||
extern bool DataChecksumsEnabled(void);
|
||||
extern bool DataChecksumsNeedWrite(void);
|
||||
extern bool DataChecksumsNeedVerify(void);
|
||||
extern bool DataChecksumsInProgress(void);
|
||||
extern void SetDataChecksumsInProgress(void);
|
||||
extern void SetDataChecksumsOn(void);
|
||||
extern void SetDataChecksumsOff(void);
|
||||
extern const char *show_data_checksums(void);
|
||||
extern XLogRecPtr GetFakeLSNForUnloggedRel(void);
|
||||
extern Size XLOGShmemSize(void);
|
||||
extern void XLOGShmemInit(void);
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "lib/stringinfo.h"
|
||||
#include "pgtime.h"
|
||||
#include "storage/block.h"
|
||||
#include "storage/checksum.h"
|
||||
#include "storage/relfilenode.h"
|
||||
|
||||
|
||||
@@ -240,6 +241,12 @@ typedef struct xl_restore_point
|
||||
char rp_name[MAXFNAMELEN];
|
||||
} xl_restore_point;
|
||||
|
||||
/* Information logged when checksum level is changed */
|
||||
typedef struct xl_checksum_state
|
||||
{
|
||||
ChecksumType new_checksumtype;
|
||||
} xl_checksum_state;
|
||||
|
||||
/* End of recovery mark, when we don't do an END_OF_RECOVERY checkpoint */
|
||||
typedef struct xl_end_of_recovery
|
||||
{
|
||||
|
||||
@@ -53,6 +53,6 @@
|
||||
*/
|
||||
|
||||
/* yyyymmddN */
|
||||
#define CATALOG_VERSION_NO 201804051
|
||||
#define CATALOG_VERSION_NO 201804052
|
||||
|
||||
#endif
|
||||
|
||||
@@ -76,6 +76,7 @@ typedef struct CheckPoint
|
||||
#define XLOG_END_OF_RECOVERY 0x90
|
||||
#define XLOG_FPI_FOR_HINT 0xA0
|
||||
#define XLOG_FPI 0xB0
|
||||
#define XLOG_CHECKSUMS 0xC0
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -5583,6 +5583,11 @@ DESCR("pg_controldata recovery state information as a function");
|
||||
DATA(insert OID = 3444 ( pg_control_init PGNSP PGUID 12 1 0 0 0 f f f t f v s 0 0 2249 "" "{23,23,23,23,23,23,23,23,23,16,16,23}" "{o,o,o,o,o,o,o,o,o,o,o,o}" "{max_data_alignment,database_block_size,blocks_per_segment,wal_block_size,bytes_per_wal_segment,max_identifier_length,max_index_columns,max_toast_chunk_size,large_object_chunk_size,float4_pass_by_value,float8_pass_by_value,data_page_checksum_version}" _null_ _null_ pg_control_init _null_ _null_ _null_ ));
|
||||
DESCR("pg_controldata init state information as a function");
|
||||
|
||||
DATA(insert OID = 3996 ( pg_disable_data_checksums PGNSP PGUID 12 1 0 0 0 f f f t f v s 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ disable_data_checksums _null_ _null_ _null_ ));
|
||||
DESCR("disable data checksums");
|
||||
DATA(insert OID = 3998 ( pg_enable_data_checksums PGNSP PGUID 12 1 0 0 0 f f f t f v s 2 0 2278 "23 23" _null_ _null_ "{cost_delay,cost_limit}" _null_ _null_ enable_data_checksums _null_ _null_ _null_ ));
|
||||
DESCR("enable data checksums");
|
||||
|
||||
/* collation management functions */
|
||||
DATA(insert OID = 3445 ( pg_import_system_collations PGNSP PGUID 12 100 0 0 0 f f f t f v u 1 0 23 "4089" _null_ _null_ _null_ _null_ _null_ pg_import_system_collations _null_ _null_ _null_ ));
|
||||
DESCR("import collations from operating system");
|
||||
|
||||
@@ -710,7 +710,9 @@ typedef enum BackendType
|
||||
B_STARTUP,
|
||||
B_WAL_RECEIVER,
|
||||
B_WAL_SENDER,
|
||||
B_WAL_WRITER
|
||||
B_WAL_WRITER,
|
||||
B_CHECKSUMHELPER_LAUNCHER,
|
||||
B_CHECKSUMHELPER_WORKER
|
||||
} BackendType;
|
||||
|
||||
|
||||
|
||||
31
src/include/postmaster/checksumhelper.h
Normal file
31
src/include/postmaster/checksumhelper.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* checksumhelper.h
|
||||
* header file for checksum helper background worker
|
||||
*
|
||||
*
|
||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/postmaster/checksumhelper.h
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef CHECKSUMHELPER_H
|
||||
#define CHECKSUMHELPER_H
|
||||
|
||||
/* Shared memory */
|
||||
extern Size ChecksumHelperShmemSize(void);
|
||||
extern void ChecksumHelperShmemInit(void);
|
||||
|
||||
/* Start the background processes for enabling checksums */
|
||||
bool StartChecksumHelperLauncher(int cost_delay, int cost_limit);
|
||||
|
||||
/* Shutdown the background processes, if any */
|
||||
void ShutdownChecksumHelperIfRunning(void);
|
||||
|
||||
/* Background worker entrypoints */
|
||||
void ChecksumHelperLauncherMain(Datum arg);
|
||||
void ChecksumHelperWorkerMain(Datum arg);
|
||||
|
||||
#endif /* CHECKSUMHELPER_H */
|
||||
@@ -194,6 +194,7 @@ typedef PageHeaderData *PageHeader;
|
||||
*/
|
||||
#define PG_PAGE_LAYOUT_VERSION 4
|
||||
#define PG_DATA_CHECKSUM_VERSION 1
|
||||
#define PG_DATA_CHECKSUM_INPROGRESS_VERSION 2
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* page support macros
|
||||
|
||||
@@ -15,6 +15,13 @@
|
||||
|
||||
#include "storage/block.h"
|
||||
|
||||
typedef enum ChecksumType
|
||||
{
|
||||
DATA_CHECKSUMS_OFF = 0,
|
||||
DATA_CHECKSUMS_ON,
|
||||
DATA_CHECKSUMS_INPROGRESS
|
||||
} ChecksumType;
|
||||
|
||||
/*
|
||||
* Compute the checksum for a Postgres page. The page must be aligned on a
|
||||
* 4-byte boundary.
|
||||
|
||||
Reference in New Issue
Block a user