修复共享存储下极致RTO回放coredump的问题

This commit is contained in:
arcoalien@qq.com
2023-03-11 16:48:48 +08:00
parent 828f66d4a7
commit 5cf4bfccbc
6 changed files with 51 additions and 40 deletions

View File

@ -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;
}
}

View File

@ -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)

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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)

View File

@ -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