From 861f174524aa21a1178d95cb5531e840e60a4304 Mon Sep 17 00:00:00 2001 From: iosmanthus Date: Thu, 9 Dec 2021 23:43:50 +0800 Subject: [PATCH 1/2] warm up SmartRawKVClient while creating it Signed-off-by: iosmanthus --- src/main/java/org/tikv/common/TiSession.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/tikv/common/TiSession.java b/src/main/java/org/tikv/common/TiSession.java index d1171dbcf4f..d73d65807f9 100644 --- a/src/main/java/org/tikv/common/TiSession.java +++ b/src/main/java/org/tikv/common/TiSession.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,6 +54,7 @@ * thread-safe but it's also recommended to have multiple session avoiding lock contention */ public class TiSession implements AutoCloseable { + private static final AtomicBoolean warmed = new AtomicBoolean(false); private static final Logger logger = LoggerFactory.getLogger(TiSession.class); private static final Map sessionCachedMap = new HashMap<>(); private final TiConfiguration conf; @@ -129,7 +131,18 @@ public RawKVClient createRawClient() { public SmartRawKVClient createSmartRawClient() { RawKVClient rawKVClient = createRawClient(); - return new SmartRawKVClient(rawKVClient, getConf()); + SmartRawKVClient client = new SmartRawKVClient(rawKVClient, getConf()); + + // Warm up SmartRawKVClient to avoid the first slow call. + if (warmed.compareAndSet(false, true)) { + try { + logger.info("Warming up SmartRawKVClient"); + client.get(ByteString.EMPTY); + } catch (final TiKVException ignored) { + } + } + + return client; } public KVClient createKVClient() { From b7a850c45399d773b632b14895b110ab8f1b654c Mon Sep 17 00:00:00 2001 From: iosmanthus Date: Thu, 9 Dec 2021 23:53:20 +0800 Subject: [PATCH 2/2] move warm up logic into constructor of SmartRawKVClient Signed-off-by: iosmanthus --- src/main/java/org/tikv/common/TiSession.java | 15 +-------------- src/main/java/org/tikv/raw/SmartRawKVClient.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/tikv/common/TiSession.java b/src/main/java/org/tikv/common/TiSession.java index d73d65807f9..d1171dbcf4f 100644 --- a/src/main/java/org/tikv/common/TiSession.java +++ b/src/main/java/org/tikv/common/TiSession.java @@ -26,7 +26,6 @@ import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,7 +53,6 @@ * thread-safe but it's also recommended to have multiple session avoiding lock contention */ public class TiSession implements AutoCloseable { - private static final AtomicBoolean warmed = new AtomicBoolean(false); private static final Logger logger = LoggerFactory.getLogger(TiSession.class); private static final Map sessionCachedMap = new HashMap<>(); private final TiConfiguration conf; @@ -131,18 +129,7 @@ public RawKVClient createRawClient() { public SmartRawKVClient createSmartRawClient() { RawKVClient rawKVClient = createRawClient(); - SmartRawKVClient client = new SmartRawKVClient(rawKVClient, getConf()); - - // Warm up SmartRawKVClient to avoid the first slow call. - if (warmed.compareAndSet(false, true)) { - try { - logger.info("Warming up SmartRawKVClient"); - client.get(ByteString.EMPTY); - } catch (final TiKVException ignored) { - } - } - - return client; + return new SmartRawKVClient(rawKVClient, getConf()); } public KVClient createKVClient() { diff --git a/src/main/java/org/tikv/raw/SmartRawKVClient.java b/src/main/java/org/tikv/raw/SmartRawKVClient.java index 33a8981e81b..a9fe1fa58a3 100644 --- a/src/main/java/org/tikv/raw/SmartRawKVClient.java +++ b/src/main/java/org/tikv/raw/SmartRawKVClient.java @@ -21,10 +21,12 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tikv.common.TiConfiguration; import org.tikv.common.exception.CircuitBreakerOpenException; +import org.tikv.common.exception.TiKVException; import org.tikv.common.util.Pair; import org.tikv.common.util.ScanOption; import org.tikv.kvproto.Kvrpcpb; @@ -33,6 +35,7 @@ public class SmartRawKVClient implements RawKVClientBase { private static final Logger logger = LoggerFactory.getLogger(SmartRawKVClient.class); + private static final AtomicBoolean warmed = new AtomicBoolean(false); private static final Histogram REQUEST_LATENCY = Histogram.build() @@ -66,6 +69,15 @@ public class SmartRawKVClient implements RawKVClientBase { private final CircuitBreaker circuitBreaker; public SmartRawKVClient(RawKVClientBase client, TiConfiguration conf) { + // Warm up SmartRawKVClient to avoid the first slow call. + if (warmed.compareAndSet(false, true)) { + try { + logger.info("Warming up SmartRawKVClient"); + client.get(ByteString.EMPTY); + } catch (final TiKVException ignored) { + } + } + this.client = client; this.circuitBreaker = new CircuitBreakerImpl(conf); }