From 75bce00aed55852987545c858ff73e923be4a315 Mon Sep 17 00:00:00 2001 From: luozihao <1165977584@qq.com> Date: Fri, 5 Nov 2021 11:28:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BD=92=E6=A1=A3=E6=A7=BD?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/storage/replication/slot.cpp | 2 +- src/gausskernel/storage/replication/slotfuncs.cpp | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/gausskernel/storage/replication/slot.cpp b/src/gausskernel/storage/replication/slot.cpp index e147a0ae8..860e3f285 100644 --- a/src/gausskernel/storage/replication/slot.cpp +++ b/src/gausskernel/storage/replication/slot.cpp @@ -1260,7 +1260,7 @@ static void SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel) SpinLockRelease(&slot->mutex); COMP_CRC32C(cp.checksum, (char *)(&cp) + ReplicationSlotOnDiskConstantSize, ReplicationSlotOnDiskDynamicSize); - if (GET_SLOT_EXTRA_DATA_LENGTH(cp.slotdata) > 0) { + if (slot->extra_content && strlen(slot->extra_content) != 0 && GET_SLOT_EXTRA_DATA_LENGTH(cp.slotdata) > 0) { COMP_CRC32C(cp.checksum, slot->extra_content, GET_SLOT_EXTRA_DATA_LENGTH(cp.slotdata)); } FIN_CRC32C(cp.checksum); diff --git a/src/gausskernel/storage/replication/slotfuncs.cpp b/src/gausskernel/storage/replication/slotfuncs.cpp index 25c6bee1d..ebe9fc0d1 100644 --- a/src/gausskernel/storage/replication/slotfuncs.cpp +++ b/src/gausskernel/storage/replication/slotfuncs.cpp @@ -86,6 +86,10 @@ void log_slot_advance(const ReplicationSlotPersistentData *slotInfo) XLogBeginInsert(); XLogRegisterData((char *)&xlrec, ReplicationSlotPersistentDataConstSize); + char* extra_content = t_thrd.slot_cxt.MyReplicationSlot->extra_content; + if (extra_content != NULL && strlen(extra_content) != 0) { + XLogRegisterData(extra_content, strlen(extra_content) + 1); + } Ptr = XLogInsert(RM_SLOT_ID, XLOG_SLOT_ADVANCE); XLogWaitFlush(Ptr); @@ -969,8 +973,14 @@ void slot_redo(XLogReaderState *record) case XLOG_SLOT_ADVANCE: if (ReplicationSlotFind(xlrec->name.data)) redo_slot_advance(xlrec); - else - redo_slot_create(xlrec); + else { + char* extra_content = NULL; + if (GET_SLOT_EXTRA_DATA_LENGTH(*xlrec) != 0) { + extra_content = (char*)XLogRecGetData(record) + ReplicationSlotPersistentDataConstSize; + Assert(strlen(extra_content) == (uint32)(GET_SLOT_EXTRA_DATA_LENGTH(*xlrec))); + } + redo_slot_create(xlrec, extra_content); + } break; case XLOG_SLOT_DROP: if (ReplicationSlotFind(xlrec->name.data))