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