217#include "utils/fmgroids.h"
475 errmsg(
"incorrect data checksum state %i for target state %i",
493 errmsg(
"must be superuser to change data checksum state"));
513 errmsg(
"must be superuser to change data checksum state"));
518 errmsg(
"cost delay cannot be a negative value"));
523 errmsg(
"cost limit must be greater than zero"));
552#ifdef USE_ASSERT_CHECKING
555 Assert(cost_delay == 0 && cost_limit == 0);
611 errmsg(
"failed to start background worker to process data checksums"));
617 errmsg(
"data checksum processing already running"));
791 errmsg(
"could not start background worker for enabling data checksums in database \"%s\"",
793 errhint(
"The \"%s\" setting might be too low.",
"max_worker_processes"));
814 errmsg(
"could not start background worker for enabling data checksums in database \"%s\"",
816 errhint(
"More details on the error might be found in the server log."));
839 errmsg(
"cannot enable data checksums without the postmaster process"),
840 errhint(
"Restart the database and restart data checksum processing by calling pg_enable_data_checksums()."));
844 errmsg(
"initiating data checksum processing in database \"%s\"",
853 "Waiting for worker in database %s (pid %ld)", db->
dbname, (
long) pid);
860 errmsg(
"postmaster exited during data checksum processing in \"%s\"",
862 errhint(
"Restart the database and restart data checksum processing by calling pg_enable_data_checksums()."));
866 errmsg(
"data checksums processing was aborted in database \"%s\"",
896 errmsg(
"data checksums launcher exiting while worker is still running, signalling worker"));
969 "Waiting for current transactions to finish (waiting for %u)",
987 errmsg(
"postmaster exited during data checksums processing"),
988 errhint(
"Data checksums processing must be restarted manually after cluster restart."));
1018 errmsg(
"background worker \"datachecksums launcher\" started"));
1037 errmsg(
"background worker \"datachecksums launcher\" already running, exiting"));
1076 errmsg(
"enabling data checksums requested, starting data checksum calculation"));
1104 errmsg(
"unable to enable data checksums in cluster"));
1114 errmsg(
"data checksums are now enabled"));
1119 errmsg(
"disabling data checksums requested"));
1125 errmsg(
"data checksums are now disabled"));
1191 const int index[] = {
1219#ifdef USE_INJECTION_POINTS
1241 errmsg(
"data checksums failed to get enabled in all databases, aborting"),
1242 errhint(
"The server log might have more information on the cause of the error."));
1369 if (db->dbname !=
NULL)
1461#ifdef USE_INJECTION_POINTS
1462 bool retried =
false;
1515 const int index[] = {
1549 errmsg(
"data checksum processing aborted in database OID %u",
1579#ifdef USE_INJECTION_POINTS
1602 "Waiting for %d temp tables to be removed",
numleft);
1622 errmsg(
"data checksum processing aborted in database OID %u",
static dlist_head DatabaseList
void pgstat_progress_start_command(ProgressCommandType cmdtype, Oid relid)
void pgstat_progress_update_param(int index, int64 val)
void pgstat_progress_update_multi_param(int nparam, const int *index, const int64 *val)
void pgstat_progress_end_command(void)
@ PROGRESS_COMMAND_DATACHECKSUMS
void pgstat_report_activity(BackendState state, const char *cmd_str)
BgwHandleStatus WaitForBackgroundWorkerStartup(BackgroundWorkerHandle *handle, pid_t *pidp)
BgwHandleStatus WaitForBackgroundWorkerShutdown(BackgroundWorkerHandle *handle)
void BackgroundWorkerUnblockSignals(void)
void BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags)
bool RegisterDynamicBackgroundWorker(BackgroundWorker *worker, BackgroundWorkerHandle **handle)
#define BGW_NEVER_RESTART
@ BgWorkerStart_RecoveryFinished
#define BGWORKER_BACKEND_DATABASE_CONNECTION
#define BGWORKER_BYPASS_ALLOWCONN
#define BGWORKER_SHMEM_ACCESS
BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, ForkNumber forkNum)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
static void LockBuffer(Buffer buffer, BufferLockMode mode)
#define Assert(condition)
@ PG_DATA_CHECKSUM_VERSION
@ PG_DATA_CHECKSUM_INPROGRESS_OFF
@ PG_DATA_CHECKSUM_INPROGRESS_ON
static void DataChecksumsShmemRequest(void *arg)
void StartDataChecksumsWorkerLauncher(DataChecksumsWorkerOperation op, int cost_delay, int cost_limit)
static DataChecksumsStateStruct * DataChecksumState
static volatile sig_atomic_t launcher_running
static bool ProcessSingleRelationFork(Relation reln, ForkNumber forkNum, BufferAccessStrategy strategy)
void EmitAndWaitDataChecksumsBarrier(uint32 state)
static volatile sig_atomic_t abort_requested
static DataChecksumsWorkerOperation operation
static void launcher_cancel_handler(SIGNAL_ARGS)
static DataChecksumsWorkerResult ProcessDatabase(DataChecksumsWorkerDatabase *db)
void DataChecksumsWorkerMain(Datum arg)
static void FreeDatabaseList(List *dblist)
static List * BuildDatabaseList(void)
static bool DatabaseExists(Oid dboid)
static bool ProcessAllDatabases(void)
void DataChecksumsWorkerLauncherMain(Datum arg)
static void launcher_exit(int code, Datum arg)
static bool ProcessSingleRelationByOid(Oid relationId, BufferAccessStrategy strategy)
bool AbsorbDataChecksumsBarrier(ProcSignalBarrierType barrier)
static const ChecksumBarrierCondition checksum_barriers[6]
const ShmemCallbacks DataChecksumsShmemCallbacks
static void WaitForAllTransactionsToFinish(void)
Datum disable_data_checksums(PG_FUNCTION_ARGS)
Datum enable_data_checksums(PG_FUNCTION_ARGS)
static List * BuildRelationList(bool temp_relations, bool include_shared)
DataChecksumsWorkerOperation
DataChecksumsWorkerResult
@ DATACHECKSUMSWORKER_ABORTED
@ DATACHECKSUMSWORKER_FAILED
@ DATACHECKSUMSWORKER_DROPDB
@ DATACHECKSUMSWORKER_SUCCESSFUL
int errcode(int sqlerrcode)
int errhint(const char *fmt,...) pg_attribute_printf(1
#define ereport(elevel,...)
#define PG_GETARG_INT32(n)
BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype)
void systable_endscan(SysScanDesc sysscan)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
#define INJECTION_POINT(name, arg)
#define IS_INJECTION_POINT_ATTACHED(name)
#define INJECTION_POINT_CACHED(name, arg)
void on_shmem_exit(pg_on_exit_callback function, Datum arg)
void SetLatch(Latch *latch)
void ResetLatch(Latch *latch)
int WaitLatch(Latch *latch, int wakeEvents, long timeout, uint32 wait_event_info)
List * lappend(List *list, void *datum)
List * lappend_oid(List *list, Oid datum)
void list_free(List *list)
bool list_member_oid(const List *list, Oid datum)
void list_free_deep(List *list)
char * get_namespace_name(Oid nspid)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
#define START_CRIT_SECTION()
#define CHECK_FOR_INTERRUPTS()
@ B_DATACHECKSUMSWORKER_WORKER
@ B_DATACHECKSUMSWORKER_LAUNCHER
#define END_CRIT_SECTION()
BackendType MyBackendType
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
FormData_pg_class * Form_pg_class
END_CATALOG_STRUCT typedef FormData_pg_database * Form_pg_database
static int list_length(const List *l)
#define foreach_ptr(type, var, lst)
#define foreach_oid(var, lst)
static char buf[DEFAULT_XLOG_SEG_SIZE]
static THREAD_BARRIER_T barrier
static Oid DatumGetObjectId(Datum X)
static Datum ObjectIdGetDatum(Oid X)
TransactionId GetOldestActiveTransactionId(bool inCommitOnly, bool allDbs)
void WaitForProcSignalBarrier(uint64 generation)
uint64 EmitProcSignalBarrier(ProcSignalBarrierType type)
void procsignal_sigusr1_handler(SIGNAL_ARGS)
@ PROCSIGNAL_BARRIER_CHECKSUM_INPROGRESS_OFF
@ PROCSIGNAL_BARRIER_CHECKSUM_INPROGRESS_ON
@ PROCSIGNAL_BARRIER_CHECKSUM_ON
@ PROCSIGNAL_BARRIER_CHECKSUM_OFF
#define PROGRESS_DATACHECKSUMS_PHASE_DONE
#define PROGRESS_DATACHECKSUMS_RELS_TOTAL
#define PROGRESS_DATACHECKSUMS_PHASE_WAITING_TEMPREL
#define PROGRESS_DATACHECKSUMS_BLOCKS_DONE
#define PROGRESS_DATACHECKSUMS_DBS_DONE
#define PROGRESS_DATACHECKSUMS_PHASE
#define PROGRESS_DATACHECKSUMS_PHASE_ENABLING
#define PROGRESS_DATACHECKSUMS_PHASE_WAITING_BARRIER
#define PROGRESS_DATACHECKSUMS_PHASE_DISABLING
#define PROGRESS_DATACHECKSUMS_BLOCKS_TOTAL
#define PROGRESS_DATACHECKSUMS_DBS_TOTAL
#define PROGRESS_DATACHECKSUMS_RELS_DONE
void init_ps_display(const char *fixed_part)
static SMgrRelation RelationGetSmgr(Relation rel)
#define RelationGetRelationName(relation)
#define RelationGetNamespace(relation)
const char *const forkNames[]
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
#define ShmemRequestStruct(...)
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation try_relation_open(Oid relationId, LOCKMODE lockmode)
#define BTEqualStrategyNumber
bool process_shared_catalogs
DataChecksumsWorkerResult success
DataChecksumsWorkerOperation launch_operation
DataChecksumsWorkerOperation operation
ShmemRequestCallback request_fn
FullTransactionId nextXid
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, ScanKeyData *key)
static void table_endscan(TableScanDesc scan)
#define XidFromFullTransactionId(x)
static bool TransactionIdPrecedes(TransactionId id1, TransactionId id2)
void vacuum_delay_point(bool is_analyze)
TransamVariablesData * TransamVariables
#define WL_EXIT_ON_PM_DEATH
#define WL_POSTMASTER_DEATH
void StartTransactionCommand(void)
void CommitTransactionCommand(void)
bool RecoveryInProgress(void)
void SetLocalDataChecksumState(uint32 data_checksum_version)
void SetDataChecksumsOff(void)
bool DataChecksumsNeedVerify(void)
void SetDataChecksumsOn(void)
void SetDataChecksumsOnInProgress(void)
bool DataChecksumsInProgressOn(void)
XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std)