From 5cf4bfccbc41594af77f2ee92bf3ae7550497186 Mon Sep 17 00:00:00 2001 From: "arcoalien@qq.com" Date: Sat, 11 Mar 2023 16:48:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=B1=E4=BA=AB=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E4=B8=8B=E6=9E=81=E8=87=B4RTO=E5=9B=9E=E6=94=BEcoredu?= =?UTF-8?q?mp=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ddes/adapter/ss_dms_bufmgr.cpp | 22 ++++++++ .../storage/access/redo/redo_segpage.cpp | 5 ++ .../storage/access/redo/redo_xlogutils.cpp | 54 ++++++++----------- src/gausskernel/storage/smgr/segstore.cpp | 7 --- src/include/ddes/dms/ss_common_attr.h | 1 + src/include/ddes/dms/ss_dms_bufmgr.h | 2 + 6 files changed, 51 insertions(+), 40 deletions(-) diff --git a/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp b/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp index 4f8cf5da8..589179a98 100644 --- a/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp +++ b/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp @@ -31,6 +31,7 @@ #include "securec_check.h" #include "miscadmin.h" #include "access/double_write.h" +#include "access/multi_redo_api.h" void InitDmsBufCtrl(void) { @@ -625,6 +626,10 @@ void SSLockAcquireAll() void SSCheckBufferIfNeedMarkDirty(Buffer buf) { + if (IsExtremeRedo()) { + return; + } + dms_buf_ctrl_t* buf_ctrl = GetDmsBufCtrl(buf - 1); if (buf_ctrl->state & BUF_DIRTY_NEED_FLUSH) { MarkBufferDirty(buf); @@ -857,3 +862,20 @@ bool SSHelpFlushBufferIfNeed(BufferDesc* buf_desc) } return true; } + +void SSMarkBufferDirtyForERTO(RedoBufferInfo* bufferinfo) +{ + if (!ENABLE_DMS || bufferinfo->pageinfo.page == NULL) { + return; + } + + /* For buffer need flush, we need to mark dirty here */ + dms_buf_ctrl_t* buf_ctrl = GetDmsBufCtrl(bufferinfo->buf - 1); + if (buf_ctrl->state & (BUF_DIRTY_NEED_FLUSH | BUF_ERTO_NEED_MARK_DIRTY)) { + if (!IsRedoBufferDirty(bufferinfo)) { + MakeRedoBufferDirty(bufferinfo); + } + } else { + buf_ctrl->state |= BUF_ERTO_NEED_MARK_DIRTY; + } +} diff --git a/src/gausskernel/storage/access/redo/redo_segpage.cpp b/src/gausskernel/storage/access/redo/redo_segpage.cpp index 2bfc1adfe..2add2872b 100644 --- a/src/gausskernel/storage/access/redo/redo_segpage.cpp +++ b/src/gausskernel/storage/access/redo/redo_segpage.cpp @@ -32,6 +32,7 @@ #include "commands/tablespace.h" #include "catalog/storage_xlog.h" #include "storage/smgr/fd.h" +#include "ddes/dms/ss_dms_bufmgr.h" static XLogRecParseState *segpage_redo_parse_seg_truncate_to_block(XLogReaderState *record, uint32 *blocknum) { @@ -455,6 +456,8 @@ void SegPageRedoNewPage(XLogBlockHead *blockhead, XLogBlockSegNewPage *newPageIn void MarkSegPageRedoChildPageDirty(RedoBufferInfo *bufferinfo) { + SSMarkBufferDirtyForERTO(bufferinfo); + BufferDesc *bufDesc = GetBufferDescriptor(bufferinfo->buf - 1); if (bufferinfo->dirtyflag || XLByteLT(bufDesc->extra->lsn_on_disk, PageGetLSN(bufferinfo->pageinfo.page))) { if (IsSegmentPhysicalRelNode(bufferinfo->blockinfo.rnode)) { @@ -487,6 +490,8 @@ void MarkSegPageRedoChildPageDirty(RedoBufferInfo *bufferinfo) } else { UnlockReleaseBuffer(bufferinfo->buf); } + + SSMarkBufferDirtyForERTO(bufferinfo); } void SegPageRedoChildState(XLogRecParseState *childStateList) diff --git a/src/gausskernel/storage/access/redo/redo_xlogutils.cpp b/src/gausskernel/storage/access/redo/redo_xlogutils.cpp index 41bc46b01..01067ecb2 100644 --- a/src/gausskernel/storage/access/redo/redo_xlogutils.cpp +++ b/src/gausskernel/storage/access/redo/redo_xlogutils.cpp @@ -1679,6 +1679,9 @@ void ExtremeRtoFlushBuffer(RedoBufferInfo *bufferinfo, bool updateFsm) if (updateFsm) { freespace = PageGetHeapFreeSpace(bufferinfo->pageinfo.page); } + + SSMarkBufferDirtyForERTO(bufferinfo); + if (ParseStateWithoutCache()) { /* flush the block */ if ((bufferinfo->pageinfo.page != NULL) && bufferinfo->dirtyflag) { @@ -1690,48 +1693,33 @@ void ExtremeRtoFlushBuffer(RedoBufferInfo *bufferinfo, bool updateFsm) if (bufferinfo->pageinfo.page != NULL) { BufferDesc *bufDesc = GetBufferDescriptor(bufferinfo->buf - 1); if (bufferinfo->dirtyflag || XLByteLT(bufDesc->extra->lsn_on_disk, PageGetLSN(bufferinfo->pageinfo.page))) { - if (ENABLE_DMS) { - if ((GetDmsBufCtrl(bufDesc->buf_id)->state & BUF_DIRTY_NEED_FLUSH) && - !bufferinfo->dirtyflag && bufferinfo->blockinfo.forknum == MAIN_FORKNUM) { - const uint32 shiftSz = 32; - ereport(PANIC, (errmsg("[SS] extreme_rto not mark dirty:lsn %X/%X, lsn_disk %X/%X, \ - lsn_page %X/%X, page %u/%u/%u %u", - (uint32)(bufferinfo->lsn >> shiftSz), (uint32)(bufferinfo->lsn), - (uint32)(bufDesc->extra->lsn_on_disk >> shiftSz), - (uint32)(bufDesc->extra->lsn_on_disk), - (uint32)(PageGetLSN(bufferinfo->pageinfo.page) >> shiftSz), - (uint32)(PageGetLSN(bufferinfo->pageinfo.page)), - bufferinfo->blockinfo.rnode.spcNode, bufferinfo->blockinfo.rnode.dbNode, - bufferinfo->blockinfo.rnode.relNode, bufferinfo->blockinfo.blkno))); - } - } else { - MarkBufferDirty(bufferinfo->buf); - if (!bufferinfo->dirtyflag && bufferinfo->blockinfo.forknum == MAIN_FORKNUM) { - int mode = WARNING; + MarkBufferDirty(bufferinfo->buf); + if (!bufferinfo->dirtyflag && bufferinfo->blockinfo.forknum == MAIN_FORKNUM) { + int mode = WARNING; #ifdef USE_ASSERT_CHECKING - mode = PANIC; -#endif - const uint32 shiftSz = 32; - ereport(mode, (errmsg("extreme_rto not mark dirty:lsn %X/%X, lsn_disk %X/%X, \ - lsn_page %X/%X, page %u/%u/%u %u", - (uint32)(bufferinfo->lsn >> shiftSz), (uint32)(bufferinfo->lsn), - (uint32)(bufDesc->extra->lsn_on_disk >> shiftSz), - (uint32)(bufDesc->extra->lsn_on_disk), - (uint32)(PageGetLSN(bufferinfo->pageinfo.page) >> shiftSz), - (uint32)(PageGetLSN(bufferinfo->pageinfo.page)), - bufferinfo->blockinfo.rnode.spcNode, bufferinfo->blockinfo.rnode.dbNode, - bufferinfo->blockinfo.rnode.relNode, bufferinfo->blockinfo.blkno))); - } -#ifdef USE_ASSERT_CHECKING - bufDesc->lsn_dirty = PageGetLSN(bufferinfo->pageinfo.page); + mode = PANIC; #endif + const uint32 shiftSz = 32; + ereport(mode, (errmsg("extreme_rto not mark dirty:lsn %X/%X, lsn_disk %X/%X, \ + lsn_page %X/%X, page %u/%u/%u %u", + (uint32)(bufferinfo->lsn >> shiftSz), (uint32)(bufferinfo->lsn), + (uint32)(bufDesc->extra->lsn_on_disk >> shiftSz), + (uint32)(bufDesc->extra->lsn_on_disk), + (uint32)(PageGetLSN(bufferinfo->pageinfo.page) >> shiftSz), + (uint32)(PageGetLSN(bufferinfo->pageinfo.page)), + bufferinfo->blockinfo.rnode.spcNode, bufferinfo->blockinfo.rnode.dbNode, + bufferinfo->blockinfo.rnode.relNode, bufferinfo->blockinfo.blkno))); } +#ifdef USE_ASSERT_CHECKING + bufDesc->lsn_dirty = PageGetLSN(bufferinfo->pageinfo.page); +#endif } UnlockReleaseBuffer(bufferinfo->buf); /* release buffer */ } } + SSMarkBufferDirtyForERTO(bufferinfo); if (updateFsm) { UpdateFsm(&bufferinfo->blockinfo, freespace); } diff --git a/src/gausskernel/storage/smgr/segstore.cpp b/src/gausskernel/storage/smgr/segstore.cpp index 3f9102db4..b857872e3 100755 --- a/src/gausskernel/storage/smgr/segstore.cpp +++ b/src/gausskernel/storage/smgr/segstore.cpp @@ -1482,13 +1482,6 @@ void seg_extend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, cha XLogRecPtr xlog_rec = XLogInsert(RM_SEGPAGE_ID, XLOG_SEG_SEGMENT_EXTEND, SegmentBktId); END_CRIT_SECTION(); -#ifdef USE_ASSERT_CHECKING - if (ENABLE_DMS) { - SegNetPageCheckDiskLSN(GetBufferDescriptor(seg_buffer - 1), RBM_NORMAL, NULL); - SmgrNetPageCheckDiskLSN(buf_desc, RBM_NORMAL, NULL); - } -#endif - PageSetLSN(BufferGetPage(seg_buffer), xlog_rec); PageSetLSN(buffer, xlog_rec); } diff --git a/src/include/ddes/dms/ss_common_attr.h b/src/include/ddes/dms/ss_common_attr.h index 0e2a51712..48173cb10 100644 --- a/src/include/ddes/dms/ss_common_attr.h +++ b/src/include/ddes/dms/ss_common_attr.h @@ -105,6 +105,7 @@ #define BUF_IS_RELPERSISTENT_TEMP 0x40 #define BUF_READ_MODE_ZERO_LOCK 0x80 #define BUF_DIRTY_NEED_FLUSH 0x100 +#define BUF_ERTO_NEED_MARK_DIRTY 0x200 #define SS_BROADCAST_FAILED_RETRYCOUNTS 4 #define SS_BROADCAST_WAIT_INFINITE (0xFFFFFFFF) diff --git a/src/include/ddes/dms/ss_dms_bufmgr.h b/src/include/ddes/dms/ss_dms_bufmgr.h index c7ee46116..588ca4846 100644 --- a/src/include/ddes/dms/ss_dms_bufmgr.h +++ b/src/include/ddes/dms/ss_dms_bufmgr.h @@ -26,6 +26,7 @@ #include "ddes/dms/ss_common_attr.h" #include "ddes/dms/ss_dms.h" #include "storage/buf/buf_internals.h" +#include "access/xlogproc.h" #define GetDmsBufCtrl(id) (&t_thrd.storage_cxt.dmsBufCtl[(id)]) @@ -78,5 +79,6 @@ bool SSPageCheckIfCanEliminate(BufferDesc* buf_desc); bool SSSegRead(SMgrRelation reln, ForkNumber forknum, char *buffer); bool DmsCheckBufAccessible(); bool SSHelpFlushBufferIfNeed(BufferDesc* buf_desc); +void SSMarkBufferDirtyForERTO(RedoBufferInfo* bufferinfo); #endif