diff --git a/server/cluster.go b/server/cluster.go index 649a182882e..572a8008c35 100644 --- a/server/cluster.go +++ b/server/cluster.go @@ -539,7 +539,7 @@ func (c *RaftCluster) checkStores() { if store.GetState() != metapb.StoreState_Offline { continue } - if cluster.getStoreRegionCount(store.GetId()) == 0 { + if c.storeIsEmpty(store.GetId()) { err := c.BuryStore(store.GetId(), false) if err != nil { log.Errorf("bury store %v failed: %v", store, err) @@ -550,6 +550,25 @@ func (c *RaftCluster) checkStores() { } } +func (c *RaftCluster) storeIsEmpty(storeID uint64) bool { + cluster := c.cachedCluster + if cluster.getStoreRegionCount(storeID) > 0 { + return false + } + // If pd-server is started recently, or becomes leader recently, the check may + // happen before any heartbeat from tikv. So we need to check region metas to + // verify no region's peer is on the store. + regions := cluster.getMetaRegions() + for _, region := range regions { + for _, p := range region.GetPeers() { + if p.GetStoreId() == storeID { + return false + } + } + } + return true +} + func (c *RaftCluster) collectMetrics() { cluster := c.cachedCluster