diff --git a/README.md b/README.md index b0077027ad..6280a6ddee 100644 --- a/README.md +++ b/README.md @@ -82,6 +82,21 @@ public class Main { The following includes JVM related parameters. +#### tikv.configuration_file +- tikv java client configuration file +- default: null + +This parameter can be passed by `-Dtikv.configuration_file=/path/to/tikv_client_config.properties`. + +Here is an example of `tikv_client_config.properties`. + +``` +tikv.grpc.timeout_in_ms=150ms +tikv.grpc.forward_timeout_in_ms=200ms +tikv.metrics.enable=true +tikv.metrics.port=3140 +``` + #### tikv.pd.addresses - pd addresses, separated by comma - default: 127.0.0.1:2379 diff --git a/src/main/java/org/tikv/common/ConfigUtils.java b/src/main/java/org/tikv/common/ConfigUtils.java index 8374d6feb5..8d06e29e35 100644 --- a/src/main/java/org/tikv/common/ConfigUtils.java +++ b/src/main/java/org/tikv/common/ConfigUtils.java @@ -19,6 +19,8 @@ import org.tikv.common.util.BackOffer; import org.tikv.kvproto.Kvrpcpb; public class ConfigUtils { + public static final String TIKV_CONFIGURATION_FILE = "tikv.configuration_file"; + public static final String TIKV_PD_ADDRESSES = "tikv.pd.addresses"; public static final String TIKV_GRPC_TIMEOUT = "tikv.grpc.timeout_in_ms"; public static final String TIKV_GRPC_INGEST_TIMEOUT = "tikv.grpc.ingest_timeout_in_ms"; diff --git a/src/main/java/org/tikv/common/TiConfiguration.java b/src/main/java/org/tikv/common/TiConfiguration.java index 047e7b7f1f..14f67d2ac9 100644 --- a/src/main/java/org/tikv/common/TiConfiguration.java +++ b/src/main/java/org/tikv/common/TiConfiguration.java @@ -18,6 +18,8 @@ package org.tikv.common; import static org.tikv.common.ConfigUtils.*; import io.grpc.Metadata; +import java.io.FileInputStream; +import java.io.IOException; import java.io.Serializable; import java.net.URI; import java.util.*; @@ -39,8 +41,11 @@ public class TiConfiguration implements Serializable { Metadata.Key.of("pd-forwarded-host", Metadata.ASCII_STRING_MARSHALLER); static { + // priority: system environment > config file > default loadFromSystemProperties(); + loadFromConfigurationFile(); loadFromDefaultProperties(); + listAll(); } private static void loadFromSystemProperties() { @@ -51,6 +56,24 @@ public class TiConfiguration implements Serializable { } } + private static void loadFromConfigurationFile() { + Optional file = getOption(TIKV_CONFIGURATION_FILE); + if (file.isPresent()) { + Properties properties = new Properties(); + try { + properties.load(new FileInputStream(file.get())); + } catch (IOException e) { + logger.error("load config file error, path = " + file.get(), e); + } + for (String key : properties.stringPropertyNames()) { + if (key.startsWith("tikv.")) { + String value = properties.getProperty(key); + setIfMissing(key, value); + } + } + } + } + private static void loadFromDefaultProperties() { setIfMissing(TIKV_PD_ADDRESSES, DEF_PD_ADDRESSES); setIfMissing(TIKV_GRPC_TIMEOUT, DEF_TIMEOUT); @@ -94,7 +117,7 @@ public class TiConfiguration implements Serializable { } public static void listAll() { - logger.info(new ArrayList<>(settings.entrySet()).toString()); + logger.warn("static configurations are:" + new ArrayList<>(settings.entrySet()).toString()); } private static void set(String key, String value) { diff --git a/src/test/java/org/tikv/common/TiConfigurationTest.java b/src/test/java/org/tikv/common/TiConfigurationTest.java new file mode 100644 index 0000000000..995c62bf3b --- /dev/null +++ b/src/test/java/org/tikv/common/TiConfigurationTest.java @@ -0,0 +1,30 @@ +/* + * Copyright 2021 PingCAP, Inc. + * + * 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, + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.tikv.common; + +import static org.junit.Assert.assertEquals; + +import org.junit.Ignore; + +public class TiConfigurationTest { + + // Set `-Dtikv.configuration_file=src/test/resources/tikv_client_config.properties` to test + @Ignore + public void configFileTest() { + TiConfiguration conf = TiConfiguration.createRawDefault(); + assertEquals("configFileTest", conf.getDBPrefix()); + } +} diff --git a/src/test/resources/tikv_client_config.properties b/src/test/resources/tikv_client_config.properties new file mode 100644 index 0000000000..cc08242c50 --- /dev/null +++ b/src/test/resources/tikv_client_config.properties @@ -0,0 +1 @@ +tikv.db_prefix=configFileTest \ No newline at end of file