diff --git a/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp b/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp index 830180483..a86c2048c 100644 --- a/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp +++ b/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp @@ -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; } diff --git a/src/gausskernel/ddes/adapter/ss_dms_callback.cpp b/src/gausskernel/ddes/adapter/ss_dms_callback.cpp index da23734dc..920893e2b 100644 --- a/src/gausskernel/ddes/adapter/ss_dms_callback.cpp +++ b/src/gausskernel/ddes/adapter/ss_dms_callback.cpp @@ -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;; diff --git a/src/include/ddes/dms/ss_common_attr.h b/src/include/ddes/dms/ss_common_attr.h index fd58fb8ce..17963c08c 100644 --- a/src/include/ddes/dms/ss_common_attr.h +++ b/src/include/ddes/dms/ss_common_attr.h @@ -195,6 +195,7 @@ typedef enum SSOndemandRequestRedoStatus { ONDEMAND_REDO_DONE = 0, ONDEMAND_REDO_SKIP, ONDEMAND_REDO_FAIL, + ONDEMAND_REDO_ERROR, ONDEMAND_REDO_TIMEOUT } SSOndemandRequestRedoStatus;