From e419210d97bc0a6ec877a2c0985f624122124132 Mon Sep 17 00:00:00 2001 From: iosmanthus Date: Fri, 10 Dec 2021 03:47:48 +0800 Subject: [PATCH 1/3] cherry pick #367 to release-3.1 Signed-off-by: ti-srebot --- src/main/java/org/tikv/common/TiSession.java | 50 +++++++++++++++++-- .../org/tikv/common/region/RegionCache.java | 6 ++- .../org/tikv/common/region/RegionManager.java | 2 + .../java/org/tikv/raw/SmartRawKVClient.java | 8 +++ 4 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/tikv/common/TiSession.java b/src/main/java/org/tikv/common/TiSession.java index df17109c3d5..f0fe5dd9ceb 100644 --- a/src/main/java/org/tikv/common/TiSession.java +++ b/src/main/java/org/tikv/common/TiSession.java @@ -20,10 +20,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.protobuf.ByteString; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.Collectors; @@ -33,11 +30,15 @@ import org.tikv.common.exception.TiKVException; import org.tikv.common.key.Key; import org.tikv.common.meta.TiTimestamp; +<<<<<<< HEAD import org.tikv.common.region.RegionManager; import org.tikv.common.region.RegionStoreClient; import org.tikv.common.region.RegionStoreClient.RegionStoreClientBuilder; import org.tikv.common.region.TiRegion; import org.tikv.common.region.TiStore; +======= +import org.tikv.common.region.*; +>>>>>>> c95479e... [close #375] warm up RawKVClient while creating it (#367) import org.tikv.common.util.*; import org.tikv.kvproto.Metapb; import org.tikv.raw.RawKVClient; @@ -83,9 +84,50 @@ public TiSession(TiConfiguration conf) { if (this.enableGrpcForward) { logger.info("enable grpc forward for high available"); } + warmUp(); logger.info("TiSession initialized in " + conf.getKvMode() + " mode"); } + private synchronized void warmUp() { + long warmUpStartTime = System.currentTimeMillis(); + try { + this.client = getPDClient(); + this.regionManager = getRegionManager(); + List stores = this.client.getAllStores(ConcreteBackOffer.newGetBackOff()); + // warm up store cache + for (Metapb.Store store : stores) { + this.regionManager.updateStore( + null, + new TiStore(this.client.getStore(ConcreteBackOffer.newGetBackOff(), store.getId()))); + } + ByteString startKey = ByteString.EMPTY; + + do { + TiRegion region = regionManager.getRegionByKey(startKey); + startKey = region.getEndKey(); + } while (!startKey.isEmpty()); + + RawKVClient rawKVClient = createRawClient(); + ByteString exampleKey = ByteString.EMPTY; + Optional prev = rawKVClient.get(exampleKey); + if (prev.isPresent()) { + rawKVClient.delete(exampleKey); + rawKVClient.putIfAbsent(exampleKey, prev.get()); + rawKVClient.put(exampleKey, prev.get()); + } else { + rawKVClient.putIfAbsent(exampleKey, ByteString.EMPTY); + rawKVClient.put(exampleKey, ByteString.EMPTY); + rawKVClient.delete(exampleKey); + } + } catch (Exception e) { + // ignore error + logger.info("warm up fails, ignored ", e); + } finally { + logger.info( + String.format("warm up duration %d ms", System.currentTimeMillis() - warmUpStartTime)); + } + } + @VisibleForTesting public static TiSession create(TiConfiguration conf) { return new TiSession(conf); diff --git a/src/main/java/org/tikv/common/region/RegionCache.java b/src/main/java/org/tikv/common/region/RegionCache.java index 540e8cbad88..80869155cad 100644 --- a/src/main/java/org/tikv/common/region/RegionCache.java +++ b/src/main/java/org/tikv/common/region/RegionCache.java @@ -129,8 +129,12 @@ public synchronized boolean updateStore(TiStore oldStore, TiStore newStore) { if (!newStore.isValid()) { return false; } + if (oldStore == null) { + storeCache.put(newStore.getId(), newStore); + return true; + } TiStore originStore = storeCache.get(oldStore.getId()); - if (originStore == oldStore) { + if (originStore.equals(oldStore)) { storeCache.put(newStore.getId(), newStore); oldStore.markInvalid(); return true; diff --git a/src/main/java/org/tikv/common/region/RegionManager.java b/src/main/java/org/tikv/common/region/RegionManager.java index efc474b7db8..24b9acabe70 100644 --- a/src/main/java/org/tikv/common/region/RegionManager.java +++ b/src/main/java/org/tikv/common/region/RegionManager.java @@ -201,6 +201,8 @@ private TiStore getStoreByIdWithBackOff(long id, BackOffer backOffer) { TiStore store = cache.getStoreById(id); if (store == null) { store = new TiStore(pdClient.getStore(backOffer, id)); + } else { + return store; } // if we did not get store info from pd, remove store from cache if (store.getStore() == null) { diff --git a/src/main/java/org/tikv/raw/SmartRawKVClient.java b/src/main/java/org/tikv/raw/SmartRawKVClient.java index a9c4f4aa4c0..60506379549 100644 --- a/src/main/java/org/tikv/raw/SmartRawKVClient.java +++ b/src/main/java/org/tikv/raw/SmartRawKVClient.java @@ -20,10 +20,18 @@ import io.prometheus.client.Histogram; import java.util.List; import java.util.Map; +<<<<<<< HEAD +======= +import java.util.Optional; +>>>>>>> c95479e... [close #375] warm up RawKVClient while creating it (#367) import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tikv.common.TiConfiguration; import org.tikv.common.exception.CircuitBreakerOpenException; +<<<<<<< HEAD +======= +import org.tikv.common.util.Pair; +>>>>>>> c95479e... [close #375] warm up RawKVClient while creating it (#367) import org.tikv.common.util.ScanOption; import org.tikv.kvproto.Kvrpcpb; import org.tikv.service.failsafe.CircuitBreaker; From 406dc4af3cc38eb3f2f31c04dabb3f0606234ca6 Mon Sep 17 00:00:00 2001 From: birdstorm Date: Fri, 10 Dec 2021 03:57:05 +0800 Subject: [PATCH 2/3] resolve conflicts Signed-off-by: birdstorm --- src/main/java/org/tikv/common/TiSession.java | 18 ++++-------------- .../java/org/tikv/raw/SmartRawKVClient.java | 8 -------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/tikv/common/TiSession.java b/src/main/java/org/tikv/common/TiSession.java index f0fe5dd9ceb..c0d8805e7df 100644 --- a/src/main/java/org/tikv/common/TiSession.java +++ b/src/main/java/org/tikv/common/TiSession.java @@ -30,15 +30,11 @@ import org.tikv.common.exception.TiKVException; import org.tikv.common.key.Key; import org.tikv.common.meta.TiTimestamp; -<<<<<<< HEAD import org.tikv.common.region.RegionManager; import org.tikv.common.region.RegionStoreClient; import org.tikv.common.region.RegionStoreClient.RegionStoreClientBuilder; import org.tikv.common.region.TiRegion; import org.tikv.common.region.TiStore; -======= -import org.tikv.common.region.*; ->>>>>>> c95479e... [close #375] warm up RawKVClient while creating it (#367) import org.tikv.common.util.*; import org.tikv.kvproto.Metapb; import org.tikv.raw.RawKVClient; @@ -109,16 +105,10 @@ private synchronized void warmUp() { RawKVClient rawKVClient = createRawClient(); ByteString exampleKey = ByteString.EMPTY; - Optional prev = rawKVClient.get(exampleKey); - if (prev.isPresent()) { - rawKVClient.delete(exampleKey); - rawKVClient.putIfAbsent(exampleKey, prev.get()); - rawKVClient.put(exampleKey, prev.get()); - } else { - rawKVClient.putIfAbsent(exampleKey, ByteString.EMPTY); - rawKVClient.put(exampleKey, ByteString.EMPTY); - rawKVClient.delete(exampleKey); - } + ByteString prev = rawKVClient.get(exampleKey); + rawKVClient.delete(exampleKey); + rawKVClient.putIfAbsent(exampleKey, prev); + rawKVClient.put(exampleKey, prev); } catch (Exception e) { // ignore error logger.info("warm up fails, ignored ", e); diff --git a/src/main/java/org/tikv/raw/SmartRawKVClient.java b/src/main/java/org/tikv/raw/SmartRawKVClient.java index 60506379549..a9c4f4aa4c0 100644 --- a/src/main/java/org/tikv/raw/SmartRawKVClient.java +++ b/src/main/java/org/tikv/raw/SmartRawKVClient.java @@ -20,18 +20,10 @@ import io.prometheus.client.Histogram; import java.util.List; import java.util.Map; -<<<<<<< HEAD -======= -import java.util.Optional; ->>>>>>> c95479e... [close #375] warm up RawKVClient while creating it (#367) import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tikv.common.TiConfiguration; import org.tikv.common.exception.CircuitBreakerOpenException; -<<<<<<< HEAD -======= -import org.tikv.common.util.Pair; ->>>>>>> c95479e... [close #375] warm up RawKVClient while creating it (#367) import org.tikv.common.util.ScanOption; import org.tikv.kvproto.Kvrpcpb; import org.tikv.service.failsafe.CircuitBreaker; From 2df25a0ec6ae86a176e9fa0941bdf1be5ce8d3e8 Mon Sep 17 00:00:00 2001 From: birdstorm Date: Fri, 10 Dec 2021 03:58:37 +0800 Subject: [PATCH 3/3] revert some changes Signed-off-by: birdstorm --- src/main/java/org/tikv/common/TiSession.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tikv/common/TiSession.java b/src/main/java/org/tikv/common/TiSession.java index c0d8805e7df..3ca4d2b5a84 100644 --- a/src/main/java/org/tikv/common/TiSession.java +++ b/src/main/java/org/tikv/common/TiSession.java @@ -20,7 +20,10 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.protobuf.ByteString; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.Collectors;