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);
}