Skip to content

Commit

Permalink
server/core: cherry-pick tikv#2667
Browse files Browse the repository at this point in the history
Signed-off-by: Howard Lau <[email protected]>
  • Loading branch information
howardlau1999 committed Jul 23, 2020
1 parent 899e122 commit 7812529
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 21 deletions.
7 changes: 6 additions & 1 deletion server/core/basic_cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,14 @@ func (bc *BasicCluster) PreCheckPutRegion(region *RegionInfo) (*RegionInfo, erro
}
r := region.GetRegionEpoch()
o := origin.GetRegionEpoch()

// TiKV reports term after v3.0
isTermBehind := region.GetTerm() > 0 && region.GetTerm() < origin.GetTerm()

// Region meta is stale, return an error.
if r.GetVersion() < o.GetVersion() || r.GetConfVer() < o.GetConfVer() {
if r.GetVersion() < o.GetVersion() || r.GetConfVer() < o.GetConfVer() || isTermBehind {
return origin, ErrRegionIsStale(region.GetMeta(), origin.GetMeta())
}

return origin, nil
}
48 changes: 28 additions & 20 deletions server/core/region.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
// RegionInfo records detail region info.
// Read-Only once created.
type RegionInfo struct {
term uint64
meta *metapb.Region
learners []*metapb.Peer
voters []*metapb.Peer
Expand Down Expand Up @@ -87,16 +88,17 @@ func RegionFromHeartbeat(heartbeat *pdpb.RegionHeartbeatRequest) *RegionInfo {
}

region := &RegionInfo{
meta: heartbeat.GetRegion(),
leader: heartbeat.GetLeader(),
downPeers: heartbeat.GetDownPeers(),
pendingPeers: heartbeat.GetPendingPeers(),
writtenBytes: heartbeat.GetBytesWritten(),
readBytes: heartbeat.GetBytesRead(),
writtenKeys: heartbeat.GetKeysWritten(),
readKeys: heartbeat.GetKeysRead(),
approximateSize: int64(regionSize),
approximateKeys: int64(heartbeat.GetApproximateKeys()),
term: heartbeat.GetTerm(),
meta: heartbeat.GetRegion(),
leader: heartbeat.GetLeader(),
downPeers: heartbeat.GetDownPeers(),
pendingPeers: heartbeat.GetPendingPeers(),
writtenBytes: heartbeat.GetBytesWritten(),
writtenKeys: heartbeat.GetKeysWritten(),
readBytes: heartbeat.GetBytesRead(),
readKeys: heartbeat.GetKeysRead(),
approximateSize: int64(regionSize),
approximateKeys: int64(heartbeat.GetApproximateKeys()),
}

classifyVoterAndLearner(region)
Expand All @@ -115,16 +117,17 @@ func (r *RegionInfo) Clone(opts ...RegionCreateOption) *RegionInfo {
}

region := &RegionInfo{
meta: proto.Clone(r.meta).(*metapb.Region),
leader: proto.Clone(r.leader).(*metapb.Peer),
downPeers: downPeers,
pendingPeers: pendingPeers,
writtenBytes: r.writtenBytes,
readBytes: r.readBytes,
writtenKeys: r.writtenKeys,
readKeys: r.readKeys,
approximateSize: r.approximateSize,
approximateKeys: r.approximateKeys,
term: r.term,
meta: proto.Clone(r.meta).(*metapb.Region),
leader: proto.Clone(r.leader).(*metapb.Peer),
downPeers: downPeers,
pendingPeers: pendingPeers,
writtenBytes: r.writtenBytes,
writtenKeys: r.writtenKeys,
readBytes: r.readBytes,
readKeys: r.readKeys,
approximateSize: r.approximateSize,
approximateKeys: r.approximateKeys,
}

for _, opt := range opts {
Expand All @@ -134,6 +137,11 @@ func (r *RegionInfo) Clone(opts ...RegionCreateOption) *RegionInfo {
return region
}

// GetTerm returns the current term of the region
func (r *RegionInfo) GetTerm() uint64 {
return r.term
}

// GetLearners returns the learners.
func (r *RegionInfo) GetLearners() []*metapb.Peer {
return r.learners
Expand Down

0 comments on commit 7812529

Please sign in to comment.