diff --git a/pom.xml b/pom.xml
index dc066210875..f50de0e1a80 100644
--- a/pom.xml
+++ b/pom.xml
@@ -539,6 +539,14 @@
true
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.0.0-M5
+
+ always
+
+
diff --git a/src/main/java/org/tikv/common/TiSession.java b/src/main/java/org/tikv/common/TiSession.java
index f1f9790945e..42eb278ee98 100644
--- a/src/main/java/org/tikv/common/TiSession.java
+++ b/src/main/java/org/tikv/common/TiSession.java
@@ -39,6 +39,7 @@
import org.tikv.common.region.TiRegion;
import org.tikv.common.region.TiStore;
import org.tikv.common.util.*;
+import org.tikv.kvproto.Errorpb;
import org.tikv.kvproto.Metapb;
import org.tikv.kvproto.Pdpb;
import org.tikv.raw.RawKVClient;
@@ -99,6 +100,13 @@ private synchronized void warmUp() {
BackOffer backOffer = ConcreteBackOffer.newRawKVBackOff();
try {
+ // let JVM ClassLoader load gRPC error related classes
+ // this operation may cost 100ms
+ Errorpb.Error.newBuilder()
+ .setNotLeader(Errorpb.NotLeader.newBuilder().build())
+ .build()
+ .toString();
+
this.client = getPDClient();
this.regionManager = getRegionManager();
List stores = this.client.getAllStores(backOffer);
diff --git a/src/test/java/org/tikv/raw/WarmupTest.java b/src/test/java/org/tikv/raw/WarmupTest.java
new file mode 100644
index 00000000000..a2aa6e5f3e1
--- /dev/null
+++ b/src/test/java/org/tikv/raw/WarmupTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2021 TiKV Project Authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.tikv.raw;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.tikv.BaseRawKVTest;
+import org.tikv.common.TiConfiguration;
+import org.tikv.common.TiSession;
+import org.tikv.kvproto.Errorpb;
+
+public class WarmupTest extends BaseRawKVTest {
+
+ @Test
+ public void testErrorpbToStringEnableWarmup() throws Exception {
+ TiConfiguration conf = createTiConfiguration();
+ TiSession session = TiSession.create(conf);
+
+ long start = System.currentTimeMillis();
+ Errorpb.Error.newBuilder()
+ .setNotLeader(Errorpb.NotLeader.newBuilder().build())
+ .build()
+ .toString();
+ long end = System.currentTimeMillis();
+ assertTrue(end - start < 10);
+ session.close();
+ }
+
+ @Test
+ public void testErrorpbToStringDisableWarmup() throws Exception {
+ TiConfiguration conf = createTiConfiguration();
+ conf.setWarmUpEnable(false);
+ TiSession session = TiSession.create(conf);
+
+ long start = System.currentTimeMillis();
+ Errorpb.Error.newBuilder()
+ .setNotLeader(Errorpb.NotLeader.newBuilder().build())
+ .build()
+ .toString();
+ long end = System.currentTimeMillis();
+ assertTrue(end - start > 10);
+ session.close();
+ }
+}