Documentation ¶
Overview ¶
Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0.
Index ¶
- Constants
- Variables
- func CheckPartRegionConsistency(startKey, endKey []byte, regions []*RegionInfo) error
- func CheckRegionConsistency(startKey, endKey []byte, regions []*RegionInfo) error
- func CheckRegionEpoch(_new, _old *RegionInfo) bool
- func GetSplitKeysOfRegions(sortedKeys [][]byte, sortedRegions []*RegionInfo, isRawKV bool) map[*RegionInfo][][]byte
- func PdErrorCanRetry(err error) bool
- type BackoffMayNotCountBackoffer
- type ExponentialBackoffer
- type MockPDClientForSplit
- func (c *MockPDClientForSplit) GetOperator(_ context.Context, regionID uint64) (*pdpb.GetOperatorResponse, error)
- func (c *MockPDClientForSplit) GetRegionByID(_ context.Context, regionID uint64, _ ...pd.GetRegionOption) (*pd.Region, error)
- func (c *MockPDClientForSplit) ScanRegions(_ context.Context, key, endKey []byte, limit int, _ ...pd.GetRegionOption) ([]*pd.Region, error)
- func (c *MockPDClientForSplit) ScatterRegion(_ context.Context, regionID uint64) error
- func (c *MockPDClientForSplit) ScatterRegions(_ context.Context, regionIDs []uint64, _ ...pd.RegionsOption) (*pdpb.ScatterRegionResponse, error)
- func (c *MockPDClientForSplit) SetRegions(boundaries [][]byte) []*metapb.Region
- func (c *MockPDClientForSplit) SplitRegion(region *RegionInfo, keys [][]byte, isRawKV bool) (bool, *kvrpcpb.SplitRegionResponse, error)
- type RegionInfo
- type Span
- type SplitClient
- type SplitHelper
- type Value
- type Valued
- type WaitRegionOnlineBackoffer
Constants ¶
const ( SplitRetryInterval = 50 * time.Millisecond SplitMaxRetryInterval = 4 * time.Second // it takes 30 minutes to scatter regions when each TiKV has 400k regions ScatterWaitUpperInterval = 30 * time.Minute ScanRegionPaginationLimit = 128 )
Constants for split retry machinery.
Variables ¶
var ( WaitRegionOnlineAttemptTimes = config.DefaultRegionCheckBackoffLimit SplitRetryTimes = 150 )
var ( ErrBackoff = errors.New("found backoff error") ErrBackoffAndDontCount = errors.New("found backoff error but don't count") )
Functions ¶
func CheckPartRegionConsistency ¶
func CheckPartRegionConsistency(startKey, endKey []byte, regions []*RegionInfo) error
CheckPartRegionConsistency only checks the continuity of regions and the first region consistency.
func CheckRegionConsistency ¶
func CheckRegionConsistency(startKey, endKey []byte, regions []*RegionInfo) error
func CheckRegionEpoch ¶
func CheckRegionEpoch(_new, _old *RegionInfo) bool
CheckRegionEpoch check region epoch.
func GetSplitKeysOfRegions ¶
func GetSplitKeysOfRegions( sortedKeys [][]byte, sortedRegions []*RegionInfo, isRawKV bool, ) map[*RegionInfo][][]byte
GetSplitKeysOfRegions checks every input key is necessary to split region on it. Returns a map from region to split keys belongs to it.
The key will be skipped if it's the region boundary.
prerequisite: - sortedKeys are sorted in ascending order. - sortedRegions are continuous and sorted in ascending order by start key. - sortedRegions can cover all keys in sortedKeys. PaginateScanRegion should satisfy the above prerequisites.
Types ¶
type BackoffMayNotCountBackoffer ¶
type BackoffMayNotCountBackoffer struct {
// contains filtered or unexported fields
}
BackoffMayNotCountBackoffer is a backoffer but it may not increase the retry counter. It should be used with ErrBackoff or ErrBackoffAndDontCount.
func NewBackoffMayNotCountBackoffer ¶
func NewBackoffMayNotCountBackoffer() *BackoffMayNotCountBackoffer
NewBackoffMayNotCountBackoffer creates a new backoffer that may backoff or retry.
TODO: currently it has the same usage as NewWaitRegionOnlineBackoffer so we don't expose its inner settings.
func (*BackoffMayNotCountBackoffer) Attempt ¶
func (b *BackoffMayNotCountBackoffer) Attempt() int
Attempt implements utils.Backoffer.
func (*BackoffMayNotCountBackoffer) NextBackoff ¶
func (b *BackoffMayNotCountBackoffer) NextBackoff(err error) time.Duration
NextBackoff implements utils.Backoffer. For BackoffMayNotCountBackoffer, only ErrBackoff and ErrBackoffAndDontCount is meaningful.
type ExponentialBackoffer ¶
ExponentialBackoffer trivially retry any errors it meets. It's useful when the caller has handled the errors but only want to a more semantic backoff implementation.
func (*ExponentialBackoffer) Attempt ¶
func (b *ExponentialBackoffer) Attempt() int
Attempt returns the remain attempt times
func (*ExponentialBackoffer) NextBackoff ¶
func (b *ExponentialBackoffer) NextBackoff(error) time.Duration
NextBackoff returns a duration to wait before retrying again.
type MockPDClientForSplit ¶
type MockPDClientForSplit struct { pd.Client Regions *pdtypes.RegionTree // contains filtered or unexported fields }
MockPDClientForSplit is a mock PD client for testing split and scatter.
func NewMockPDClientForSplit ¶
func NewMockPDClientForSplit() *MockPDClientForSplit
NewMockPDClientForSplit creates a new MockPDClientForSplit.
func (*MockPDClientForSplit) GetOperator ¶
func (c *MockPDClientForSplit) GetOperator(_ context.Context, regionID uint64) (*pdpb.GetOperatorResponse, error)
func (*MockPDClientForSplit) GetRegionByID ¶
func (c *MockPDClientForSplit) GetRegionByID(_ context.Context, regionID uint64, _ ...pd.GetRegionOption) (*pd.Region, error)
func (*MockPDClientForSplit) ScanRegions ¶
func (c *MockPDClientForSplit) ScanRegions( _ context.Context, key, endKey []byte, limit int, _ ...pd.GetRegionOption, ) ([]*pd.Region, error)
func (*MockPDClientForSplit) ScatterRegion ¶
func (c *MockPDClientForSplit) ScatterRegion(_ context.Context, regionID uint64) error
func (*MockPDClientForSplit) ScatterRegions ¶
func (c *MockPDClientForSplit) ScatterRegions(_ context.Context, regionIDs []uint64, _ ...pd.RegionsOption) (*pdpb.ScatterRegionResponse, error)
func (*MockPDClientForSplit) SetRegions ¶
func (c *MockPDClientForSplit) SetRegions(boundaries [][]byte) []*metapb.Region
func (*MockPDClientForSplit) SplitRegion ¶
func (c *MockPDClientForSplit) SplitRegion( region *RegionInfo, keys [][]byte, isRawKV bool, ) (bool, *kvrpcpb.SplitRegionResponse, error)
type RegionInfo ¶
type RegionInfo struct { Region *metapb.Region Leader *metapb.Peer PendingPeers []*metapb.Peer DownPeers []*metapb.Peer }
RegionInfo includes a region and the leader of the region.
func PaginateScanRegion ¶
func PaginateScanRegion( ctx context.Context, client SplitClient, startKey, endKey []byte, limit int, ) ([]*RegionInfo, error)
PaginateScanRegion scan regions with a limit pagination and return all regions at once. The returned regions are continuous and cover the key range. If not, or meet errors, it will retry internally.
func ScanRegionsWithRetry ¶
func ScanRegionsWithRetry( ctx context.Context, client SplitClient, startKey, endKey []byte, limit int, ) ([]*RegionInfo, error)
func (*RegionInfo) ContainsInterior ¶
func (region *RegionInfo) ContainsInterior(key []byte) bool
ContainsInterior returns whether the region contains the given key, and also that the key does not fall on the boundary (start key) of the region.
func (*RegionInfo) ToZapFields ¶
func (region *RegionInfo) ToZapFields() zap.Field
ToZapFields returns zap fields for the RegionInfo. It can handle nil RegionInfo.
type SplitClient ¶
type SplitClient interface { // GetStore gets a store by a store id. GetStore(ctx context.Context, storeID uint64) (*metapb.Store, error) // GetRegion gets a region which includes a specified key. GetRegion(ctx context.Context, key []byte) (*RegionInfo, error) // GetRegionByID gets a region by a region id. GetRegionByID(ctx context.Context, regionID uint64) (*RegionInfo, error) // SplitKeysAndScatter splits the related regions of the keys and scatters the // new regions. It returns the new regions that need to be called with // WaitRegionsScattered. SplitKeysAndScatter(ctx context.Context, sortedSplitKeys [][]byte) ([]*RegionInfo, error) // SplitWaitAndScatter splits a region from a batch of keys, waits for the split // is finished, and scatters the new regions. It will return the original region, // new regions and error. The input keys should not be encoded. // // The split step has a few retry times. If it meets error, the error is returned // directly. // // The split waiting step has a backoff retry logic, if split has made progress, // it will not increase the retry counter. Otherwise, it will retry for about 1h. // If the retry is timeout, it will log a warning and continue. // // The scatter step has a few retry times. If it meets error, it will log a // warning and continue. // TODO(lance6716): remove this function in interface after BR uses SplitKeysAndScatter. SplitWaitAndScatter(ctx context.Context, region *RegionInfo, keys [][]byte) ([]*RegionInfo, error) // GetOperator gets the status of operator of the specified region. GetOperator(ctx context.Context, regionID uint64) (*pdpb.GetOperatorResponse, error) // ScanRegions gets a list of regions, starts from the region that contains key. // Limit limits the maximum number of regions returned. ScanRegions(ctx context.Context, key, endKey []byte, limit int) ([]*RegionInfo, error) // GetPlacementRule loads a placement rule from PD. GetPlacementRule(ctx context.Context, groupID, ruleID string) (*pdhttp.Rule, error) // SetPlacementRule insert or update a placement rule to PD. SetPlacementRule(ctx context.Context, rule *pdhttp.Rule) error // DeletePlacementRule removes a placement rule from PD. DeletePlacementRule(ctx context.Context, groupID, ruleID string) error // SetStoresLabel add or update specified label of stores. If labelValue // is empty, it clears the label. SetStoresLabel(ctx context.Context, stores []uint64, labelKey, labelValue string) error // WaitRegionsScattered waits for an already started scatter region action to // finish. Internally it will backoff and retry at the maximum internal of 2 // seconds. If the scatter makes progress during the retry, it will not decrease // the retry counter. If there's always no progress, it will retry for about 1h. // Caller can set the context timeout to control the max waiting time. // // The first return value is always the number of regions that are not finished // scattering no matter what the error is. WaitRegionsScattered(ctx context.Context, regionInfos []*RegionInfo) (notFinished int, err error) }
SplitClient is an external client used by RegionSplitter.
func NewClient ¶
func NewClient( client pd.Client, httpCli pdhttp.Client, tlsConf *tls.Config, isRawKv bool, splitBatchKeyCnt int, splitConcurrency int, ) SplitClient
NewClient creates a SplitClient.
splitBatchKeyCnt controls how many keys are sent to TiKV in a batch in split region API. splitConcurrency controls how many regions are split concurrently.
type SplitHelper ¶
type SplitHelper struct {
// contains filtered or unexported fields
}
SplitHelper represents a set of valued ranges, which doesn't overlap and union of them all is the full key space.
func NewSplitHelper ¶
func NewSplitHelper() *SplitHelper
NewSplitHelper creates a set of a subset of spans, with the full key space as initial status
func (*SplitHelper) Merge ¶
func (f *SplitHelper) Merge(val Valued)
func (*SplitHelper) Traverse ¶
func (f *SplitHelper) Traverse(m func(Valued) bool)
traverse the items in ascend order
type WaitRegionOnlineBackoffer ¶
type WaitRegionOnlineBackoffer struct {
Stat utils.RetryState
}
func NewWaitRegionOnlineBackoffer ¶
func NewWaitRegionOnlineBackoffer() *WaitRegionOnlineBackoffer
NewWaitRegionOnlineBackoffer create a backoff to wait region online.
func (*WaitRegionOnlineBackoffer) Attempt ¶
func (b *WaitRegionOnlineBackoffer) Attempt() int
Attempt returns the remain attempt times
func (*WaitRegionOnlineBackoffer) NextBackoff ¶
func (b *WaitRegionOnlineBackoffer) NextBackoff(err error) time.Duration
NextBackoff returns a duration to wait before retrying again