diff --git a/store/driver/txn/error.go b/store/driver/txn/error.go index 65f95c4dad..e2e12cfde6 100644 --- a/store/driver/txn/error.go +++ b/store/driver/txn/error.go @@ -156,6 +156,10 @@ func toTiDBErr(err error) error { return kv.ErrNotExist } + if e, ok := err.(*tikverr.ErrTxnTooLarge); ok { + return kv.ErrTxnTooLarge.GenWithStackByArgs(e.Size) + } + if errors.ErrorEqual(err, tikverr.ErrCannotSetNilValue) { return kv.ErrCannotSetNilValue } diff --git a/store/tikv/error/error.go b/store/tikv/error/error.go index f961738629..4c6015ba4e 100644 --- a/store/tikv/error/error.go +++ b/store/tikv/error/error.go @@ -139,6 +139,15 @@ func (k *ErrRetryable) Error() string { return k.Retryable } +// ErrTxnTooLarge is the error when transaction is too large, lock time reached the maximum value. +type ErrTxnTooLarge struct { + Size int +} + +func (e *ErrTxnTooLarge) Error() string { + return fmt.Sprintf("txn too large, size: %v.", e.Size) +} + // ErrEntryTooLarge is the error when a key value entry is too large. type ErrEntryTooLarge struct { Limit uint64 diff --git a/store/tikv/unionstore/memdb.go b/store/tikv/unionstore/memdb.go index fa2f8dad77..7bfc11971e 100644 --- a/store/tikv/unionstore/memdb.go +++ b/store/tikv/unionstore/memdb.go @@ -20,7 +20,6 @@ import ( "sync" "unsafe" - tidbkv "github.com/pingcap/tidb/kv" tikverr "github.com/pingcap/tidb/store/tikv/error" "github.com/pingcap/tidb/store/tikv/kv" ) @@ -310,7 +309,7 @@ func (db *MemDB) set(key []byte, value []byte, ops ...kv.FlagsOp) error { db.setValue(x, value) if uint64(db.Size()) > db.bufferSizeLimit { - return tidbkv.ErrTxnTooLarge.GenWithStackByArgs(db.Size()) + return &tikverr.ErrTxnTooLarge{Size: db.Size()} } return nil }