This commit is contained in:
yaoxin
2024-05-09 20:11:18 +08:00
parent 7ff21cd4b0
commit e4ea663c6d
2 changed files with 35 additions and 3 deletions

View File

@ -813,13 +813,18 @@ static void PutTranslotInfoToTuple(int zoneId, uint32 offset, TransactionSlot *s
} }
static void GetTranslotFromOneSegFile(int fd, int zoneId, Tuplestorestate *tupstore, static void GetTranslotFromOneSegFile(int fd, int zoneId, Tuplestorestate *tupstore,
TupleDesc tupDesc, TransactionId xid, MiniSlot *returnSlot) TupleDesc tupDesc, TransactionId xid, int segno, MiniSlot *returnSlot)
{ {
TransactionSlot *slot = NULL; TransactionSlot *slot = NULL;
errno_t rc = EOK; errno_t rc = EOK;
off_t seekpos; off_t seekpos;
uint32 ret = 0; uint32 ret = 0;
char buffer[BLCKSZ] = {'\0'}; char buffer[BLCKSZ] = {'\0'};
UndoSlotPtr usp = INVALID_UNDO_SLOT_PTR;
UndoZone *uzone = UndoZoneGroup::GetUndoZone(zoneId, false);
if (uzone == NULL) {
return;
}
for (uint32 loop = 0; loop < UNDO_META_SEG_SIZE; loop++) { for (uint32 loop = 0; loop < UNDO_META_SEG_SIZE; loop++) {
seekpos = (off_t)BLCKSZ * loop; seekpos = (off_t)BLCKSZ * loop;
@ -835,6 +840,10 @@ static void GetTranslotFromOneSegFile(int fd, int zoneId, Tuplestorestate *tupst
for (uint32 offset = UNDO_LOG_BLOCK_HEADER_SIZE; offset < BLCKSZ - MAXALIGN(sizeof(TransactionSlot)); for (uint32 offset = UNDO_LOG_BLOCK_HEADER_SIZE; offset < BLCKSZ - MAXALIGN(sizeof(TransactionSlot));
offset += MAXALIGN(sizeof(TransactionSlot))) { offset += MAXALIGN(sizeof(TransactionSlot))) {
usp = MAKE_UNDO_PTR(zoneId, segno * UNDO_META_SEGMENT_SIZE + loop * BLCKSZ + offset);
if (usp < uzone->GetRecycleTSlotPtr() || usp > uzone->GetAllocateTSlotPtr()) {
continue;
}
slot = (TransactionSlot *)(buffer + offset); slot = (TransactionSlot *)(buffer + offset);
if (TransactionIdIsValid(xid) && slot->XactId() < xid) { if (TransactionIdIsValid(xid) && slot->XactId() < xid) {
continue; continue;
@ -867,7 +876,7 @@ static void GetTranslotFromSegFiles(int zoneId, int segnobegin, int segnoend, Tu
securec_check_ss(rc, "\0", "\0"); securec_check_ss(rc, "\0", "\0");
int fd = open(fileName, O_RDONLY | PG_BINARY, S_IRUSR | S_IWUSR); int fd = open(fileName, O_RDONLY | PG_BINARY, S_IRUSR | S_IWUSR);
Checkfd(fd, fileName); Checkfd(fd, fileName);
GetTranslotFromOneSegFile(fd, zoneId, tupstore, tupDesc, xid, returnSlot); GetTranslotFromOneSegFile(fd, zoneId, tupstore, tupDesc, xid, segcurrent, returnSlot);
close(fd); close(fd);
} }
} }

View File

@ -549,13 +549,36 @@ void UnlinkUndoFile(const RelFileNodeBackend& rnode, ForkNumber forkNum, bool is
{ {
Assert(blockNum != InvalidBlockNumber); Assert(blockNum != InvalidBlockNumber);
char path[UNDO_FILE_PATH_LEN]; char path[UNDO_FILE_PATH_LEN] = { 0 };
char prev_path[UNDO_FILE_PATH_LEN] ={ 0 };
uint32 undoFileBlocks = UNDO_FILE_BLOCK(rnode.node.dbNode); uint32 undoFileBlocks = UNDO_FILE_BLOCK(rnode.node.dbNode);
int ret; int ret;
int zid = rnode.node.relNode; int zid = rnode.node.relNode;
int segno = blockNum / undoFileBlocks; int segno = blockNum / undoFileBlocks;
GetUndoFilePath(zid, rnode.node.dbNode, segno, path, UNDO_FILE_PATH_LEN); GetUndoFilePath(zid, rnode.node.dbNode, segno, path, UNDO_FILE_PATH_LEN);
if (segno > 0) {
undo::UndoZone *uzone = undo::UndoZoneGroup::GetUndoZone(zid, false);
Assert(uzone != NULL);
GetUndoFilePath(zid, rnode.node.dbNode, segno - 1, prev_path, UNDO_FILE_PATH_LEN);
if (access(prev_path, F_OK) == 0) {
ereport(WARNING, (errmodule(MOD_UNDO),
errmsg(UNDOFORMAT("Undo unlink file discontunue: path %s, prevPath %s."
"spaceInfo: head %lu, tail %lu, lsn %lu."
"slotSpaceInfo: head %lu, tail %lu, lsn %lu."
"zoneInfo: insertURecPtr %lu, forceDiscardURecPtr %lu, discardURecPtr %lu, allcateTSlotPtr %lu,"
"recycleTSlotPtr %lu, recycleXid %lu, frozenXid %lu, lsn %lu."
),
path, prev_path,
uzone->GetUndoSpace()->Head(), uzone->GetUndoSpace()->Tail(), uzone->GetUndoSpace()->LSN(),
uzone->GetSlotSpace()->Head(), uzone->GetSlotSpace()->Tail(), uzone->GetSlotSpace()->LSN(),
uzone->GetInsertURecPtr(), uzone->GetForceDiscardURecPtr(),
uzone->GetDiscardURecPtr(), uzone->GetAllocateTSlotPtr(),
uzone->GetRecycleTSlotPtr(), uzone->GetRecycleXid(), uzone->GetFrozenXid(), uzone->GetLSN()
)));
}
}
if (isRedo || u_sess->attr.attr_common.IsInplaceUpgrade || forkNum != MAIN_FORKNUM || if (isRedo || u_sess->attr.attr_common.IsInplaceUpgrade || forkNum != MAIN_FORKNUM ||
RelFileNodeBackendIsTemp(rnode) || rnode.node.bucketNode != InvalidBktId) { RelFileNodeBackendIsTemp(rnode) || rnode.node.bucketNode != InvalidBktId) {
if (!RelFileNodeBackendIsTemp(rnode)) { if (!RelFileNodeBackendIsTemp(rnode)) {