mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-03-07 19:47:50 +08:00
Remove rm_safe_restartpoint machinery.
It is no longer used, none of the resource managers have multi-record actions that would make it unsafe to perform a restartpoint. Also don't allow rm_cleanup to write WAL records, it's also no longer required. Move the call to rm_cleanup routines to make it more symmetric with rm_startup.
This commit is contained in:
parent
1d3b258cbe
commit
59a5ab3f42
@ -25,8 +25,8 @@
|
||||
#include "utils/relmapper.h"
|
||||
|
||||
/* must be kept in sync with RmgrData definition in xlog_internal.h */
|
||||
#define PG_RMGR(symname,name,redo,desc,startup,cleanup,restartpoint) \
|
||||
{ name, redo, desc, startup, cleanup, restartpoint },
|
||||
#define PG_RMGR(symname,name,redo,desc,startup,cleanup) \
|
||||
{ name, redo, desc, startup, cleanup },
|
||||
|
||||
const RmgrData RmgrTable[RM_MAX_ID + 1] = {
|
||||
#include "access/rmgrlist.h"
|
||||
|
@ -7143,6 +7143,13 @@ StartupXLOG(void)
|
||||
recoveryPausesHere();
|
||||
}
|
||||
|
||||
/* Allow resource managers to do any required cleanup. */
|
||||
for (rmid = 0; rmid <= RM_MAX_ID; rmid++)
|
||||
{
|
||||
if (RmgrTable[rmid].rm_cleanup != NULL)
|
||||
RmgrTable[rmid].rm_cleanup();
|
||||
}
|
||||
|
||||
ereport(LOG,
|
||||
(errmsg("redo done at %X/%X",
|
||||
(uint32) (ReadRecPtr >> 32), (uint32) ReadRecPtr)));
|
||||
@ -7368,27 +7375,6 @@ StartupXLOG(void)
|
||||
|
||||
if (InRecovery)
|
||||
{
|
||||
int rmid;
|
||||
|
||||
/*
|
||||
* Resource managers might need to write WAL records, eg, to record
|
||||
* index cleanup actions. So temporarily enable XLogInsertAllowed in
|
||||
* this process only.
|
||||
*/
|
||||
LocalSetXLogInsertAllowed();
|
||||
|
||||
/*
|
||||
* Allow resource managers to do any required cleanup.
|
||||
*/
|
||||
for (rmid = 0; rmid <= RM_MAX_ID; rmid++)
|
||||
{
|
||||
if (RmgrTable[rmid].rm_cleanup != NULL)
|
||||
RmgrTable[rmid].rm_cleanup();
|
||||
}
|
||||
|
||||
/* Disallow XLogInsert again */
|
||||
LocalXLogInsertAllowed = -1;
|
||||
|
||||
/*
|
||||
* Perform a checkpoint to update all our recovery activity to disk.
|
||||
*
|
||||
@ -8750,31 +8736,9 @@ CheckPointGuts(XLogRecPtr checkPointRedo, int flags)
|
||||
static void
|
||||
RecoveryRestartPoint(const CheckPoint *checkPoint)
|
||||
{
|
||||
int rmid;
|
||||
|
||||
/* use volatile pointer to prevent code rearrangement */
|
||||
volatile XLogCtlData *xlogctl = XLogCtl;
|
||||
|
||||
/*
|
||||
* Is it safe to restartpoint? We must ask each of the resource managers
|
||||
* whether they have any partial state information that might prevent a
|
||||
* correct restart from this point. If so, we skip this opportunity, but
|
||||
* return at the next checkpoint record for another try.
|
||||
*/
|
||||
for (rmid = 0; rmid <= RM_MAX_ID; rmid++)
|
||||
{
|
||||
if (RmgrTable[rmid].rm_safe_restartpoint != NULL)
|
||||
if (!(RmgrTable[rmid].rm_safe_restartpoint()))
|
||||
{
|
||||
elog(trace_recovery(DEBUG2),
|
||||
"RM %d not safe to record restart point at %X/%X",
|
||||
rmid,
|
||||
(uint32) (checkPoint->redo >> 32),
|
||||
(uint32) checkPoint->redo);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Also refrain from creating a restartpoint if we have seen any
|
||||
* references to non-existent pages. Restarting recovery from the
|
||||
|
@ -19,7 +19,7 @@ typedef uint8 RmgrId;
|
||||
* Note: RM_MAX_ID must fit in RmgrId; widening that type will affect the XLOG
|
||||
* file format.
|
||||
*/
|
||||
#define PG_RMGR(symname,name,redo,desc,startup,cleanup,restartpoint) \
|
||||
#define PG_RMGR(symname,name,redo,desc,startup,cleanup) \
|
||||
symname,
|
||||
|
||||
typedef enum RmgrIds
|
||||
|
@ -24,21 +24,21 @@
|
||||
* Changes to this list possibly need a XLOG_PAGE_MAGIC bump.
|
||||
*/
|
||||
|
||||
/* symbol name, textual name, redo, desc, startup, cleanup, restartpoint */
|
||||
PG_RMGR(RM_XLOG_ID, "XLOG", xlog_redo, xlog_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_XACT_ID, "Transaction", xact_redo, xact_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_SMGR_ID, "Storage", smgr_redo, smgr_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_CLOG_ID, "CLOG", clog_redo, clog_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_DBASE_ID, "Database", dbase_redo, dbase_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_TBLSPC_ID, "Tablespace", tblspc_redo, tblspc_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_MULTIXACT_ID, "MultiXact", multixact_redo, multixact_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_RELMAP_ID, "RelMap", relmap_redo, relmap_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_STANDBY_ID, "Standby", standby_redo, standby_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_HEAP2_ID, "Heap2", heap2_redo, heap2_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_HEAP_ID, "Heap", heap_redo, heap_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_BTREE_ID, "Btree", btree_redo, btree_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_HASH_ID, "Hash", hash_redo, hash_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_GIN_ID, "Gin", gin_redo, gin_desc, gin_xlog_startup, gin_xlog_cleanup, NULL)
|
||||
PG_RMGR(RM_GIST_ID, "Gist", gist_redo, gist_desc, gist_xlog_startup, gist_xlog_cleanup, NULL)
|
||||
PG_RMGR(RM_SEQ_ID, "Sequence", seq_redo, seq_desc, NULL, NULL, NULL)
|
||||
PG_RMGR(RM_SPGIST_ID, "SPGist", spg_redo, spg_desc, spg_xlog_startup, spg_xlog_cleanup, NULL)
|
||||
/* symbol name, textual name, redo, desc, startup, cleanup */
|
||||
PG_RMGR(RM_XLOG_ID, "XLOG", xlog_redo, xlog_desc, NULL, NULL)
|
||||
PG_RMGR(RM_XACT_ID, "Transaction", xact_redo, xact_desc, NULL, NULL)
|
||||
PG_RMGR(RM_SMGR_ID, "Storage", smgr_redo, smgr_desc, NULL, NULL)
|
||||
PG_RMGR(RM_CLOG_ID, "CLOG", clog_redo, clog_desc, NULL, NULL)
|
||||
PG_RMGR(RM_DBASE_ID, "Database", dbase_redo, dbase_desc, NULL, NULL)
|
||||
PG_RMGR(RM_TBLSPC_ID, "Tablespace", tblspc_redo, tblspc_desc, NULL, NULL)
|
||||
PG_RMGR(RM_MULTIXACT_ID, "MultiXact", multixact_redo, multixact_desc, NULL, NULL)
|
||||
PG_RMGR(RM_RELMAP_ID, "RelMap", relmap_redo, relmap_desc, NULL, NULL)
|
||||
PG_RMGR(RM_STANDBY_ID, "Standby", standby_redo, standby_desc, NULL, NULL)
|
||||
PG_RMGR(RM_HEAP2_ID, "Heap2", heap2_redo, heap2_desc, NULL, NULL)
|
||||
PG_RMGR(RM_HEAP_ID, "Heap", heap_redo, heap_desc, NULL, NULL)
|
||||
PG_RMGR(RM_BTREE_ID, "Btree", btree_redo, btree_desc, NULL, NULL)
|
||||
PG_RMGR(RM_HASH_ID, "Hash", hash_redo, hash_desc, NULL, NULL)
|
||||
PG_RMGR(RM_GIN_ID, "Gin", gin_redo, gin_desc, gin_xlog_startup, gin_xlog_cleanup)
|
||||
PG_RMGR(RM_GIST_ID, "Gist", gist_redo, gist_desc, gist_xlog_startup, gist_xlog_cleanup)
|
||||
PG_RMGR(RM_SEQ_ID, "Sequence", seq_redo, seq_desc, NULL, NULL)
|
||||
PG_RMGR(RM_SPGIST_ID, "SPGist", spg_redo, spg_desc, spg_xlog_startup, spg_xlog_cleanup)
|
||||
|
@ -248,7 +248,6 @@ typedef struct RmgrData
|
||||
void (*rm_desc) (StringInfo buf, uint8 xl_info, char *rec);
|
||||
void (*rm_startup) (void);
|
||||
void (*rm_cleanup) (void);
|
||||
bool (*rm_safe_restartpoint) (void);
|
||||
} RmgrData;
|
||||
|
||||
extern const RmgrData RmgrTable[];
|
||||
|
Loading…
Reference in New Issue
Block a user