From 2c54c673949640a9920be779e15992108428233d Mon Sep 17 00:00:00 2001 From: dongning12 Date: Thu, 16 Feb 2023 20:54:45 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=85=B1=E4=BA=AB=E5=AD=98=E5=82=A8]=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=A1=B5=E9=9D=A2=E5=8F=AF=E8=AE=BF=E9=97=AE=E6=80=A7?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=EF=BC=8C1=E9=81=BF=E5=85=8D=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E7=BA=BF=E7=A8=8B=E8=8E=B7=E5=8F=96=E5=88=B0=E4=B8=AD?= =?UTF-8?q?=E9=97=B4=E7=89=88=E6=9C=AC=E9=A1=B5=E9=9D=A2=202=EF=BC=89?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E5=A4=A7=E9=87=8F=E6=97=A0=E6=95=88=E8=AF=B7?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ddes/adapter/ss_dms_bufmgr.cpp | 40 ++++++++++++---- src/gausskernel/storage/buffer/bufmgr.cpp | 46 +++++++++++-------- src/include/ddes/dms/ss_dms_bufmgr.h | 7 +-- 3 files changed, 62 insertions(+), 31 deletions(-) diff --git a/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp b/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp index 7d4a4c9bb..e65f1665b 100644 --- a/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp +++ b/src/gausskernel/ddes/adapter/ss_dms_bufmgr.cpp @@ -62,13 +62,7 @@ void InitDmsContext(dms_context_t *dmsContext) dmsContext->inst_id = (unsigned int)SS_MY_INST_ID; dmsContext->sess_id = (unsigned int)(t_thrd.proc ? t_thrd.proc->logictid : t_thrd.myLogicTid + TotalProcs); dmsContext->db_handle = t_thrd.proc; - if (AmDmsReformProcProcess()) { - dmsContext->sess_type = DMS_SESSION_REFORM; - } else if (AmPageRedoProcess() || AmStartupProcess()) { - dmsContext->sess_type = DMS_SESSION_RECOVER; - } else { - dmsContext->sess_type = DMS_SESSION_NORMAL; - } + dmsContext->sess_type = DMSGetProcType4RequestPage(); dmsContext->is_try = 0; } @@ -406,7 +400,7 @@ Buffer TerminateReadSegPage(BufferDesc *buf_desc, ReadBufferMode read_mode, SegS return buffer; } -Buffer DmsReadSegPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode) +Buffer DmsReadSegPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode, bool* with_io) { BufferDesc *buf_desc = GetBufferDescriptor(buffer - 1); dms_buf_ctrl_t *buf_ctrl = GetDmsBufCtrl(buf_desc->buf_id); @@ -415,7 +409,16 @@ Buffer DmsReadSegPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode) return buffer; } + if (!DmsCheckBufAccessible()) { + *with_io = false; + return 0; + } + if (!DmsStartBufferIO(buf_desc, mode)) { + if (!DmsCheckBufAccessible()) { + *with_io = false; + return 0; + } return buffer; } @@ -425,7 +428,7 @@ Buffer DmsReadSegPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode) return TerminateReadSegPage(buf_desc, read_mode); } -Buffer DmsReadPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode) +Buffer DmsReadPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode, bool* with_io) { BufferDesc *buf_desc = GetBufferDescriptor(buffer - 1); dms_buf_ctrl_t *buf_ctrl = GetDmsBufCtrl(buf_desc->buf_id); @@ -443,7 +446,16 @@ Buffer DmsReadPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode) pblk.lsn = buf_ctrl->pblk_lsn; } + if (!DmsCheckBufAccessible()) { + *with_io = false; + return 0; + } + if (!DmsStartBufferIO(buf_desc, mode)) { + if (!DmsCheckBufAccessible()) { + *with_io = false; + return 0; + } return buffer; } @@ -673,7 +685,7 @@ void CheckPageNeedSkipInRecovery(Buffer buf) Assert(!skip); } -unsigned int DMSGetProcType4RequestPage() +dms_session_e DMSGetProcType4RequestPage() { // proc type used in DMS request page if (AmDmsReformProcProcess() || AmPageRedoProcess() || AmStartupProcess()) { @@ -745,3 +757,11 @@ bool SSSegRead(SMgrRelation reln, ForkNumber forknum, char *buffer) return ret; } + +bool DmsCheckBufAccessible() +{ + if (dms_drc_accessible((uint8)DRC_RES_PAGE_TYPE) || DMSGetProcType4RequestPage() == DMS_SESSION_RECOVER) { + return true; + } + return false; +} diff --git a/src/gausskernel/storage/buffer/bufmgr.cpp b/src/gausskernel/storage/buffer/bufmgr.cpp index f41e18bba..c62b256e8 100644 --- a/src/gausskernel/storage/buffer/bufmgr.cpp +++ b/src/gausskernel/storage/buffer/bufmgr.cpp @@ -5891,20 +5891,24 @@ retry: read_mode = RBM_ZERO_AND_LOCK; GetDmsBufCtrl(buffer - 1)->state &= ~BUF_READ_MODE_ZERO_LOCK; } + bool with_io_in_progress = true; if (IsSegmentBufferID(buf->buf_id)) { - tmp_buffer = DmsReadSegPage(buffer, lock_mode, read_mode); + tmp_buffer = DmsReadSegPage(buffer, lock_mode, read_mode, &with_io_in_progress); } else { - tmp_buffer = DmsReadPage(buffer, lock_mode, read_mode); + tmp_buffer = DmsReadPage(buffer, lock_mode, read_mode, &with_io_in_progress); } if (tmp_buffer == 0) { /* failed to request newest page, release related locks, and retry */ - if (IsSegmentBufferID(buf->buf_id)) { - SegTerminateBufferIO((BufferDesc *)buf, false, 0); - } else { - TerminateBufferIO(buf, false, 0); + if (with_io_in_progress) { + if (IsSegmentBufferID(buf->buf_id)) { + SegTerminateBufferIO((BufferDesc *)buf, false, 0); + } else { + TerminateBufferIO(buf, false, 0); + } } + LWLockRelease(buf->content_lock); pg_usleep(5000L); @@ -5947,18 +5951,21 @@ bool TryLockBuffer(Buffer buffer, int mode, bool must_wait) if (ENABLE_DMS && ret) { LWLockMode lock_mode = (mode == BUFFER_LOCK_SHARE) ? LW_SHARED : LW_EXCLUSIVE; Buffer tmp_buffer; + bool with_io_in_progress = true; if (IsSegmentBufferID(buf->buf_id)) { - tmp_buffer = DmsReadSegPage(buffer, lock_mode, RBM_NORMAL); + tmp_buffer = DmsReadSegPage(buffer, lock_mode, RBM_NORMAL, &with_io_in_progress); } else { - tmp_buffer = DmsReadPage(buffer, lock_mode, RBM_NORMAL); + tmp_buffer = DmsReadPage(buffer, lock_mode, RBM_NORMAL, &with_io_in_progress); } if (tmp_buffer == 0) { /* failed to request newest page, release related locks, and retry */ - if (IsSegmentBufferID(buf->buf_id)) { - SegTerminateBufferIO((BufferDesc *)buf, false, 0); - } else { - TerminateBufferIO(buf, false, 0); + if (with_io_in_progress) { + if (IsSegmentBufferID(buf->buf_id)) { + SegTerminateBufferIO((BufferDesc *)buf, false, 0); + } else { + TerminateBufferIO(buf, false, 0); + } } LWLockRelease(buf->content_lock); ret = false; @@ -5989,18 +5996,21 @@ retry: if (ENABLE_DMS && ret) { Buffer tmp_buffer; + bool with_io_in_progress = true; if (IsSegmentBufferID(buf->buf_id)) { - tmp_buffer = DmsReadSegPage(buffer, LW_EXCLUSIVE, RBM_NORMAL); + tmp_buffer = DmsReadSegPage(buffer, LW_EXCLUSIVE, RBM_NORMAL, &with_io_in_progress); } else { - tmp_buffer = DmsReadPage(buffer, LW_EXCLUSIVE, RBM_NORMAL); + tmp_buffer = DmsReadPage(buffer, LW_EXCLUSIVE, RBM_NORMAL, &with_io_in_progress); } /* failed to request newest page, release related locks, and retry */ if (tmp_buffer == 0) { - if (IsSegmentBufferID(buf->buf_id)) { - SegTerminateBufferIO((BufferDesc *)buf, false, 0); - } else { - TerminateBufferIO(buf, false, 0); + if (with_io_in_progress) { + if (IsSegmentBufferID(buf->buf_id)) { + SegTerminateBufferIO((BufferDesc *)buf, false, 0); + } else { + TerminateBufferIO(buf, false, 0); + } } LWLockRelease(buf->content_lock); diff --git a/src/include/ddes/dms/ss_dms_bufmgr.h b/src/include/ddes/dms/ss_dms_bufmgr.h index c7c063150..1d6e06f41 100644 --- a/src/include/ddes/dms/ss_dms_bufmgr.h +++ b/src/include/ddes/dms/ss_dms_bufmgr.h @@ -56,8 +56,8 @@ bool StartReadPage(BufferDesc *buf_desc, LWLockMode mode); void ClearReadHint(int buf_id, bool buf_deleted = false); Buffer TerminateReadPage(BufferDesc* buf_desc, ReadBufferMode read_mode, const XLogPhyBlock *pblk); Buffer TerminateReadSegPage(BufferDesc *buf_desc, ReadBufferMode read_mode, SegSpace *spc = NULL); -Buffer DmsReadPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode); -Buffer DmsReadSegPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode); +Buffer DmsReadPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode, bool *with_io); +Buffer DmsReadSegPage(Buffer buffer, LWLockMode mode, ReadBufferMode read_mode, bool *with_io); bool DmsReleaseOwner(BufferTag buf_tag, int buf_id); int32 CheckBuf4Rebuild(BufferDesc* buf_desc); int SSLockAcquire(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock, bool dontWait, @@ -72,9 +72,10 @@ void TransformLockTagToDmsLatch(dms_drlatch_t* dlatch, const LOCKTAG locktag); void CheckPageNeedSkipInRecovery(Buffer buf); void SmgrNetPageCheckDiskLSN(BufferDesc* buf_desc, ReadBufferMode read_mode, const XLogPhyBlock *pblk); void SegNetPageCheckDiskLSN(BufferDesc* buf_desc, ReadBufferMode read_mode, SegSpace *spc); -unsigned int DMSGetProcType4RequestPage(); +dms_session_e DMSGetProcType4RequestPage(); void BufValidateDrc(BufferDesc *buf_desc); bool SSPageCheckIfCanEliminate(BufferDesc* buf_desc); bool SSSegRead(SMgrRelation reln, ForkNumber forknum, char *buffer); +bool DmsCheckBufAccessible(); #endif