mocktikv

package
Version: v3.1.0-fork Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 18, 2020 License: Apache-2.0 Imports: 57 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrInvalidEncodedKey = errors.New("invalid encoded key")

ErrInvalidEncodedKey describes parsing an invalid format of EncodedKey.

View Source
var GRPCClientFactory func() Client

GRPCClientFactory is the GRPC client factory. Use global variable to avoid circle import. TODO: remove this global variable.

Functions

func BootstrapWithMultiRegions

func BootstrapWithMultiRegions(cluster *Cluster, splitKeys ...[]byte) (storeID uint64, regionIDs, peerIDs []uint64)

BootstrapWithMultiRegions initializes a Cluster with multiple Regions and 1 Store. The number of Regions will be len(splitKeys) + 1.

func BootstrapWithMultiStores

func BootstrapWithMultiStores(cluster *Cluster, n int) (storeIDs, peerIDs []uint64, regionID uint64, leaderPeer uint64)

BootstrapWithMultiStores initializes a Cluster with 1 Region and n Stores.

func BootstrapWithSingleStore

func BootstrapWithSingleStore(cluster *Cluster) (storeID, peerID, regionID uint64)

BootstrapWithSingleStore initializes a Cluster with 1 Region and 1 Store.

func MockGRPCClientStream

func MockGRPCClientStream() grpc.ClientStream

MockGRPCClientStream is exported for testing purpose.

func NewPDClient

func NewPDClient(cluster *Cluster) pd.Client

NewPDClient creates a mock pd.Client that uses local timestamp and meta data from a Cluster.

Types

type Client

type Client interface {
	// Close should release all data.
	Close() error
	// SendRequest sends Request.
	SendRequest(ctx context.Context, addr string, req *tikvrpc.Request, timeout time.Duration) (*tikvrpc.Response, error)
}

Client is a client that sends RPC. This is same with tikv.Client, define again for avoid circle import.

type Cluster

type Cluster struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

Cluster simulates a TiKV cluster. It focuses on management and the change of meta data. A Cluster mainly includes following 3 kinds of meta data: 1) Region: A Region is a fragment of TiKV's data whose range is [start, end).

The data of a Region is duplicated to multiple Peers and distributed in
multiple Stores.

2) Peer: A Peer is a replica of a Region's data. All peers of a Region form

a group, each group elects a Leader to provide services.

3) Store: A Store is a storage/service node. Try to think it as a TiKV server

process. Only the store with request's Region's leader Peer could respond
to client's request.

func NewCluster

func NewCluster() *Cluster

NewCluster creates an empty cluster. It needs to be bootstrapped before providing service.

func (*Cluster) AddPeer

func (c *Cluster) AddPeer(regionID, storeID, peerID uint64)

AddPeer adds a new Peer for the Region on the Store.

func (*Cluster) AddStore

func (c *Cluster) AddStore(storeID uint64, addr string)

AddStore add a new Store to the cluster.

func (*Cluster) AllocID

func (c *Cluster) AllocID() uint64

AllocID creates an unique ID in cluster. The ID could be used as either StoreID, RegionID, or PeerID.

func (*Cluster) AllocIDs

func (c *Cluster) AllocIDs(n int) []uint64

AllocIDs creates multiple IDs.

func (*Cluster) Bootstrap

func (c *Cluster) Bootstrap(regionID uint64, storeIDs, peerIDs []uint64, leaderPeerID uint64)

Bootstrap creates the first Region. The Stores should be in the Cluster before bootstrap.

func (*Cluster) CancelStore

func (c *Cluster) CancelStore(storeID uint64)

CancelStore makes the store with cancel state true.

func (*Cluster) ChangeLeader

func (c *Cluster) ChangeLeader(regionID, leaderPeerID uint64)

ChangeLeader sets the Region's leader Peer. Caller should guarantee the Peer exists.

func (*Cluster) GetAllRegions

func (c *Cluster) GetAllRegions() []*Region

GetAllRegions gets all the regions in the cluster.

func (*Cluster) GetAllStores

func (c *Cluster) GetAllStores() []*metapb.Store

GetAllStores returns all Stores' meta.

func (*Cluster) GetAndCheckStoreByAddr

func (c *Cluster) GetAndCheckStoreByAddr(addr string) (*metapb.Store, error)

GetAndCheckStoreByAddr checks and returns a Store's meta by an addr

func (*Cluster) GetPrevRegionByKey

func (c *Cluster) GetPrevRegionByKey(key []byte) (*metapb.Region, *metapb.Peer)

GetPrevRegionByKey returns the previous Region and its leader whose range contains the key.

func (*Cluster) GetRegion

func (c *Cluster) GetRegion(regionID uint64) (*metapb.Region, uint64)

GetRegion returns a Region's meta and leader ID.

func (*Cluster) GetRegionByID

func (c *Cluster) GetRegionByID(regionID uint64) (*metapb.Region, *metapb.Peer)

GetRegionByID returns the Region and its leader whose ID is regionID.

func (*Cluster) GetRegionByKey

func (c *Cluster) GetRegionByKey(key []byte) (*metapb.Region, *metapb.Peer)

GetRegionByKey returns the Region and its leader whose range contains the key.

func (*Cluster) GetStore

func (c *Cluster) GetStore(storeID uint64) *metapb.Store

GetStore returns a Store's meta.

func (*Cluster) GetStoreByAddr

func (c *Cluster) GetStoreByAddr(addr string) *metapb.Store

GetStoreByAddr returns a Store's meta by an addr.

func (*Cluster) GiveUpLeader

func (c *Cluster) GiveUpLeader(regionID uint64)

GiveUpLeader sets the Region's leader to 0. The Region will have no leader before calling ChangeLeader().

func (*Cluster) Merge

func (c *Cluster) Merge(regionID1, regionID2 uint64)

Merge merges 2 regions, their key ranges should be adjacent.

func (*Cluster) RemovePeer

func (c *Cluster) RemovePeer(regionID, storeID uint64)

RemovePeer removes the Peer from the Region. Note that if the Peer is leader, the Region will have no leader before calling ChangeLeader().

func (*Cluster) RemoveStore

func (c *Cluster) RemoveStore(storeID uint64)

RemoveStore removes a Store from the cluster.

func (*Cluster) ScanRegions

func (c *Cluster) ScanRegions(startKey, endKey []byte, limit int) ([]*metapb.Region, []*metapb.Peer)

ScanRegions returns at most `limit` regions from given `key` and their leaders.

func (*Cluster) ScheduleDelay

func (c *Cluster) ScheduleDelay(startTS, regionID uint64, dur time.Duration)

ScheduleDelay schedules a delay event for a transaction on a region.

func (*Cluster) Split

func (c *Cluster) Split(regionID, newRegionID uint64, key []byte, peerIDs []uint64, leaderPeerID uint64)

Split splits a Region at the key (encoded) and creates new Region.

func (*Cluster) SplitIndex

func (c *Cluster) SplitIndex(mvccStore MVCCStore, tableID, indexID int64, count int)

SplitIndex evenly splits the data in index into count regions. Only works for single store.

func (*Cluster) SplitKeys

func (c *Cluster) SplitKeys(mvccStore MVCCStore, start, end kv.Key, count int)

SplitKeys evenly splits the start, end key into "count" regions. Only works for single store.

func (*Cluster) SplitRaw

func (c *Cluster) SplitRaw(regionID, newRegionID uint64, rawKey []byte, peerIDs []uint64, leaderPeerID uint64) *metapb.Region

SplitRaw splits a Region at the key (not encoded) and creates new Region.

func (*Cluster) SplitTable

func (c *Cluster) SplitTable(mvccStore MVCCStore, tableID int64, count int)

SplitTable evenly splits the data in table into count regions. Only works for single store.

func (*Cluster) StartStore

func (c *Cluster) StartStore(storeID uint64)

StartStore starts a store with storeID.

func (*Cluster) StopStore

func (c *Cluster) StopStore(storeID uint64)

StopStore stops a store with storeID.

func (*Cluster) UnCancelStore

func (c *Cluster) UnCancelStore(storeID uint64)

UnCancelStore makes the store with cancel state false.

func (*Cluster) UpdateStoreAddr

func (c *Cluster) UpdateStoreAddr(storeID uint64, addr string)

UpdateStoreAddr updates store address for cluster.

type ErrAbort

type ErrAbort string

ErrAbort means something is wrong and client should abort the txn.

func (ErrAbort) Error

func (e ErrAbort) Error() string

type ErrAlreadyCommitted

type ErrAlreadyCommitted uint64

ErrAlreadyCommitted is returned specially when client tries to rollback a committed lock.

func (ErrAlreadyCommitted) Error

func (e ErrAlreadyCommitted) Error() string

type ErrAlreadyRollbacked

type ErrAlreadyRollbacked struct {
	// contains filtered or unexported fields
}

ErrAlreadyRollbacked is returned when lock operation meets rollback write record

func (*ErrAlreadyRollbacked) Error

func (e *ErrAlreadyRollbacked) Error() string

type ErrCommitTSExpired

type ErrCommitTSExpired struct {
	kvrpcpb.CommitTsExpired
}

ErrCommitTSExpired is returned when commit.CommitTS < lock.MinCommitTS

func (*ErrCommitTSExpired) Error

func (e *ErrCommitTSExpired) Error() string

type ErrConflict

type ErrConflict struct {
	StartTS          uint64
	ConflictTS       uint64
	ConflictCommitTS uint64
	Key              []byte
}

ErrConflict is returned when the commitTS of key in the DB is greater than startTS.

func (*ErrConflict) Error

func (e *ErrConflict) Error() string

type ErrDeadlock

type ErrDeadlock struct {
	LockTS         uint64
	LockKey        []byte
	DealockKeyHash uint64
}

ErrDeadlock is returned when deadlock error is detected.

func (*ErrDeadlock) Error

func (e *ErrDeadlock) Error() string

type ErrKeyAlreadyExist

type ErrKeyAlreadyExist struct {
	Key []byte
}

ErrKeyAlreadyExist is returned when key exists but this key has a constraint that it should not exist. Client should return duplicated entry error.

func (*ErrKeyAlreadyExist) Error

func (e *ErrKeyAlreadyExist) Error() string

type ErrLocked

type ErrLocked struct {
	Key         MvccKey
	Primary     []byte
	StartTS     uint64
	ForUpdateTS uint64
	TTL         uint64
	TxnSize     uint64
	LockType    kvrpcpb.Op
}

ErrLocked is returned when trying to Read/Write on a locked key. Client should backoff or cleanup the lock then retry.

func (*ErrLocked) Error

func (e *ErrLocked) Error() string

Error formats the lock to a string.

type ErrRetryable

type ErrRetryable string

ErrRetryable suggests that client may restart the txn.

func (ErrRetryable) Error

func (e ErrRetryable) Error() string

type ErrTxnNotFound

type ErrTxnNotFound struct {
	kvrpcpb.TxnNotFound
}

ErrTxnNotFound is returned when the primary lock of the txn is not found.

func (*ErrTxnNotFound) Error

func (e *ErrTxnNotFound) Error() string

type Iterator

type Iterator struct {
	iterator.Iterator
	// contains filtered or unexported fields
}

Iterator wraps iterator.Iterator to provide Valid() method.

func (*Iterator) Next

func (iter *Iterator) Next()

Next moves the iterator to the next key/value pair.

func (*Iterator) Valid

func (iter *Iterator) Valid() bool

Valid returns whether the iterator is exhausted.

type MVCCDebugger

type MVCCDebugger interface {
	MvccGetByStartTS(starTS uint64) (*kvrpcpb.MvccInfo, []byte)
	MvccGetByKey(key []byte) *kvrpcpb.MvccInfo
}

MVCCDebugger is for debugging.

type MVCCLevelDB

type MVCCLevelDB struct {
	// contains filtered or unexported fields
}

MVCCLevelDB implements the MVCCStore interface.

func NewMVCCLevelDB

func NewMVCCLevelDB(path string) (*MVCCLevelDB, error)

NewMVCCLevelDB returns a new MVCCLevelDB object.

func (*MVCCLevelDB) BatchGet

func (mvcc *MVCCLevelDB) BatchGet(ks [][]byte, startTS uint64, isoLevel kvrpcpb.IsolationLevel, resolvedLocks []uint64) []Pair

BatchGet implements the MVCCStore interface.

func (*MVCCLevelDB) BatchResolveLock

func (mvcc *MVCCLevelDB) BatchResolveLock(startKey, endKey []byte, txnInfos map[uint64]uint64) error

BatchResolveLock implements the MVCCStore interface.

func (*MVCCLevelDB) CheckTxnStatus

func (mvcc *MVCCLevelDB) CheckTxnStatus(primaryKey []byte, lockTS, callerStartTS, currentTS uint64,
	rollbackIfNotExist bool) (ttl uint64, commitTS uint64, action kvrpcpb.Action, err error)

CheckTxnStatus checks the primary lock of a transaction to decide its status. The return values are (ttl, commitTS, err): If the transaction is active, this function returns the ttl of the lock; If the transaction is committed, this function returns the commitTS; If the transaction is rollbacked, this function returns (0, 0, nil) Note that CheckTxnStatus may also push forward the `minCommitTS` of the transaction, so it's not simply a read-only operation.

primaryKey + lockTS together could locate the primary lock. callerStartTS is the start ts of reader transaction. currentTS is the current ts, but it may be inaccurate. Just use it to check TTL.

func (*MVCCLevelDB) Cleanup

func (mvcc *MVCCLevelDB) Cleanup(key []byte, startTS, currentTS uint64) error

Cleanup implements the MVCCStore interface. Cleanup API is deprecated, use CheckTxnStatus instead.

func (*MVCCLevelDB) Close

func (mvcc *MVCCLevelDB) Close() error

Close calls leveldb's Close to free resources.

func (*MVCCLevelDB) Commit

func (mvcc *MVCCLevelDB) Commit(keys [][]byte, startTS, commitTS uint64) error

Commit implements the MVCCStore interface.

func (*MVCCLevelDB) DeleteRange

func (mvcc *MVCCLevelDB) DeleteRange(startKey, endKey []byte) error

DeleteRange implements the MVCCStore interface.

func (*MVCCLevelDB) GC

func (mvcc *MVCCLevelDB) GC(startKey, endKey []byte, safePoint uint64) error

GC implements the MVCCStore interface

func (*MVCCLevelDB) Get

func (mvcc *MVCCLevelDB) Get(key []byte, startTS uint64, isoLevel kvrpcpb.IsolationLevel, resolvedLocks []uint64) ([]byte, error)

Get implements the MVCCStore interface. key cannot be nil or []byte{}

func (*MVCCLevelDB) MvccGetByKey

func (mvcc *MVCCLevelDB) MvccGetByKey(key []byte) *kvrpcpb.MvccInfo

MvccGetByKey implements the MVCCDebugger interface.

func (*MVCCLevelDB) MvccGetByStartTS

func (mvcc *MVCCLevelDB) MvccGetByStartTS(starTS uint64) (*kvrpcpb.MvccInfo, []byte)

MvccGetByStartTS implements the MVCCDebugger interface.

func (*MVCCLevelDB) PessimisticLock

PessimisticLock writes the pessimistic lock.

func (*MVCCLevelDB) PessimisticRollback

func (mvcc *MVCCLevelDB) PessimisticRollback(keys [][]byte, startTS, forUpdateTS uint64) []error

PessimisticRollback implements the MVCCStore interface.

func (*MVCCLevelDB) Prewrite

func (mvcc *MVCCLevelDB) Prewrite(req *kvrpcpb.PrewriteRequest) []error

Prewrite implements the MVCCStore interface.

func (*MVCCLevelDB) RawBatchDelete

func (mvcc *MVCCLevelDB) RawBatchDelete(keys [][]byte)

RawBatchDelete implements the RawKV interface.

func (*MVCCLevelDB) RawBatchGet

func (mvcc *MVCCLevelDB) RawBatchGet(keys [][]byte) [][]byte

RawBatchGet implements the RawKV interface.

func (*MVCCLevelDB) RawBatchPut

func (mvcc *MVCCLevelDB) RawBatchPut(keys, values [][]byte)

RawBatchPut implements the RawKV interface

func (*MVCCLevelDB) RawDelete

func (mvcc *MVCCLevelDB) RawDelete(key []byte)

RawDelete implements the RawKV interface.

func (*MVCCLevelDB) RawDeleteRange

func (mvcc *MVCCLevelDB) RawDeleteRange(startKey, endKey []byte)

RawDeleteRange implements the RawKV interface.

func (*MVCCLevelDB) RawGet

func (mvcc *MVCCLevelDB) RawGet(key []byte) []byte

RawGet implements the RawKV interface.

func (*MVCCLevelDB) RawPut

func (mvcc *MVCCLevelDB) RawPut(key, value []byte)

RawPut implements the RawKV interface.

func (*MVCCLevelDB) RawReverseScan

func (mvcc *MVCCLevelDB) RawReverseScan(startKey, endKey []byte, limit int) []Pair

RawReverseScan implements the RawKV interface. Scan the range of [endKey, startKey) It doesn't support Scanning from "", because locating the last Region is not yet implemented.

func (*MVCCLevelDB) RawScan

func (mvcc *MVCCLevelDB) RawScan(startKey, endKey []byte, limit int) []Pair

RawScan implements the RawKV interface.

func (*MVCCLevelDB) ResolveLock

func (mvcc *MVCCLevelDB) ResolveLock(startKey, endKey []byte, startTS, commitTS uint64) error

ResolveLock implements the MVCCStore interface.

func (*MVCCLevelDB) ReverseScan

func (mvcc *MVCCLevelDB) ReverseScan(startKey, endKey []byte, limit int, startTS uint64, isoLevel kvrpcpb.IsolationLevel, resolvedLocks []uint64) []Pair

ReverseScan implements the MVCCStore interface. The search range is [startKey, endKey).

func (*MVCCLevelDB) Rollback

func (mvcc *MVCCLevelDB) Rollback(keys [][]byte, startTS uint64) error

Rollback implements the MVCCStore interface.

func (*MVCCLevelDB) Scan

func (mvcc *MVCCLevelDB) Scan(startKey, endKey []byte, limit int, startTS uint64, isoLevel kvrpcpb.IsolationLevel, resolvedLock []uint64) []Pair

Scan implements the MVCCStore interface.

func (*MVCCLevelDB) ScanLock

func (mvcc *MVCCLevelDB) ScanLock(startKey, endKey []byte, maxTS uint64) ([]*kvrpcpb.LockInfo, error)

ScanLock implements the MVCCStore interface.

func (*MVCCLevelDB) TxnHeartBeat

func (mvcc *MVCCLevelDB) TxnHeartBeat(key []byte, startTS uint64, adviseTTL uint64) (uint64, error)

TxnHeartBeat implements the MVCCStore interface.

type MVCCStore

type MVCCStore interface {
	Get(key []byte, startTS uint64, isoLevel kvrpcpb.IsolationLevel, resolvedLocks []uint64) ([]byte, error)
	Scan(startKey, endKey []byte, limit int, startTS uint64, isoLevel kvrpcpb.IsolationLevel, resolvedLocks []uint64) []Pair
	ReverseScan(startKey, endKey []byte, limit int, startTS uint64, isoLevel kvrpcpb.IsolationLevel, resolvedLocks []uint64) []Pair
	BatchGet(ks [][]byte, startTS uint64, isoLevel kvrpcpb.IsolationLevel, resolvedLocks []uint64) []Pair
	PessimisticLock(req *kvrpcpb.PessimisticLockRequest) *kvrpcpb.PessimisticLockResponse
	PessimisticRollback(keys [][]byte, startTS, forUpdateTS uint64) []error
	Prewrite(req *kvrpcpb.PrewriteRequest) []error
	Commit(keys [][]byte, startTS, commitTS uint64) error
	Rollback(keys [][]byte, startTS uint64) error
	Cleanup(key []byte, startTS, currentTS uint64) error
	ScanLock(startKey, endKey []byte, maxTS uint64) ([]*kvrpcpb.LockInfo, error)
	TxnHeartBeat(primaryKey []byte, startTS uint64, adviseTTL uint64) (uint64, error)
	ResolveLock(startKey, endKey []byte, startTS, commitTS uint64) error
	BatchResolveLock(startKey, endKey []byte, txnInfos map[uint64]uint64) error
	GC(startKey, endKey []byte, safePoint uint64) error
	DeleteRange(startKey, endKey []byte) error
	CheckTxnStatus(primaryKey []byte, lockTS uint64, startTS, currentTS uint64, rollbackIfNotFound bool) (uint64, uint64, kvrpcpb.Action, error)
	Close() error
}

MVCCStore is a mvcc key-value storage.

func MustNewMVCCStore

func MustNewMVCCStore() MVCCStore

MustNewMVCCStore is used for testing, use NewMVCCLevelDB instead.

type MvccKey

type MvccKey []byte

MvccKey is the encoded key type. On TiKV, keys are encoded before they are saved into storage engine.

func NewMvccKey

func NewMvccKey(key []byte) MvccKey

NewMvccKey encodes a key into MvccKey.

func (MvccKey) Raw

func (key MvccKey) Raw() []byte

Raw decodes a MvccKey to original key.

type Pair

type Pair struct {
	Key   []byte
	Value []byte
	Err   error
}

Pair is a KV pair read from MvccStore or an error if any occurs.

type RPCClient

type RPCClient struct {
	Cluster   *Cluster
	MvccStore MVCCStore

	// rpcCli uses to redirects RPC request to TiDB rpc server, It is only use for test.
	// Mock TiDB rpc service will have circle import problem, so just use a real RPC client to send this RPC  server.
	// sync.Once uses to avoid concurrency initialize rpcCli.
	sync.Once
	// contains filtered or unexported fields
}

RPCClient sends kv RPC calls to mock cluster. RPCClient mocks the behavior of a rpc client at tikv's side.

func NewRPCClient

func NewRPCClient(cluster *Cluster, mvccStore MVCCStore) *RPCClient

NewRPCClient creates an RPCClient. Note that close the RPCClient may close the underlying MvccStore.

func NewTiKVAndPDClient

func NewTiKVAndPDClient(cluster *Cluster, mvccStore MVCCStore, path string) (*RPCClient, pd.Client, error)

NewTiKVAndPDClient creates a TiKV client and PD client from options.

func (*RPCClient) Close

func (c *RPCClient) Close() error

Close closes the client.

func (*RPCClient) SendRequest

func (c *RPCClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.Request, timeout time.Duration) (*tikvrpc.Response, error)

SendRequest sends a request to mock cluster.

type RawKV

type RawKV interface {
	RawGet(key []byte) []byte
	RawBatchGet(keys [][]byte) [][]byte
	RawScan(startKey, endKey []byte, limit int) []Pair        // Scan the range of [startKey, endKey)
	RawReverseScan(startKey, endKey []byte, limit int) []Pair // Scan the range of [endKey, startKey)
	RawPut(key, value []byte)
	RawBatchPut(keys, values [][]byte)
	RawDelete(key []byte)
	RawBatchDelete(keys [][]byte)
	RawDeleteRange(startKey, endKey []byte)
}

RawKV is a key-value storage. MVCCStore can be implemented upon it with timestamp encoded into key.

type Region

type Region struct {
	Meta *metapb.Region
	// contains filtered or unexported fields
}

Region is the Region meta data.

type Store

type Store struct {
	// contains filtered or unexported fields
}

Store is the Store's meta data.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to