diff --git a/pom.xml b/pom.xml index 2254b45bb6..2235c4d3cb 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.tikv tikv-client-java - 3.3.0-SNAPSHOT + 3.3.4-SNAPSHOT jar TiKV Java Client A Java Client for TiKV diff --git a/src/main/java/org/tikv/common/region/RegionManager.java b/src/main/java/org/tikv/common/region/RegionManager.java index 37c3d73f75..129afaf9d5 100644 --- a/src/main/java/org/tikv/common/region/RegionManager.java +++ b/src/main/java/org/tikv/common/region/RegionManager.java @@ -228,12 +228,25 @@ public class RegionManager { TiStore store = null; if (storeType == TiStoreType.TiKV) { - Peer peer = region.getCurrentReplica(); - store = getStoreById(peer.getStoreId(), backOffer); + // check from the first replica in case it recovers + List replicaList = region.getReplicaList(); + for (int i = 0; i < replicaList.size(); i++) { + Peer peer = replicaList.get(i); + store = getStoreById(peer.getStoreId(), backOffer); + if (store.isReachable()) { + // update replica's index + region.setReplicaIdx(i); + break; + } + logger.info("Store {} is unreachable, try to get the next replica", peer.getStoreId()); + } } else { List tiflashStores = new ArrayList<>(); for (Peer peer : region.getLearnerList()) { TiStore s = getStoreById(peer.getStoreId(), backOffer); + if (!s.isReachable()) { + continue; + } for (Metapb.StoreLabel label : s.getStore().getLabelsList()) { if (label.getKey().equals(storeType.getLabelKey()) && label.getValue().equals(storeType.getLabelValue())) { diff --git a/src/main/java/org/tikv/common/region/TiRegion.java b/src/main/java/org/tikv/common/region/TiRegion.java index 3c0ce8e48d..9db3397c5e 100644 --- a/src/main/java/org/tikv/common/region/TiRegion.java +++ b/src/main/java/org/tikv/common/region/TiRegion.java @@ -126,6 +126,14 @@ public class TiRegion implements Serializable { return getCurrentReplica(); } + public void setReplicaIdx(int idx) { + replicaIdx = idx; + } + + public List getReplicaList() { + return replicaList; + } + private boolean isLeader(Peer peer) { return getLeader().equals(peer); }