mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03: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"
|
#include "utils/relmapper.h"
|
||||||
|
|
||||||
/* must be kept in sync with RmgrData definition in xlog_internal.h */
|
/* must be kept in sync with RmgrData definition in xlog_internal.h */
|
||||||
#define PG_RMGR(symname,name,redo,desc,startup,cleanup,restartpoint) \
|
#define PG_RMGR(symname,name,redo,desc,startup,cleanup) \
|
||||||
{ name, redo, desc, startup, cleanup, restartpoint },
|
{ name, redo, desc, startup, cleanup },
|
||||||
|
|
||||||
const RmgrData RmgrTable[RM_MAX_ID + 1] = {
|
const RmgrData RmgrTable[RM_MAX_ID + 1] = {
|
||||||
#include "access/rmgrlist.h"
|
#include "access/rmgrlist.h"
|
||||||
|
@ -7143,6 +7143,13 @@ StartupXLOG(void)
|
|||||||
recoveryPausesHere();
|
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,
|
ereport(LOG,
|
||||||
(errmsg("redo done at %X/%X",
|
(errmsg("redo done at %X/%X",
|
||||||
(uint32) (ReadRecPtr >> 32), (uint32) ReadRecPtr)));
|
(uint32) (ReadRecPtr >> 32), (uint32) ReadRecPtr)));
|
||||||
@ -7368,27 +7375,6 @@ StartupXLOG(void)
|
|||||||
|
|
||||||
if (InRecovery)
|
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.
|
* Perform a checkpoint to update all our recovery activity to disk.
|
||||||
*
|
*
|
||||||
@ -8750,31 +8736,9 @@ CheckPointGuts(XLogRecPtr checkPointRedo, int flags)
|
|||||||
static void
|
static void
|
||||||
RecoveryRestartPoint(const CheckPoint *checkPoint)
|
RecoveryRestartPoint(const CheckPoint *checkPoint)
|
||||||
{
|
{
|
||||||
int rmid;
|
|
||||||
|
|
||||||
/* use volatile pointer to prevent code rearrangement */
|
/* use volatile pointer to prevent code rearrangement */
|
||||||
volatile XLogCtlData *xlogctl = XLogCtl;
|
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
|
* Also refrain from creating a restartpoint if we have seen any
|
||||||
* references to non-existent pages. Restarting recovery from the
|
* 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
|
* Note: RM_MAX_ID must fit in RmgrId; widening that type will affect the XLOG
|
||||||
* file format.
|
* file format.
|
||||||
*/
|
*/
|
||||||
#define PG_RMGR(symname,name,redo,desc,startup,cleanup,restartpoint) \
|
#define PG_RMGR(symname,name,redo,desc,startup,cleanup) \
|
||||||
symname,
|
symname,
|
||||||
|
|
||||||
typedef enum RmgrIds
|
typedef enum RmgrIds
|
||||||
|
@ -24,21 +24,21 @@
|
|||||||
* Changes to this list possibly need a XLOG_PAGE_MAGIC bump.
|
* Changes to this list possibly need a XLOG_PAGE_MAGIC bump.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* symbol name, textual name, redo, desc, startup, cleanup, restartpoint */
|
/* symbol name, textual name, redo, desc, startup, cleanup */
|
||||||
PG_RMGR(RM_XLOG_ID, "XLOG", xlog_redo, xlog_desc, NULL, NULL, NULL)
|
PG_RMGR(RM_XLOG_ID, "XLOG", xlog_redo, xlog_desc, NULL, NULL)
|
||||||
PG_RMGR(RM_XACT_ID, "Transaction", xact_redo, xact_desc, NULL, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, NULL)
|
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, NULL)
|
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, 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_desc) (StringInfo buf, uint8 xl_info, char *rec);
|
||||||
void (*rm_startup) (void);
|
void (*rm_startup) (void);
|
||||||
void (*rm_cleanup) (void);
|
void (*rm_cleanup) (void);
|
||||||
bool (*rm_safe_restartpoint) (void);
|
|
||||||
} RmgrData;
|
} RmgrData;
|
||||||
|
|
||||||
extern const RmgrData RmgrTable[];
|
extern const RmgrData RmgrTable[];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user