Documentation ¶
Index ¶
- Constants
- Variables
- func BackOff(attempts uint) int
- func GetInt64(ctx context.Context, r Retriever, k Key) (int64, error)
- func IncInt64(rm RetrieverMutator, k Key, step int64) (int64, error)
- func IsErrNotFound(err error) bool
- func IsMockCommitErrorEnable() bool
- func IsTxnRetryableError(err error) bool
- func MockCommitErrorDisable()
- func MockCommitErrorEnable()
- func NewExistErrInfo(idxName string, value string) *existErrInfo
- func NextUntil(it Iterator, fn FnKeyCmp) error
- func RunInNewTxn(store Storage, retryable bool, f func(txn Transaction) error) error
- func WalkMemBuffer(memBuf MemBuffer, f func(k Key, v []byte) error) error
- type AssertionType
- type BufferStore
- func (s *BufferStore) Get(ctx context.Context, k Key) ([]byte, error)
- func (s *BufferStore) Iter(k Key, upperBound Key) (Iterator, error)
- func (s *BufferStore) IterReverse(k Key) (Iterator, error)
- func (s *BufferStore) Reset()
- func (s *BufferStore) SaveTo(m Mutator) error
- func (s *BufferStore) SetCap(cap int)
- func (s *BufferStore) WalkBuffer(f func(k Key, v []byte) error) error
- type Client
- type Driver
- type FnKeyCmp
- type InjectedSnapshot
- type InjectedStore
- type InjectedTransaction
- type InjectionConfig
- type IsoLevel
- type Iterator
- type Key
- type KeyRange
- type LockCtx
- type MemBuffer
- type MockTxn
- type Mutator
- type Option
- type Options
- type ReplicaReadType
- type Request
- type RequestTypeSupportedChecker
- type Response
- type ResultSubset
- type Retriever
- type RetrieverMutator
- type Snapshot
- type SplittableStore
- type Storage
- type StoreType
- type Transaction
- type UnionIter
- type UnionStore
- type Variables
- type Version
- type VersionProvider
Constants ¶
const ( PriorityNormal = iota PriorityLow PriorityHigh )
Priority value for transaction priority.
const ( ReqTypeSelect = 101 ReqTypeIndex = 102 ReqTypeDAG = 103 ReqTypeAnalyze = 104 ReqTypeChecksum = 105 ReqSubTypeBasic = 0 ReqSubTypeDesc = 10000 ReqSubTypeGroupBy = 10001 ReqSubTypeTopN = 10002 ReqSubTypeSignature = 10003 ReqSubTypeAnalyzeIdx = 10004 ReqSubTypeAnalyzeCol = 10005 )
ReqTypes.
const ( DefBackoffLockFast = 100 DefBackOffWeight = 2 )
Default values
const MaxTxnTimeUse = 24 * 60 * 60 * 1000
MaxTxnTimeUse is the max time a Txn may use (in ms) from its begin to commit. We use it to abort the transaction to guarantee GC worker will not influence it.
const TxnRetryableMark = "[try again later]"
TxnRetryableMark is used to uniform the commit error messages which could retry the transaction. *WARNING*: changing this string will affect the backward compatibility.
const UnCommitIndexKVFlag byte = '1'
UnCommitIndexKVFlag uses to indicate the index key/value is no need to commit. This is used in the situation of the index key/value was unchanged when do update. Usage: 1. For non-unique index: normally, the index value is '0'. Change the value to '1' indicate the index key/value is no need to commit. 2. For unique index: normally, the index value is the record handle ID, 8 bytes. Append UnCommitIndexKVFlag to the value indicate the index key/value is no need to commit.
Variables ¶
var ( // DefaultTxnMembufCap is the default transaction membuf capability. DefaultTxnMembufCap = 4 * 1024 // TempTxnMemBufCap is the capability of temporary membuf. TempTxnMemBufCap = 64 )
var ( // ErrNotExist is used when try to get an entry with an unexist key from KV store. ErrNotExist = terror.ClassKV.New(mysql.ErrNotExist, mysql.MySQLErrName[mysql.ErrNotExist]) // ErrTxnRetryable is used when KV store occurs retryable error which SQL layer can safely retry the transaction. // When using TiKV as the storage node, the error is returned ONLY when lock not found (txnLockNotFound) in Commit, // subject to change it in the future. ErrTxnRetryable = terror.ClassKV.New(mysql.ErrTxnRetryable, mysql.MySQLErrName[mysql.ErrTxnRetryable]+TxnRetryableMark) // ErrCannotSetNilValue is the error when sets an empty value. ErrCannotSetNilValue = terror.ClassKV.New(mysql.ErrCannotSetNilValue, mysql.MySQLErrName[mysql.ErrCannotSetNilValue]) // ErrInvalidTxn is the error when commits or rollbacks in an invalid transaction. ErrInvalidTxn = terror.ClassKV.New(mysql.ErrInvalidTxn, mysql.MySQLErrName[mysql.ErrInvalidTxn]) // ErrTxnTooLarge is the error when transaction is too large, lock time reached the maximum value. ErrTxnTooLarge = terror.ClassKV.New(mysql.ErrTxnTooLarge, mysql.MySQLErrName[mysql.ErrTxnTooLarge]) // ErrEntryTooLarge is the error when a key value entry is too large. ErrEntryTooLarge = terror.ClassKV.New(mysql.ErrEntryTooLarge, mysql.MySQLErrName[mysql.ErrEntryTooLarge]) // ErrKeyExists returns when key is already exist. ErrKeyExists = terror.ClassKV.New(mysql.ErrDupEntry, mysql.MySQLErrName[mysql.ErrDupEntry]) // ErrNotImplemented returns when a function is not implemented yet. ErrNotImplemented = terror.ClassKV.New(mysql.ErrNotImplemented, mysql.MySQLErrName[mysql.ErrNotImplemented]) // ErrWriteConflict is the error when the commit meets an write conflict error. ErrWriteConflict = terror.ClassKV.New(mysql.ErrWriteConflict, mysql.MySQLErrName[mysql.ErrWriteConflict]+" "+TxnRetryableMark) // ErrWriteConflictInTiDB is the error when the commit meets an write conflict error when local latch is enabled. ErrWriteConflictInTiDB = terror.ClassKV.New(mysql.ErrWriteConflictInTiDB, mysql.MySQLErrName[mysql.ErrWriteConflictInTiDB]+" "+TxnRetryableMark) )
var ( // TxnEntrySizeLimit is limit of single entry size (len(key) + len(value)). TxnEntrySizeLimit = 6 * 1024 * 1024 // TxnTotalSizeLimit is limit of the sum of all entry size. TxnTotalSizeLimit uint64 = config.DefTxnTotalSizeLimit )
Those limits is enforced to make sure the transaction can be well handled by TiKV.
var ( LockAlwaysWait = int64(0) LockNoWait = int64(-1) )
Used for pessimistic lock wait time these two constants are special for lock protocol with tikv 0 means always wait, -1 means nowait, others meaning lock wait in milliseconds
var ( // MaxVersion is the maximum version, notice that it's not a valid version. MaxVersion = Version{Ver: math.MaxUint64} // MinVersion is the minimum version, it's not a valid version, too. MinVersion = Version{Ver: 0} )
var DefaultVars = NewVariables(&ignoreKill)
DefaultVars is the default variables instance.
Functions ¶
func BackOff ¶
BackOff Implements exponential backoff with full jitter. Returns real back off time in microsecond. See http://www.awsarchitectureblog.com/2015/03/backoff.html.
func IncInt64 ¶
func IncInt64(rm RetrieverMutator, k Key, step int64) (int64, error)
IncInt64 increases the value for key k in kv store by step.
func IsErrNotFound ¶
IsErrNotFound checks if err is a kind of NotFound error.
func IsMockCommitErrorEnable ¶
func IsMockCommitErrorEnable() bool
IsMockCommitErrorEnable exports for gofail testing.
func IsTxnRetryableError ¶
IsTxnRetryableError checks if the error could safely retry the transaction.
func MockCommitErrorDisable ¶
func MockCommitErrorDisable()
MockCommitErrorDisable exports for gofail testing.
func MockCommitErrorEnable ¶
func MockCommitErrorEnable()
MockCommitErrorEnable exports for gofail testing.
func NewExistErrInfo ¶
NewExistErrInfo is used to new an existErrInfo
func NextUntil ¶
NextUntil applies FnKeyCmp to each entry of the iterator until meets some condition. It will stop when fn returns true, or iterator is invalid or an error occurs.
func RunInNewTxn ¶
func RunInNewTxn(store Storage, retryable bool, f func(txn Transaction) error) error
RunInNewTxn will run the f in a new transaction environment.
Types ¶
type AssertionType ¶
type AssertionType int
AssertionType is the type of a assertion.
const ( None AssertionType = iota Exist NotExist )
The AssertionType constants.
type BufferStore ¶
type BufferStore struct { MemBuffer // contains filtered or unexported fields }
BufferStore wraps a Retriever for read and a MemBuffer for buffered write. Common usage pattern:
bs := NewBufferStore(r) // use BufferStore to wrap a Retriever // ... // read/write on bs // ... bs.SaveTo(m) // save above operations to a Mutator
func NewBufferStore ¶
func NewBufferStore(r Retriever, cap int) *BufferStore
NewBufferStore creates a BufferStore using r for read.
func (*BufferStore) Iter ¶
func (s *BufferStore) Iter(k Key, upperBound Key) (Iterator, error)
Iter implements the Retriever interface.
func (*BufferStore) IterReverse ¶
func (s *BufferStore) IterReverse(k Key) (Iterator, error)
IterReverse implements the Retriever interface.
func (*BufferStore) SaveTo ¶
func (s *BufferStore) SaveTo(m Mutator) error
SaveTo saves all buffered kv pairs into a Mutator.
func (*BufferStore) SetCap ¶
func (s *BufferStore) SetCap(cap int)
SetCap sets the MemBuffer capability.
func (*BufferStore) WalkBuffer ¶
func (s *BufferStore) WalkBuffer(f func(k Key, v []byte) error) error
WalkBuffer iterates all buffered kv pairs.
type Client ¶
type Client interface { // Send sends request to KV layer, returns a Response. Send(ctx context.Context, req *Request, vars *Variables) Response // IsRequestTypeSupported checks if reqType and subType is supported. IsRequestTypeSupported(reqType, subType int64) bool }
Client is used to send request to KV layer.
type Driver ¶
type Driver interface { // Open returns a new Storage. // The path is the string for storage specific format. Open(path string) (Storage, error) }
Driver is the interface that must be implemented by a KV storage.
type InjectedSnapshot ¶
type InjectedSnapshot struct { Snapshot // contains filtered or unexported fields }
InjectedSnapshot wraps a Snapshot with injections.
type InjectedStore ¶
type InjectedStore struct { Storage // contains filtered or unexported fields }
InjectedStore wraps a Storage with injections.
func (*InjectedStore) Begin ¶
func (s *InjectedStore) Begin() (Transaction, error)
Begin creates an injected Transaction.
func (*InjectedStore) BeginWithStartTS ¶
func (s *InjectedStore) BeginWithStartTS(startTS uint64) (Transaction, error)
BeginWithStartTS creates an injected Transaction with startTS.
func (*InjectedStore) GetSnapshot ¶
func (s *InjectedStore) GetSnapshot(ver Version) (Snapshot, error)
GetSnapshot creates an injected Snapshot.
type InjectedTransaction ¶
type InjectedTransaction struct { Transaction // contains filtered or unexported fields }
InjectedTransaction wraps a Transaction with injections.
type InjectionConfig ¶
InjectionConfig is used for fault injections for KV components.
func (*InjectionConfig) SetCommitError ¶
func (c *InjectionConfig) SetCommitError(err error)
SetCommitError injects an error for all Transaction.Commit() methods.
func (*InjectionConfig) SetGetError ¶
func (c *InjectionConfig) SetGetError(err error)
SetGetError injects an error for all kv.Get() methods.
type Key ¶
type Key []byte
Key represents high-level Key type.
func (Key) Cmp ¶
Cmp returns the comparison result of two key. The result will be 0 if a==b, -1 if a < b, and +1 if a > b.
func (Key) PrefixNext ¶
PrefixNext returns the next prefix key.
Assume there are keys like:
rowkey1 rowkey1_column1 rowkey1_column2 rowKey2
If we seek 'rowkey1' Next, we will get 'rowkey1_column1'. If we seek 'rowkey1' PrefixNext, we will get 'rowkey2'.
type LockCtx ¶
type LockCtx struct { Killed *uint32 ForUpdateTS uint64 LockWaitTime int64 WaitStartTime time.Time PessimisticLockWaited *int32 LockKeysDuration *time.Duration LockKeysCount *int32 }
LockCtx contains information for LockKeys method.
type MemBuffer ¶
type MemBuffer interface { RetrieverMutator // Size returns sum of keys and values length. Size() int // Len returns the number of entries in the DB. Len() int // Reset cleanup the MemBuffer Reset() // SetCap sets the MemBuffer capability, to reduce memory allocations. // Please call it before you use the MemBuffer, otherwise it will not works. SetCap(cap int) }
MemBuffer is an in-memory kv collection, can be used to buffer write operations.
func NewMemDbBuffer ¶
NewMemDbBuffer creates a new memDbBuffer.
type MockTxn ¶
type MockTxn interface { Transaction GetOption(opt Option) interface{} }
MockTxn is used for test cases that need more interfaces than Transaction.
type Mutator ¶
type Mutator interface { // Set sets the value for key k as v into kv store. // v must NOT be nil or empty, otherwise it returns ErrCannotSetNilValue. Set(k Key, v []byte) error // Delete removes the entry for key k from kv store. Delete(k Key) error }
Mutator is the interface wraps the basic Set and Delete methods.
type Option ¶
type Option int
Option is used for customizing kv store's behaviors during a transaction.
const ( // PresumeKeyNotExists indicates that when dealing with a Get operation but failing to read data from cache, // we presume that the key does not exist in Store. The actual existence will be checked before the // transaction's commit. // This option is an optimization for frequent checks during a transaction, e.g. batch inserts. PresumeKeyNotExists Option = iota + 1 // PresumeKeyNotExistsError is the option key for error. // When PresumeKeyNotExists is set and condition is not match, should throw the error. PresumeKeyNotExistsError // BinlogInfo contains the binlog data and client. BinlogInfo // SchemaChecker is used for checking schema-validity. SchemaChecker // IsolationLevel sets isolation level for current transaction. The default level is SI. IsolationLevel // Priority marks the priority of this transaction. Priority // NotFillCache makes this request do not touch the LRU cache of the underlying storage. NotFillCache // SyncLog decides whether the WAL(write-ahead log) of this request should be synchronized. SyncLog // KeyOnly retrieve only keys, it can be used in scan now. KeyOnly // Pessimistic is defined for pessimistic lock Pessimistic // SnapshotTS is defined to set snapshot ts. SnapshotTS // Set replica read ReplicaRead )
Transaction options
type ReplicaReadType ¶
type ReplicaReadType byte
ReplicaReadType is the type of replica to read data from
const ( // ReplicaReadLeader stands for 'read from leader'. ReplicaReadLeader ReplicaReadType = 1 << iota // ReplicaReadFollower stands for 'read from follower'. ReplicaReadFollower // ReplicaReadMixed stands for 'read from leader and follower and learner'. ReplicaReadMixed )
func (ReplicaReadType) IsFollowerRead ¶
func (r ReplicaReadType) IsFollowerRead() bool
IsFollowerRead checks if leader is going to be used to read data.
type Request ¶
type Request struct { // Tp is the request type. Tp int64 StartTs uint64 Data []byte KeyRanges []KeyRange // Concurrency is 1, if it only sends the request to a single storage unit when // ResponseIterator.Next is called. If concurrency is greater than 1, the request will be // sent to multiple storage units concurrently. Concurrency int // IsolationLevel is the isolation level, default is SI. IsolationLevel IsoLevel // Priority is the priority of this KV request, its value may be PriorityNormal/PriorityLow/PriorityHigh. Priority int // memTracker is used to trace and control memory usage in co-processor layer. MemTracker *memory.Tracker // KeepOrder is true, if the response should be returned in order. KeepOrder bool // Desc is true, if the request is sent in descending order. Desc bool // NotFillCache makes this request do not touch the LRU cache of the underlying storage. NotFillCache bool // SyncLog decides whether the WAL(write-ahead log) of this request should be synchronized. SyncLog bool // Streaming indicates using streaming API for this request, result in that one Next() // call would not corresponds to a whole region result. Streaming bool // ReplicaRead is used for reading data from replicas, only follower is supported at this time. ReplicaRead ReplicaReadType // StoreType represents this request is sent to the which type of store. StoreType StoreType // Cacheable is true if the request can be cached. Currently only deterministic DAG requests can be cached. Cacheable bool // SchemaVer is for any schema-ful storage to validate schema correctness if necessary. SchemaVar int64 }
Request represents a kv request.
type RequestTypeSupportedChecker ¶
type RequestTypeSupportedChecker struct{}
RequestTypeSupportedChecker is used to check expression can be pushed down.
func (RequestTypeSupportedChecker) IsRequestTypeSupported ¶
func (d RequestTypeSupportedChecker) IsRequestTypeSupported(reqType, subType int64) bool
IsRequestTypeSupported checks whether reqType is supported.
type Response ¶
type Response interface { // Next returns a resultSubset from a single storage unit. // When full result set is returned, nil is returned. Next(ctx context.Context) (resultSubset ResultSubset, err error) // Close response. Close() error }
Response represents the response returned from KV layer.
type ResultSubset ¶
type ResultSubset interface { // GetData gets the data. GetData() []byte // GetStartKey gets the start key. GetStartKey() Key // GetExecDetails gets the detail information. GetExecDetails() *execdetails.ExecDetails // MemSize returns how many bytes of memory this result use for tracing memory usage. MemSize() int64 // RespTime returns the response time for the request. RespTime() time.Duration }
ResultSubset represents a result subset from a single storage unit. TODO: Find a better interface for ResultSubset that can reuse bytes.
type Retriever ¶
type Retriever interface { // Get gets the value for key k from kv store. // If corresponding kv pair does not exist, it returns nil and ErrNotExist. Get(ctx context.Context, k Key) ([]byte, error) // Iter creates an Iterator positioned on the first entry that k <= entry's key. // If such entry is not found, it returns an invalid Iterator with no error. // It yields only keys that < upperBound. If upperBound is nil, it means the upperBound is unbounded. // The Iterator must be Closed after use. Iter(k Key, upperBound Key) (Iterator, error) // IterReverse creates a reversed Iterator positioned on the first entry which key is less than k. // The returned iterator will iterate from greater key to smaller key. // If k is nil, the returned iterator will be positioned at the last key. // TODO: Add lower bound limit IterReverse(k Key) (Iterator, error) }
Retriever is the interface wraps the basic Get and Seek methods.
type RetrieverMutator ¶
RetrieverMutator is the interface that groups Retriever and Mutator interfaces.
type Snapshot ¶
type Snapshot interface { Retriever // BatchGet gets a batch of values from snapshot. BatchGet(ctx context.Context, keys []Key) (map[string][]byte, error) // SetOption sets an option with a value, when val is nil, uses the default // value of this option. Only ReplicaRead is supported for snapshot SetOption(opt Option, val interface{}) // DelOption deletes an option. DelOption(opt Option) }
Snapshot defines the interface for the snapshot fetched from KV store.
type SplittableStore ¶
type SplittableStore interface { SplitRegions(ctx context.Context, splitKey [][]byte, scatter bool) (regionID []uint64, err error) WaitScatterRegionFinish(regionID uint64, backOff int) error CheckRegionInScattering(regionID uint64) (bool, error) }
SplittableStore is the kv store which supports split regions.
type Storage ¶
type Storage interface { // Begin transaction Begin() (Transaction, error) // BeginWithStartTS begins transaction with startTS. BeginWithStartTS(startTS uint64) (Transaction, error) // GetSnapshot gets a snapshot that is able to read any data which data is <= ver. // if ver is MaxVersion or > current max committed version, we will use current version for this snapshot. GetSnapshot(ver Version) (Snapshot, error) // GetClient gets a client instance. GetClient() Client // Close store Close() error // UUID return a unique ID which represents a Storage. UUID() string // CurrentVersion returns current max committed version. CurrentVersion() (Version, error) // GetOracle gets a timestamp oracle client. GetOracle() oracle.Oracle // SupportDeleteRange gets the storage support delete range or not. SupportDeleteRange() (supported bool) // Name gets the name of the storage engine Name() string // Describe returns of brief introduction of the storage Describe() string // ShowStatus returns the specified status of the storage ShowStatus(ctx context.Context, key string) (interface{}, error) }
Storage defines the interface for storage. Isolation should be at least SI(SNAPSHOT ISOLATION)
func NewInjectedStore ¶
func NewInjectedStore(store Storage, cfg *InjectionConfig) Storage
NewInjectedStore creates a InjectedStore with config.
type Transaction ¶
type Transaction interface { MemBuffer // Commit commits the transaction operations to KV store. Commit(context.Context) error // Rollback undoes the transaction operations to KV store. Rollback() error // String implements fmt.Stringer interface. String() string // LockKeys tries to lock the entries with the keys in KV store. LockKeys(ctx context.Context, lockCtx *LockCtx, keys ...Key) error // SetOption sets an option with a value, when val is nil, uses the default // value of this option. SetOption(opt Option, val interface{}) // DelOption deletes an option. DelOption(opt Option) // IsReadOnly checks if the transaction has only performed read operations. IsReadOnly() bool // StartTS returns the transaction start timestamp. StartTS() uint64 // Valid returns if the transaction is valid. // A transaction become invalid after commit or rollback. Valid() bool // GetMemBuffer return the MemBuffer binding to this transaction. GetMemBuffer() MemBuffer // SetVars sets variables to the transaction. SetVars(vars *Variables) // BatchGet gets kv from the memory buffer of statement and transaction, and the kv storage. // Do not use len(value) == 0 or value == nil to represent non-exist. // If a key doesn't exist, there shouldn't be any corresponding entry in the result map. BatchGet(ctx context.Context, keys []Key) (map[string][]byte, error) IsPessimistic() bool }
Transaction defines the interface for operations inside a Transaction. This is not thread safe.
type UnionIter ¶
type UnionIter struct {
// contains filtered or unexported fields
}
UnionIter is the iterator on an UnionStore.
func NewUnionIter ¶
NewUnionIter returns a union iterator for BufferStore.
func (*UnionIter) Close ¶
func (iter *UnionIter) Close()
Close implements the Iterator Close interface.
type UnionStore ¶
type UnionStore interface { MemBuffer // GetKeyExistErrInfo gets the key exist error info for the lazy check. GetKeyExistErrInfo(k Key) *existErrInfo // DeleteKeyExistErrInfo deletes the key exist error info for the lazy check. DeleteKeyExistErrInfo(k Key) // WalkBuffer iterates all buffered kv pairs. WalkBuffer(f func(k Key, v []byte) error) error // SetOption sets an option with a value, when val is nil, uses the default // value of this option. SetOption(opt Option, val interface{}) // DelOption deletes an option. DelOption(opt Option) // GetOption gets an option. GetOption(opt Option) interface{} // GetMemBuffer return the MemBuffer binding to this UnionStore. GetMemBuffer() MemBuffer }
UnionStore is a store that wraps a snapshot for read and a BufferStore for buffered write. Also, it provides some transaction related utilities.
func NewUnionStore ¶
func NewUnionStore(snapshot Snapshot) UnionStore
NewUnionStore builds a new UnionStore.
type Variables ¶
type Variables struct { // BackoffLockFast specifies the LockFast backoff base duration in milliseconds. BackoffLockFast int // BackOffWeight specifies the weight of the max back off time duration. BackOffWeight int // Hook is used for test to verify the variable take effect. Hook func(name string, vars *Variables) // Pointer to SessionVars.Killed // Killed is a flag to indicate that this query is killed. Killed *uint32 }
Variables defines the variables used by KV storage.
func NewVariables ¶
NewVariables create a new Variables instance with default values.
type VersionProvider ¶
VersionProvider provides increasing IDs.