From 8eeec8f530fa95a3fd914c37ccfc187f80cb2c3b Mon Sep 17 00:00:00 2001 From: q00421813 Date: Mon, 29 Jul 2024 08:45:28 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8Dbug=5Fundo=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=A4=8D=E7=94=A8=E5=9C=BA=E6=99=AF=E4=B8=8B,?= =?UTF-8?q?=E5=BD=93checkpoint=E7=82=B9=E6=99=9A=E4=BA=8Eundo=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=A4=8D=E7=94=A8=E4=B8=94=E6=AD=A4=E6=97=B6=E5=8F=91?= =?UTF-8?q?=E7=94=9Fredo=E5=90=8E=E5=87=BA=E7=8E=B0urecptr=E4=B8=8Exlog?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=B8=AD=E7=9A=84urecptr=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E7=9A=84=E6=83=85=E5=86=B5=202.astore=E8=A1=A8?= =?UTF-8?q?=E5=9C=A8enable=5Frecyclebin=3Don=E5=9C=BA=E6=99=AF=E4=B8=8B?= =?UTF-8?q?=E4=B8=8D=E6=94=AF=E6=8C=81=E5=88=9B=E5=BB=BA=E6=AE=B5=E9=A1=B5?= =?UTF-8?q?=E5=BC=8F=E8=A1=A8=203.=E4=BF=AE=E5=A4=8Dgs=5Fundo=5Fdump=5Fxid?= =?UTF-8?q?=E8=A7=86=E5=9B=BExid=E6=A0=A1=E9=AA=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/utils/adt/pgundostatfuncs.cpp | 4 ++-- src/gausskernel/optimizer/commands/tablecmds.cpp | 8 +++++++- .../storage/access/ustore/knl_uextremeredo.cpp | 8 ++++---- src/gausskernel/storage/access/ustore/knl_uredo.cpp | 4 ++-- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/common/backend/utils/adt/pgundostatfuncs.cpp b/src/common/backend/utils/adt/pgundostatfuncs.cpp index 55157e9f0..6fb4c6831 100644 --- a/src/common/backend/utils/adt/pgundostatfuncs.cpp +++ b/src/common/backend/utils/adt/pgundostatfuncs.cpp @@ -1912,7 +1912,7 @@ Datum gs_undo_translot_dump_xid(PG_FUNCTION_ARGS) TransactionId xid = (TransactionId)PG_GETARG_TRANSACTIONID(0); bool read_memory = PG_GETARG_INT32(1); - if (!TransactionIdIsValid(xid)) { + if (!TransactionIdIsValid(xid) || xid >= t_thrd.xact_cxt.ShmemVariableCache->nextXid) { elog(ERROR, "xid is invalid"); PG_RETURN_VOID(); } @@ -2012,7 +2012,7 @@ Datum gs_undo_dump_xid(PG_FUNCTION_ARGS) PG_RETURN_VOID(); #else TransactionId xid = (TransactionId)PG_GETARG_TRANSACTIONID(0); - if (!TransactionIdIsValid(xid)) { + if (!TransactionIdIsValid(xid) || xid >= t_thrd.xact_cxt.ShmemVariableCache->nextXid) { elog(ERROR, "xid is invalid"); PG_RETURN_VOID(); } diff --git a/src/gausskernel/optimizer/commands/tablecmds.cpp b/src/gausskernel/optimizer/commands/tablecmds.cpp index 7e3061fab..b2a48ac99 100755 --- a/src/gausskernel/optimizer/commands/tablecmds.cpp +++ b/src/gausskernel/optimizer/commands/tablecmds.cpp @@ -2895,7 +2895,7 @@ ObjectAddress DefineRelation(CreateStmt* stmt, char relkind, Oid ownerId, Object if (!IsInitdb && (relkind == RELKIND_RELATION) && !IsSystemNamespace(namespaceId) && !IsCStoreNamespace(namespaceId) && (pg_strcasecmp(storeChar, ORIENTATION_ROW) == 0) && - (stmt->relation->relpersistence == RELPERSISTENCE_PERMANENT)) { + (stmt->relation->relpersistence == RELPERSISTENCE_PERMANENT) && !u_sess->attr.attr_storage.enable_recyclebin) { bool isSegmentType = (storage_type == SEGMENT_PAGE); if (!isSegmentType && (u_sess->attr.attr_storage.enable_segment || bucketinfo != NULL)) { storage_type = SEGMENT_PAGE; @@ -2904,6 +2904,12 @@ ObjectAddress DefineRelation(CreateStmt* stmt, char relkind, Oid ownerId, Object reloptions = transformRelOptions((Datum)0, stmt->options, NULL, validnsps, true, false); } } else if (storage_type == SEGMENT_PAGE) { + if (u_sess->attr.attr_storage.enable_recyclebin) { + ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmodule(MOD_SEGMENT_PAGE), + errmsg("The table %s do not support segment-page storage", stmt->relation->relname), + errdetail("Segment-page storage doest not support recyclebin"), + errhint("set enable_recyclebin = off before using segmnet-page storage."))); + } ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("The table %s do not support segment storage", stmt->relation->relname))); diff --git a/src/gausskernel/storage/access/ustore/knl_uextremeredo.cpp b/src/gausskernel/storage/access/ustore/knl_uextremeredo.cpp index abe3c9f1d..48d5bd9ee 100644 --- a/src/gausskernel/storage/access/ustore/knl_uextremeredo.cpp +++ b/src/gausskernel/storage/access/ustore/knl_uextremeredo.cpp @@ -1685,7 +1685,7 @@ static void RedoUndoInsertBlock(XLogBlockHead *blockhead, XLogBlockUndoParse *bl urecptr = UHeapPrepareUndoInsert(xlundohdr->relOid, xlundohdrextra->partitionOid, relNode, spcNode, UNDO_PERMANENT, recxid, 0, xlundohdrextra->blkprev, xlundohdrextra->prevurp, blockdatarec->insertUndoParse.blkno, xlundohdr, xlundometa); - Assert(urecptr == xlundohdr->urecptr); + Assert(UNDO_PTR_GET_OFFSET(urecptr) == UNDO_PTR_GET_OFFSET(xlundohdr->urecptr)); undorec->SetOffset(blockdatarec->insertUndoParse.offnum); if (!skipInsert) { InsertPreparedUndo(t_thrd.ustore_cxt.urecvec, lsn); @@ -1764,7 +1764,7 @@ static void RedoUndoDeleteBlock(XLogBlockHead *blockhead, XLogBlockUndoParse *bl xlundohdrextra->hasSubXact ? TopSubTransactionId : InvalidSubTransactionId, 0, xlundohdrextra->blkprev, xlundohdrextra->prevurp, &oldTD, &utup, blockdatarec->deleteUndoParse.blkno, xlundohdr, xlundometa); - Assert(urecptr == xlundohdr->urecptr); + Assert(UNDO_PTR_GET_OFFSET(urecptr) == UNDO_PTR_GET_OFFSET(xlundohdr->urecptr)); undorec->SetOffset(blockdatarec->deleteUndoParse.offnum); if (!skipInsert) { /* Insert the Undo record into the undo store */ @@ -1851,7 +1851,7 @@ static void RedoUndoUpdateBlock(XLogBlockHead *blockhead, XLogBlockUndoParse *bl inplaceUpdate ? xlundohdrextra->blkprev : xlnewundohdrextra->blkprev, xlundohdrextra->prevurp, &oldTD, &oldtup, inplaceUpdate, &newUrecptr, blockdatarec->updateUndoParse.undoXorDeltaSize, blockdatarec->updateUndoParse.oldblk, blockdatarec->updateUndoParse.newblk, xlundohdr, xlundometa); - Assert(urecptr == xlundohdr->urecptr); + Assert(UNDO_PTR_GET_OFFSET(urecptr) == UNDO_PTR_GET_OFFSET(xlundohdr->urecptr)); if (!skipInsert) { if (!inplaceUpdate) { @@ -1956,7 +1956,7 @@ static void RedoUndoMultiInsertBlock(XLogBlockHead *blockhead, XLogBlockUndoPars * undo should be inserted at same location as it was during the * actual insert (DO operation). */ - Assert((*urecvec)[0]->Urp() == xlundohdr->urecptr); + Assert(UNDO_PTR_GET_OFFSET((*urecvec)[0]->Urp()) == UNDO_PTR_GET_OFFSET(xlundohdr->urecptr)); InsertPreparedUndo(urecvec, lsn); } diff --git a/src/gausskernel/storage/access/ustore/knl_uredo.cpp b/src/gausskernel/storage/access/ustore/knl_uredo.cpp index ea1a22c3b..5a9a46c10 100644 --- a/src/gausskernel/storage/access/ustore/knl_uredo.cpp +++ b/src/gausskernel/storage/access/ustore/knl_uredo.cpp @@ -393,7 +393,7 @@ static UndoRecPtr PrepareAndInsertUndoRecordForDeleteRedo(XLogReaderState *recor InvalidBuffer, xlrec->offnum, xid, *hasSubXact ? TopSubTransactionId : InvalidSubTransactionId, 0, *blkprev, *prevurp, &oldTD, utup, blkno, xlundohdr, &undometa); - Assert(urecptr == xlundohdr->urecptr); + Assert(UNDO_PTR_GET_OFFSET(urecptr) == UNDO_PTR_GET_OFFSET(xlundohdr->urecptr)); undorec->SetOffset(xlrec->offnum); if (!skipInsert) { /* Insert the Undo record into the undo store */ @@ -968,7 +968,7 @@ static UndoRecPtr PrepareAndInsertUndoRecordForUpdateRedo(XLogReaderState *recor *hasSubXact ? TopSubTransactionId : InvalidSubTransactionId, 0, *blkprev, inplaceUpdate ? *blkprev : *newblkprev, *prevurp, &oldTD, oldtup, inplaceUpdate, &newUrecptr, undoXorDeltaSize, oldblk, newblk, xlundohdr, &undometa); - Assert(urecptr == xlundohdr->urecptr); + Assert(UNDO_PTR_GET_OFFSET(urecptr) == UNDO_PTR_GET_OFFSET(xlundohdr->urecptr)); if (!skipInsert) { if (!inplaceUpdate) {