From 66c2ca3481ed4ec48a4e27c69fb427efbfba2b27 Mon Sep 17 00:00:00 2001 From: "arcoalien@qq.com" Date: Fri, 13 Jan 2023 10:35:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dinvalid=20shared=20copy?= =?UTF-8?q?=E5=92=8C=E8=8E=B7=E5=8F=96=E9=A1=B5=E9=9D=A2=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E6=97=B6,=20=E5=BD=93IO=E6=9C=AA=E5=AE=8C=E6=88=90=E6=97=B6,?= =?UTF-8?q?=20invalid=E5=8F=AF=E8=83=BD=E5=AF=BC=E8=87=B4=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=AE=9E=E9=99=85=E4=B8=BA=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ddes/adapter/ss_dms_callback.cpp | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/gausskernel/ddes/adapter/ss_dms_callback.cpp b/src/gausskernel/ddes/adapter/ss_dms_callback.cpp index b360dd95b..01a06a423 100644 --- a/src/gausskernel/ddes/adapter/ss_dms_callback.cpp +++ b/src/gausskernel/ddes/adapter/ss_dms_callback.cpp @@ -600,13 +600,10 @@ static char* CBGetPage(dms_buf_ctrl_t *buf_ctrl) static int CBInvalidatePage(void *db_handle, char pageid[DMS_PAGEID_SIZE], unsigned int ver) { - bool valid = false; - int buf_id; + int buf_id = -1; BufferTag* tag = (BufferTag *)pageid; uint32 hash; LWLock *partition_lock = NULL; - BufferDesc *buf_desc = NULL; - dms_buf_ctrl_t *buf_ctrl = NULL; int ret = DMS_SUCCESS; hash = BufTableHashCode(tag); @@ -619,30 +616,34 @@ static int CBInvalidatePage(void *db_handle, char pageid[DMS_PAGEID_SIZE], unsig return ret; } + BufferDesc *buf_desc = GetBufferDescriptor(buf_id); + dms_buf_ctrl_t *buf_ctrl = GetDmsBufCtrl(buf_id); uint32 saveInterruptHoldoffCount = t_thrd.int_cxt.InterruptHoldoffCount; PG_TRY(); { buf_desc = GetBufferDescriptor(buf_id); if (IsSegmentBufferID(buf_id)) { - valid = SegPinBuffer(buf_desc); + (void)SegPinBuffer(buf_desc); } else { ResourceOwnerEnlargeBuffers(t_thrd.utils_cxt.CurrentResourceOwner); - valid = PinBuffer(buf_desc, NULL); + (void)PinBuffer(buf_desc, NULL); } LWLockRelease(partition_lock); - if (valid) { - (void)LWLockAcquire(buf_desc->content_lock, LW_EXCLUSIVE); - buf_ctrl = GetDmsBufCtrl(buf_id); - if (ver == buf_ctrl->ver) { - buf_ctrl->lock_mode = (unsigned char)DMS_LOCK_NULL; - } else { - ereport(WARNING, (errmodule(MOD_DMS), + WaitIO(buf_desc); + Assert(pg_atomic_read_u32(&buf_desc->state) & BM_VALID); + Assert(!(pg_atomic_read_u32(&buf_desc->state) & BM_IO_ERROR)); + (void)LWLockAcquire(buf_desc->content_lock, LW_EXCLUSIVE); + buf_ctrl = GetDmsBufCtrl(buf_id); + if (ver == buf_ctrl->ver) { + buf_ctrl->lock_mode = (unsigned char)DMS_LOCK_NULL; + } else { + ereport(WARNING, (errmodule(MOD_DMS), errmsg("[CBInvalidatePage] invalid ver:%u, buf_ctrl ver:%u", ver, buf_ctrl->ver))); - ret = DMS_ERROR; - } - LWLockRelease(buf_desc->content_lock); + ret = DMS_ERROR; } + LWLockRelease(buf_desc->content_lock); + if (IsSegmentBufferID(buf_id)) { SegReleaseBuffer(buf_id + 1); } else { @@ -662,12 +663,12 @@ static int CBInvalidatePage(void *db_handle, char pageid[DMS_PAGEID_SIZE], unsig ReleaseResource(); ret = DMS_ERROR; } + PG_END_TRY(); if (ret == DMS_SUCCESS) { Assert(buf_ctrl->lock_mode == DMS_LOCK_NULL); } - PG_END_TRY(); return ret; } @@ -1033,7 +1034,6 @@ static int32 CBDrcBufRebuild(void *db_handle) // used for find bufferdesc in dms static void SSGetBufferDesc(char *pageid, bool *is_valid, BufferDesc** ret_buf_desc) { - bool valid; int buf_id; uint32 hash; LWLock *partition_lock = NULL; @@ -1063,14 +1063,17 @@ static void SSGetBufferDesc(char *pageid, bool *is_valid, BufferDesc** ret_buf_d buf_id = BufTableLookup(tag, hash); if (buf_id >= 0) { buf_desc = GetBufferDescriptor(buf_id); - ResourceOwnerEnlargeBuffers(t_thrd.utils_cxt.CurrentResourceOwner); if (IsSegmentBufferID(buf_id)) { - valid = SegPinBuffer(buf_desc); + (void)SegPinBuffer(buf_desc); } else { - valid = PinBuffer(buf_desc, NULL); + ResourceOwnerEnlargeBuffers(t_thrd.utils_cxt.CurrentResourceOwner); + (void)PinBuffer(buf_desc, NULL); } LWLockRelease(partition_lock); - *is_valid = valid; + + WaitIO(buf_desc); + Assert(!(pg_atomic_read_u32(&buf_desc->state) & BM_IO_ERROR)); + *is_valid = (pg_atomic_read_u32(&buf_desc->state) & BM_VALID) != 0; *ret_buf_desc = buf_desc; } else { *ret_buf_desc = NULL;