diff --git a/store/driver/txn/error.go b/store/driver/txn/error.go index 9f92c9b1cf..24b04d07a0 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.ErrEntryTooLarge); ok { + return kv.ErrEntryTooLarge.GenWithStackByArgs(e.Limit, e.Size) + } + if errors.ErrorEqual(err, tikverr.ErrInvalidTxn) { return kv.ErrInvalidTxn } diff --git a/store/tikv/error/error.go b/store/tikv/error/error.go index 987d80e591..3446025ead 100644 --- a/store/tikv/error/error.go +++ b/store/tikv/error/error.go @@ -14,6 +14,8 @@ package error import ( + "fmt" + "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/pdpb" @@ -134,3 +136,13 @@ type ErrRetryable struct { func (k *ErrRetryable) Error() string { return k.Retryable } + +// ErrEntryTooLarge is the error when a key value entry is too large. +type ErrEntryTooLarge struct { + Limit uint64 + Size uint64 +} + +func (e *ErrEntryTooLarge) Error() string { + return fmt.Sprintf("entry size too large, size: %v,limit: %v.", e.Size, e.Limit) +} diff --git a/store/tikv/unionstore/memdb.go b/store/tikv/unionstore/memdb.go index a008a7cc6e..5eeb2e08b7 100644 --- a/store/tikv/unionstore/memdb.go +++ b/store/tikv/unionstore/memdb.go @@ -281,7 +281,10 @@ func (db *MemDB) set(key []byte, value []byte, ops ...kv.FlagsOp) error { if value != nil { if size := uint64(len(key) + len(value)); size > db.entrySizeLimit { - return tidbkv.ErrEntryTooLarge.GenWithStackByArgs(db.entrySizeLimit, size) + return &tikverr.ErrEntryTooLarge{ + Limit: db.entrySizeLimit, + Size: size, + } } }