From 86b6429db96e5380a49f705473866c76ff45dad3 Mon Sep 17 00:00:00 2001 From: Shirly Date: Thu, 29 Apr 2021 11:39:57 +0800 Subject: [PATCH] store/tikv: use tikv.error.ErrTxnTooLarge instead of kv.ErrTxnTooLarge (#24353) --- store/driver/txn/error.go | 4 ++++ store/tikv/error/error.go | 9 +++++++++ store/tikv/unionstore/memdb.go | 3 +-- 3 files changed, 14 insertions(+), 2 deletions(-) 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 }