@ -589,30 +589,43 @@ bool SSOndemandRequestPrimaryRedo(BufferTag tag)
|
||||
}
|
||||
|
||||
ereport(DEBUG1,
|
||||
(errmodule(MOD_DMS),
|
||||
errmsg("[On-demand] start request primary node redo page, spc/db/rel/bucket fork-block: %u/%u/%u/%d %d-%u",
|
||||
tag.rnode.spcNode, tag.rnode.dbNode, tag.rnode.relNode, tag.rnode.bucketNode, tag.forkNum,
|
||||
tag.blockNum)));
|
||||
(errmsg("[On-demand] Start request primary node redo page, spc/db/rel/bucket "
|
||||
"fork-block: %u/%u/%u/%d %d-%u", tag.rnode.spcNode, tag.rnode.dbNode,
|
||||
tag.rnode.relNode, tag.rnode.bucketNode, tag.forkNum, tag.blockNum)));
|
||||
InitDmsContext(&dms_ctx);
|
||||
dms_ctx.xmap_ctx.dest_id = (unsigned int)SS_PRIMARY_ID;
|
||||
if (dms_reform_req_opengauss_ondemand_redo_buffer(&dms_ctx, &tag,
|
||||
(unsigned int)sizeof(BufferTag), &redo_status) != DMS_SUCCESS) {
|
||||
SSReadControlFile(REFORM_CTRL_PAGE);
|
||||
ereport(LOG,
|
||||
(errmodule(MOD_DMS),
|
||||
errmsg("[On-demand] request primary node redo page failed, page id [%d/%d/%d/%d/%d %d-%d], "
|
||||
"redo status %d", tag.rnode.spcNode, tag.rnode.dbNode, tag.rnode.relNode, (int)tag.rnode.bucketNode,
|
||||
(int)tag.rnode.opt, tag.forkNum, tag.blockNum, redo_status)));
|
||||
(errmsg("[On-demand] Request primary node redo page timeout, spc/db/rel/bucket "
|
||||
"fork-block: %u/%u/%u/%d %d-%u", tag.rnode.spcNode, tag.rnode.dbNode,
|
||||
tag.rnode.relNode, tag.rnode.bucketNode, tag.forkNum, tag.blockNum)));
|
||||
return false;
|
||||
}
|
||||
ereport(DEBUG1,
|
||||
(errmodule(MOD_DMS),
|
||||
errmsg("[On-demand] end request primary node redo page, spc/db/rel/bucket fork-block: %u/%u/%u/%d %d-%u, "
|
||||
"redo status %d", tag.rnode.spcNode, tag.rnode.dbNode, tag.rnode.relNode, tag.rnode.bucketNode,
|
||||
tag.forkNum, tag.blockNum, redo_status)));
|
||||
|
||||
if (redo_status != ONDEMAND_REDO_DONE) {
|
||||
if (redo_status == ONDEMAND_REDO_DONE) {
|
||||
ereport(DEBUG1,
|
||||
(errmsg("[On-demand] Request primary node redo page done, spc/db/rel/bucket "
|
||||
"fork-block: %u/%u/%u/%d %d-%u", tag.rnode.spcNode, tag.rnode.dbNode,
|
||||
tag.rnode.relNode, tag.rnode.bucketNode, tag.forkNum, tag.blockNum)));
|
||||
} else if (redo_status == ONDEMAND_REDO_SKIP) {
|
||||
ereport(DEBUG1,
|
||||
(errmsg("[On-demand] Primary node is not in ondemand recovery now and "
|
||||
"ignore this redo request, so refresh reform control file")));
|
||||
SSReadControlFile(REFORM_CTRL_PAGE);
|
||||
} else if (redo_status == ONDEMAND_REDO_ERROR) {
|
||||
ereport(PANIC,
|
||||
(errmsg("[On-demand] Error happend in request primary node redo page, read buffer crash, "
|
||||
"spc/db/rel/bucket fork-block: %u/%u/%u/%d %d-%u", tag.rnode.spcNode, tag.rnode.dbNode,
|
||||
tag.rnode.relNode, tag.rnode.bucketNode, tag.forkNum, tag.blockNum)));
|
||||
return false;
|
||||
} else if (redo_status == ONDEMAND_REDO_FAIL) {
|
||||
ereport(WARNING,
|
||||
(errmsg("[On-demand] Error happend in request primary node redo page, buffer is invalid, "
|
||||
"spc/db/rel/bucket fork-block: %u/%u/%u/%d %d-%u", tag.rnode.spcNode, tag.rnode.dbNode,
|
||||
tag.rnode.relNode, tag.rnode.bucketNode, tag.forkNum, tag.blockNum)));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2129,40 +2129,43 @@ int CBOndemandRedoPageForStandby(void *block_key, int32 *redo_status)
|
||||
Assert(SS_PRIMARY_MODE);
|
||||
// do nothing if not in ondemand recovery
|
||||
if (!SS_IN_ONDEMAND_RECOVERY) {
|
||||
ereport(DEBUG1, (errmsg("[On-demand] ignore redo page request, spc/db/rel/bucket "
|
||||
ereport(DEBUG1, (errmsg("[On-demand] Ignore standby redo page request, spc/db/rel/bucket "
|
||||
"fork-block: %u/%u/%u/%d %d-%u", tag->rnode.spcNode, tag->rnode.dbNode,
|
||||
tag->rnode.relNode, tag->rnode.bucketNode, tag->forkNum, tag->blockNum)));
|
||||
*redo_status = ONDEMAND_REDO_SKIP;
|
||||
return GS_SUCCESS;;
|
||||
}
|
||||
|
||||
Buffer buffer;
|
||||
Buffer buffer = InvalidBuffer;
|
||||
uint32 saveInterruptHoldoffCount = t_thrd.int_cxt.InterruptHoldoffCount;
|
||||
*redo_status = ONDEMAND_REDO_DONE;
|
||||
smgrcloseall();
|
||||
PG_TRY();
|
||||
{
|
||||
buffer = SSReadBuffer(tag, RBM_NORMAL);
|
||||
ReleaseBuffer(buffer);
|
||||
if (BufferIsInvalid(buffer)) {
|
||||
*redo_status = ONDEMAND_REDO_FAIL;
|
||||
} else {
|
||||
ReleaseBuffer(buffer);
|
||||
}
|
||||
}
|
||||
PG_CATCH();
|
||||
{
|
||||
t_thrd.int_cxt.InterruptHoldoffCount = saveInterruptHoldoffCount;
|
||||
/* Save error info */
|
||||
ErrorData* edata = CopyErrorData();
|
||||
ereport(WARNING,
|
||||
(errmsg("[On-demand] Error happend when primary redo page for standby, spc/db/rel/bucket "
|
||||
"fork-block: %u/%u/%u/%d %d-%u", tag->rnode.spcNode, tag->rnode.dbNode,
|
||||
tag->rnode.relNode, tag->rnode.bucketNode, tag->forkNum, tag->blockNum),
|
||||
errdetail("%s", edata->detail)));
|
||||
FlushErrorState();
|
||||
FreeErrorData(edata);
|
||||
ereport(PANIC, (errmsg("[On-demand] Error happend when primary redo page for standby, spc/db/rel/bucket "
|
||||
"fork-block: %u/%u/%u/%d %d-%u", tag->rnode.spcNode, tag->rnode.dbNode, tag->rnode.relNode,
|
||||
tag->rnode.bucketNode, tag->forkNum, tag->blockNum)));
|
||||
*redo_status = ONDEMAND_REDO_ERROR;
|
||||
}
|
||||
PG_END_TRY();
|
||||
|
||||
if (BufferIsInvalid(buffer)) {
|
||||
*redo_status = ONDEMAND_REDO_FAIL;
|
||||
}
|
||||
|
||||
ereport(DEBUG1, (errmsg("[On-demand] redo page for standby done, spc/db/rel/bucket fork-block: %u/%u/%u/%d %d-%u, "
|
||||
ereport(DEBUG1, (errmsg("[On-demand] Redo page for standby done, spc/db/rel/bucket fork-block: %u/%u/%u/%d %d-%u, "
|
||||
"redo status: %d", tag->rnode.spcNode, tag->rnode.dbNode, tag->rnode.relNode,
|
||||
tag->rnode.bucketNode, tag->forkNum, tag->blockNum, *redo_status)));
|
||||
return GS_SUCCESS;;
|
||||
|
@ -195,6 +195,7 @@ typedef enum SSOndemandRequestRedoStatus {
|
||||
ONDEMAND_REDO_DONE = 0,
|
||||
ONDEMAND_REDO_SKIP,
|
||||
ONDEMAND_REDO_FAIL,
|
||||
ONDEMAND_REDO_ERROR,
|
||||
ONDEMAND_REDO_TIMEOUT
|
||||
} SSOndemandRequestRedoStatus;
|
||||
|
||||
|
Reference in New Issue
Block a user