From 23ebfe050a25fa01bdb705f2c0b701cb807e5db8 Mon Sep 17 00:00:00 2001 From: q00421813 Date: Sat, 3 Aug 2024 10:30:49 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8Dundofile=E6=89=BE=E4=B8=8D?= =?UTF-8?q?=E5=88=B0=E7=9A=84=E9=97=AE=E9=A2=98=202.UndoScanDescData=203.?= =?UTF-8?q?=E4=BF=AE=E5=A4=8Dmemcheck=E6=A8=A1=E5=BC=8Fmemory=20leak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/process/tcop/postgres.cpp | 7 +++++++ .../opfusion/opfusion_indexonlyscan.cpp | 10 ++++++---- .../storage/access/index/indexam.cpp | 4 ++-- .../storage/access/ubtree/ubtree.cpp | 7 ++++--- .../storage/access/ustore/knl_uscan.cpp | 4 ++-- .../storage/access/ustore/knl_uundorecord.cpp | 19 +++++++++---------- .../storage/access/ustore/knl_uundovec.cpp | 1 - 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/gausskernel/process/tcop/postgres.cpp b/src/gausskernel/process/tcop/postgres.cpp index 1a8ea3221..61927296b 100755 --- a/src/gausskernel/process/tcop/postgres.cpp +++ b/src/gausskernel/process/tcop/postgres.cpp @@ -9301,6 +9301,13 @@ int PostgresMain(int argc, char* argv[], const char* dbname, const char* usernam ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("wrong role name."))); } + if (unlikely(IsAbortedTransactionBlockState())) { + if (InReceivingLocalUserIdChange()) { + SetUserIdAndSecContext(GetOldUserId(true), + u_sess->misc_cxt.SecurityRestrictionContext & (~RECEIVER_LOCAL_USERID_CHANGE)); + } + break; + } Oid role_oid = GetRoleOid(role_name); Oid save_userid = InvalidOid; int save_sec_context = 0; diff --git a/src/gausskernel/runtime/opfusion/opfusion_indexonlyscan.cpp b/src/gausskernel/runtime/opfusion/opfusion_indexonlyscan.cpp index e3f3e19f2..ad35d4203 100644 --- a/src/gausskernel/runtime/opfusion/opfusion_indexonlyscan.cpp +++ b/src/gausskernel/runtime/opfusion/opfusion_indexonlyscan.cpp @@ -290,7 +290,6 @@ TupleTableSlot *IndexOnlyScanFusion::getTupleSlotInternal() /* * Fill the scan tuple slot with data from the index. */ - IndexTuple tmptup = NULL; index_deform_tuple(indexdesc->xs_itup, RelationGetDescr(rel), m_values, m_isnull); if (indexdesc->xs_recheck && EpqCheck(m_values, m_isnull)) { continue; @@ -303,9 +302,12 @@ TupleTableSlot *IndexOnlyScanFusion::getTupleSlotInternal() m_tmpisnull[i] = m_isnull[m_attrno[i] - 1]; } - tmptup = index_form_tuple(m_tupDesc, m_tmpvals, m_tmpisnull); - Assert(tmptup != NULL); - StoreIndexTuple(m_reslot, tmptup, m_tupDesc); + (void)ExecClearTuple(m_reslot); + for (int i = 0; i < m_tupDesc->natts; i++) { + m_reslot->tts_values[i] = m_tmpvals[i]; + m_reslot->tts_isnull[i] = m_tmpisnull[i]; + } + (void)ExecStoreVirtualTuple(m_reslot); tableam_tslot_getsomeattrs(m_reslot, m_tupDesc->natts); ExecDropSingleTupleTableSlot(tmpreslot); diff --git a/src/gausskernel/storage/access/index/indexam.cpp b/src/gausskernel/storage/access/index/indexam.cpp index 999398d2b..f450adb94 100644 --- a/src/gausskernel/storage/access/index/indexam.cpp +++ b/src/gausskernel/storage/access/index/indexam.cpp @@ -621,7 +621,7 @@ UHeapTuple UHeapamIndexFetchTuple(IndexScanDesc scan, bool *all_dead, bool* has_ uheapTuple = UHeapSearchBuffer(tid, rel, scan->xs_cbuf, scan->xs_snapshot, all_dead); } else { if (!scan->xs_continue_hot) { - scan->xc_undo_scan = (UstoreUndoScanDesc)palloc0(sizeof(UstoreUndoScanDesc)); + scan->xc_undo_scan = (UstoreUndoScanDesc)palloc0(sizeof(UstoreUndoScanDescData)); undoChainEnd = UHeapSearchBufferShowAnyTuplesFirstCall(tid, rel, scan->xs_cbuf, scan->xc_undo_scan); } else { undoChainEnd = UHeapSearchBufferShowAnyTuplesFromUndo(tid, rel, scan->xs_cbuf, scan->xc_undo_scan); @@ -701,7 +701,7 @@ TupleTableSlot *slot, bool *callAgain, bool *allDead, bool* has_cur_xact_write) has_cur_xact_write); } else { if (!scan->xs_continue_hot) { - scan->xc_undo_scan = (UstoreUndoScanDesc)palloc0(sizeof(UstoreUndoScanDesc)); + scan->xc_undo_scan = (UstoreUndoScanDesc)palloc0(sizeof(UstoreUndoScanDescData)); undoChainEnd = UHeapSearchBufferShowAnyTuplesFirstCall(tid, rel, scan->xs_cbuf, scan->xc_undo_scan); } else { undoChainEnd = UHeapSearchBufferShowAnyTuplesFromUndo(tid, rel, scan->xs_cbuf, scan->xc_undo_scan); diff --git a/src/gausskernel/storage/access/ubtree/ubtree.cpp b/src/gausskernel/storage/access/ubtree/ubtree.cpp index c8716db49..daae41435 100644 --- a/src/gausskernel/storage/access/ubtree/ubtree.cpp +++ b/src/gausskernel/storage/access/ubtree/ubtree.cpp @@ -905,9 +905,10 @@ restart: if (minoff <= maxoff) { stats->num_index_tuples += maxoff - minoff + 1; } - - if(vstate->cycleid !=0 && opaque->btpo_cycleid == vstate->cycleid - && !(opaque->btpo_flags & BTP_SPLIT_END) && !P_RIGHTMOST(opaque) && opaque->btpo_next < origBlkno){ + + if (vstate->cycleid != 0 && opaque->btpo_cycleid == vstate->cycleid + && !(opaque->btpo_flags & BTP_SPLIT_END) + && !P_RIGHTMOST(opaque) && opaque->btpo_next < origBlkno) { recurseTo = opaque->btpo_next; } } diff --git a/src/gausskernel/storage/access/ustore/knl_uscan.cpp b/src/gausskernel/storage/access/ustore/knl_uscan.cpp index b2c8af3df..8acf69dc0 100644 --- a/src/gausskernel/storage/access/ustore/knl_uscan.cpp +++ b/src/gausskernel/storage/access/ustore/knl_uscan.cpp @@ -429,8 +429,8 @@ get_next_tuple: } else { if (!scan->xs_continue_undo) { ItemPointerSet(&scan->curTid, BufferGetBlockNumber(scan->rs_base.rs_cbuf), lineoff); - errno_t rc = memset_s(scan->xc_undo_scan, sizeof(UstoreUndoScanDesc), - 0, sizeof(UstoreUndoScanDesc)); + errno_t rc = memset_s(scan->xc_undo_scan, sizeof(UstoreUndoScanDescData), + 0, sizeof(UstoreUndoScanDescData)); securec_check(rc, "\0", "\0"); undoChainEnd = UHeapSearchBufferShowAnyTuplesFirstCall(&scan->curTid, scan->rs_base.rs_rd, scan->rs_base.rs_cbuf, scan->xc_undo_scan); diff --git a/src/gausskernel/storage/access/ustore/knl_uundorecord.cpp b/src/gausskernel/storage/access/ustore/knl_uundorecord.cpp index c41bd3efc..7e18b284b 100644 --- a/src/gausskernel/storage/access/ustore/knl_uundorecord.cpp +++ b/src/gausskernel/storage/access/ustore/knl_uundorecord.cpp @@ -492,18 +492,17 @@ static UndoRecordState LoadUndoRecord(UndoRecord *urec, TransactionId *lastXid) MemoryContext oldContext = MemoryContextSwitchTo(currentContext); t_thrd.int_cxt.CritSectionCount = saveCritSectionCount; state = undo::CheckUndoRecordValid(urec->Urp(), true, lastXid); - if (BufferIsValid(urec->Buff())) { - if (LWLockHeldByMeInMode(BufferDescriptorGetContentLock( - GetBufferDescriptor(urec->Buff() - 1)), LW_SHARED)) { - LockBuffer(urec->Buff(), BUFFER_LOCK_UNLOCK); - } - ReleaseBuffer(urec->Buff()); - urec->SetBuff(InvalidBuffer); - } if (state == UNDO_RECORD_DISCARD || state == UNDO_RECORD_FORCE_DISCARD) { t_thrd.undo_cxt.fetchRecord = false; t_thrd.int_cxt.InterruptHoldoffCount = saveInterruptHoldoffCount; - EmitErrorReport(); + if (BufferIsValid(urec->Buff())) { + if (LWLockHeldByMeInMode(BufferDescriptorGetContentLock( + GetBufferDescriptor(urec->Buff() - 1)), LW_SHARED)) { + LockBuffer(urec->Buff(), BUFFER_LOCK_UNLOCK); + } + ReleaseBuffer(urec->Buff()); + urec->SetBuff(InvalidBuffer); + } FlushErrorState(); return state; } else { @@ -701,4 +700,4 @@ void UndoRecordVerify(_in_ UndoRecord *urec) errmsg(UNDOFORMAT("[UNDO_RECORD_VERIFY]failed. utype %d , payLoadLen %hu, uinfo %d"), urec->Utype(), urec->PayLoadLen(), (int)urec->Uinfo()))); } -} \ No newline at end of file +} diff --git a/src/gausskernel/storage/access/ustore/knl_uundovec.cpp b/src/gausskernel/storage/access/ustore/knl_uundovec.cpp index a378c2c49..1a9cd6d85 100644 --- a/src/gausskernel/storage/access/ustore/knl_uundovec.cpp +++ b/src/gausskernel/storage/access/ustore/knl_uundovec.cpp @@ -420,7 +420,6 @@ static bool LoadUndoRecordRange(UndoRecord *urec, Buffer *buffer) if (state == UNDO_RECORD_DISCARD || state == UNDO_RECORD_FORCE_DISCARD) { t_thrd.undo_cxt.fetchRecord = false; t_thrd.int_cxt.InterruptHoldoffCount = saveInterruptHoldoffCount; - EmitErrorReport(); FlushErrorState(); return false; } else {