diff --git a/pkg/vm/engine/tae/catalog/base.go b/pkg/vm/engine/tae/catalog/base.go index a517227fd97c..487975646951 100644 --- a/pkg/vm/engine/tae/catalog/base.go +++ b/pkg/vm/engine/tae/catalog/base.go @@ -21,6 +21,8 @@ import ( "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/container/types" + "github.com/matrixorigin/matrixone/pkg/logutil" + "github.com/matrixorigin/matrixone/pkg/util/stack" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/txnif" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/txn/txnbase" @@ -87,6 +89,9 @@ func (be *BaseEntryImpl[T]) CreateWithTS(ts types.TS, baseNode T) { } func (be *BaseEntryImpl[T]) CreateWithTxn(txn txnif.AsyncTxn, baseNode T) { + if txn == nil { + logutil.Warnf("unexpected txn is nil: %+v", stack.Callers(0)) + } node := &MVCCNode[T]{ EntryMVCCNode: &EntryMVCCNode{ CreatedAt: txnif.UncommitTS, diff --git a/pkg/vm/engine/tae/txn/txnbase/mvccnode.go b/pkg/vm/engine/tae/txn/txnbase/mvccnode.go index ac1ebb17ed95..835a2aa26531 100644 --- a/pkg/vm/engine/tae/txn/txnbase/mvccnode.go +++ b/pkg/vm/engine/tae/txn/txnbase/mvccnode.go @@ -18,6 +18,7 @@ import ( "fmt" "io" + "github.com/matrixorigin/matrixone/pkg/common/moerr" "github.com/matrixorigin/matrixone/pkg/container/types" "github.com/matrixorigin/matrixone/pkg/container/vector" "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/containers" @@ -407,6 +408,10 @@ func (un *TxnMVCCNode) String() string { } func (un *TxnMVCCNode) PrepareCommit() (ts types.TS, err error) { + if un.Txn == nil { + err = moerr.NewTxnNotFoundNoCtx() + return + } un.Prepare = un.Txn.GetPrepareTS() ts = un.Prepare return diff --git a/pkg/vm/engine/tae/txn/txnimpl/table.go b/pkg/vm/engine/tae/txn/txnimpl/table.go index a485b78242c4..0440e58ca7be 100644 --- a/pkg/vm/engine/tae/txn/txnimpl/table.go +++ b/pkg/vm/engine/tae/txn/txnimpl/table.go @@ -15,12 +15,14 @@ package txnimpl import ( + "bytes" "context" "fmt" "runtime/trace" "time" "github.com/matrixorigin/matrixone/pkg/fileservice" + "github.com/matrixorigin/matrixone/pkg/util" "go.uber.org/zap" "github.com/matrixorigin/matrixone/pkg/perfcounter" @@ -1443,12 +1445,27 @@ func (tbl *txnTable) PrePrepare() (err error) { return } +func (tbl *txnTable) dumpCore(errMsg string) { + var errInfo bytes.Buffer + errInfo.WriteString(fmt.Sprintf("Table: %s", tbl.entry.String())) + errInfo.WriteString(fmt.Sprintf("\nTxn: %s", tbl.store.txn.String())) + errInfo.WriteString(fmt.Sprintf("\nErr: %s", errMsg)) + logutil.Error(errInfo.String()) + util.EnableCoreDump() + util.CoreDump() +} + func (tbl *txnTable) PrepareCommit() (err error) { for idx, node := range tbl.txnEntries.entries { if tbl.txnEntries.IsDeleted(idx) { continue } if err = node.PrepareCommit(); err != nil { + if moerr.IsMoErrCode(err, moerr.ErrTxnNotFound) { + var buf bytes.Buffer + buf.WriteString(fmt.Sprintf("%d/%d No Txn", idx, len(tbl.txnEntries.entries))) + tbl.dumpCore(buf.String()) + } break } }