diff --git a/src/main/java/org/tikv/common/util/ConcreteBackOffer.java b/src/main/java/org/tikv/common/util/ConcreteBackOffer.java index 722e918873..e4aab3855c 100644 --- a/src/main/java/org/tikv/common/util/ConcreteBackOffer.java +++ b/src/main/java/org/tikv/common/util/ConcreteBackOffer.java @@ -26,10 +26,10 @@ import org.apache.log4j.Logger; import org.tikv.common.exception.GrpcException; public class ConcreteBackOffer implements BackOffer { - private int maxSleep; + private final int maxSleep; private int totalSleep; - private Map backOffFunctionMap; - private List errors; + private final Map backOffFunctionMap; + private final List errors; private static final Logger logger = Logger.getLogger(ConcreteBackOffer.class); public static ConcreteBackOffer newCustomBackOff(int maxSleep) { @@ -60,6 +60,10 @@ public class ConcreteBackOffer implements BackOffer { return new ConcreteBackOffer(tsoMaxBackoff); } + public static ConcreteBackOffer create(BackOffer source) { + return new ConcreteBackOffer(((ConcreteBackOffer) source)); + } + private ConcreteBackOffer(int maxSleep) { Preconditions.checkArgument(maxSleep >= 0, "Max sleep time cannot be less than 0."); this.maxSleep = maxSleep; @@ -67,6 +71,13 @@ public class ConcreteBackOffer implements BackOffer { this.backOffFunctionMap = new HashMap<>(); } + private ConcreteBackOffer(ConcreteBackOffer source) { + this.maxSleep = source.maxSleep; + this.totalSleep = source.totalSleep; + this.errors = source.errors; + this.backOffFunctionMap = source.backOffFunctionMap; + } + /** * Creates a back off func which implements exponential back off with optional jitters according * to different back off strategies. See http://www.awsarchitectureblog.com/2015/03/backoff.html diff --git a/src/main/java/org/tikv/raw/RawKVClient.java b/src/main/java/org/tikv/raw/RawKVClient.java index 056cf54f47..dc91216444 100644 --- a/src/main/java/org/tikv/raw/RawKVClient.java +++ b/src/main/java/org/tikv/raw/RawKVClient.java @@ -270,6 +270,7 @@ public class RawKVClient implements AutoCloseable { for (Batch batch : batches) { completionService.submit( () -> { + BackOffer singleBatchBackOffer = ConcreteBackOffer.create(backOffer); Pair pair = regionManager.getRegionStorePairByRegionId(batch.regionId); RegionStoreClient client = RegionStoreClient.create(pair.first, pair.second, session); @@ -282,13 +283,13 @@ public class RawKVClient implements AutoCloseable { .build()); } try { - client.rawBatchPut(backOffer, kvPairs); + client.rawBatchPut(singleBatchBackOffer, kvPairs); } catch (final TiKVException e) { // TODO: any elegant way to re-split the ranges if fails? - backOffer.doBackOff(BackOffFunction.BackOffFuncType.BoRegionMiss, e); + singleBatchBackOffer.doBackOff(BackOffFunction.BackOffFuncType.BoRegionMiss, e); logger.warn("ReSplitting ranges for BatchPutRequest"); // recursive calls - batchPut(backOffer, batch.keys, batch.values); + batchPut(singleBatchBackOffer, batch.keys, batch.values); } return null; }); diff --git a/src/test/java/org/tikv/raw/RawKVClientTest.java b/src/test/java/org/tikv/raw/RawKVClientTest.java index 66588474db..50fb046ed9 100644 --- a/src/test/java/org/tikv/raw/RawKVClientTest.java +++ b/src/test/java/org/tikv/raw/RawKVClientTest.java @@ -1,6 +1,5 @@ package org.tikv.raw; - import com.google.protobuf.ByteString; import java.util.*; import java.util.concurrent.*;