This is an automated email from the ASF dual-hosted git repository. apurtell pushed a commit to branch branch-1 in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-1 by this push: new cad3630 HBASE-21727 Simplify documentation around client timeout cad3630 is described below commit cad3630c70011e4b9878dc106341a460b8fb6487 Author: Peter Somogyi <psomo...@apache.org> AuthorDate: Tue Jan 15 15:24:34 2019 +0100 HBASE-21727 Simplify documentation around client timeout Signed-off-by: Michael Stack <st...@apache.org> Conflicts: hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java src/main/asciidoc/_chapters/configuration.adoc src/main/asciidoc/_chapters/troubleshooting.adoc Amending-Author: Andrew Purtell <apurt...@apache.org> --- .../apache/hadoop/hbase/client/ClientScanner.java | 7 ++---- .../hadoop/hbase/client/RpcRetryingCaller.java | 20 ++++++++++++--- .../apache/hadoop/hbase/HBaseConfiguration.java | 29 ---------------------- .../java/org/apache/hadoop/hbase/HConstants.java | 2 +- .../hadoop/hbase/TestHBaseConfiguration.java | 25 ------------------- src/main/asciidoc/_chapters/configuration.adoc | 25 ++++++++++++++++++- src/main/asciidoc/_chapters/troubleshooting.adoc | 4 +-- 7 files changed, 45 insertions(+), 67 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java index 8665eea..143f202 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ClientScanner.java @@ -31,7 +31,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.DoNotRetryIOException; -import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.NotServingRegionException; @@ -114,10 +113,8 @@ public abstract class ClientScanner extends AbstractClientScanner { this.maxScannerResultSize = conf.getLong(HConstants.HBASE_CLIENT_SCANNER_MAX_RESULT_SIZE_KEY, HConstants.DEFAULT_HBASE_CLIENT_SCANNER_MAX_RESULT_SIZE); } - this.scannerTimeout = - HBaseConfiguration.getInt(conf, HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, - HConstants.HBASE_REGIONSERVER_LEASE_PERIOD_KEY, - HConstants.DEFAULT_HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD); + this.scannerTimeout = conf.getInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, + HConstants.DEFAULT_HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD); // check if application wants to collect scan metrics initScanMetrics(scan); diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCaller.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCaller.java index af24d5c..10f88e3 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCaller.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCaller.java @@ -36,6 +36,7 @@ import org.apache.hadoop.hbase.exceptions.PreemptiveFastFailException; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.ExceptionUtil; import org.apache.hadoop.ipc.RemoteException; +import org.apache.hadoop.util.StringUtils; import com.google.protobuf.ServiceException; @@ -149,10 +150,21 @@ public class RpcRetryingCaller<T> { interceptor.handleFailure(context, t); t = translateException(t); if (tries > startLogErrorsCnt) { - LOG.info("Call exception, tries=" + tries + ", retries=" + retries + ", started=" + - (EnvironmentEdgeManager.currentTime() - this.globalStartTime) + " ms ago, " - + "cancelled=" + cancelled.get() + ", msg=" - + t.getMessage() + " " + callable.getExceptionMessageAdditionalDetail()); + if (LOG.isInfoEnabled()) { + StringBuilder builder = new StringBuilder("Call exception, tries=").append(tries) + .append(", retries=").append(retries).append(", started=") + .append(EnvironmentEdgeManager.currentTime() - this.globalStartTime) + .append(" ms ago, ").append("cancelled=").append(cancelled.get()) + .append(", msg=").append(t.getMessage()) + .append(", details=").append(callable.getExceptionMessageAdditionalDetail()) + .append(", see https://s.apache.org/timeout"); + if (LOG.isDebugEnabled()) { + builder.append(", exception=").append(StringUtils.stringifyException(t)); + LOG.debug(builder.toString()); + } else { + LOG.info(builder.toString()); + } + } } callable.throwable(t, retries != 1); diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HBaseConfiguration.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HBaseConfiguration.java index 94d4483..c984aeb 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/HBaseConfiguration.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/HBaseConfiguration.java @@ -172,35 +172,6 @@ public class HBaseConfiguration extends Configuration { } /** - * Get the value of the <code>name</code> property as an <code>int</code>, possibly - * referring to the deprecated name of the configuration property. - * If no such property exists, the provided default value is returned, - * or if the specified value is not a valid <code>int</code>, - * then an error is thrown. - * - * @param name property name. - * @param deprecatedName a deprecatedName for the property to use - * if non-deprecated name is not used - * @param defaultValue default value. - * @throws NumberFormatException when the value is invalid - * @return property value as an <code>int</code>, - * or <code>defaultValue</code>. - */ - // TODO: developer note: This duplicates the functionality of deprecated - // property support in Configuration in Hadoop 2. But since Hadoop-1 does not - // contain these changes, we will do our own as usual. Replace these when H2 is default. - public static int getInt(Configuration conf, String name, - String deprecatedName, int defaultValue) { - if (conf.get(deprecatedName) != null) { - LOG.warn(String.format("Config option \"%s\" is deprecated. Instead, use \"%s\"" - , deprecatedName, name)); - return conf.getInt(deprecatedName, defaultValue); - } else { - return conf.getInt(name, defaultValue); - } - } - - /** * Get the password from the Configuration instance using the * getPassword method if it exists. If not, then fall back to the * general get method for configuration elements. diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java index 3d1115b..594bb0e 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java @@ -302,7 +302,7 @@ public final class HConstants { /** Parameter name for HBase client operation timeout. */ public static final String HBASE_CLIENT_OPERATION_TIMEOUT = "hbase.client.operation.timeout"; - /** Parameter name for HBase client operation timeout. */ + /** Parameter name for HBase client meta operation timeout. */ public static final String HBASE_CLIENT_META_OPERATION_TIMEOUT = "hbase.client.meta.operation.timeout"; diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/TestHBaseConfiguration.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/TestHBaseConfiguration.java index 1aa052b..d8aed04 100644 --- a/hbase-common/src/test/java/org/apache/hadoop/hbase/TestHBaseConfiguration.java +++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/TestHBaseConfiguration.java @@ -51,31 +51,6 @@ public class TestHBaseConfiguration { } @Test - public void testGetIntDeprecated() { - int VAL = 1, VAL2 = 2; - String NAME = "foo"; - String DEPRECATED_NAME = "foo.deprecated"; - - Configuration conf = HBaseConfiguration.create(); - conf.setInt(NAME, VAL); - assertEquals(VAL, HBaseConfiguration.getInt(conf, NAME, DEPRECATED_NAME, 0)); - - conf = HBaseConfiguration.create(); - conf.setInt(DEPRECATED_NAME, VAL); - assertEquals(VAL, HBaseConfiguration.getInt(conf, NAME, DEPRECATED_NAME, 0)); - - conf = HBaseConfiguration.create(); - conf.setInt(DEPRECATED_NAME, VAL); - conf.setInt(NAME, VAL); - assertEquals(VAL, HBaseConfiguration.getInt(conf, NAME, DEPRECATED_NAME, 0)); - - conf = HBaseConfiguration.create(); - conf.setInt(DEPRECATED_NAME, VAL); - conf.setInt(NAME, VAL2); // deprecated value will override this - assertEquals(VAL, HBaseConfiguration.getInt(conf, NAME, DEPRECATED_NAME, 0)); - } - - @Test public void testSubset() throws Exception { Configuration conf = HBaseConfiguration.create(); // subset is used in TableMapReduceUtil#initCredentials to support different security diff --git a/src/main/asciidoc/_chapters/configuration.adoc b/src/main/asciidoc/_chapters/configuration.adoc index 6e930aa..5e7d16d 100644 --- a/src/main/asciidoc/_chapters/configuration.adoc +++ b/src/main/asciidoc/_chapters/configuration.adoc @@ -634,7 +634,30 @@ Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "localhost"); // Here we are running zookeeper locally ---- -If multiple ZooKeeper instances make up your ZooKeeper ensemble, they may be specified in a comma-separated list (just as in the _hbase-site.xml_ file). This populated `Configuration` instance can then be passed to an link:http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html[Table], and so on. +If multiple ZooKeeper instances make up your ZooKeeper ensemble, they may be specified in a comma-separated list (just as in the _hbase-site.xml_ file). This populated `Configuration` instance can then be passed to an link:https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/Table.html[Table], and so on. + +[[config_timeouts]] +=== Timeout settings + +HBase provides a wide variety of timeout settings to limit the execution time of various remote operations. + +* hbase.rpc.timeout +* hbase.rpc.read.timeout +* hbase.rpc.write.timeout +* hbase.client.operation.timeout +* hbase.client.meta.operation.timeout +* hbase.client.scanner.timeout.period + +The `hbase.rpc.timeout` property limits how long a single RPC call can run before timing out. +To fine tune read or write related RPC timeouts set `hbase.rpc.read.timeout` and `hbase.rpc.write.timeout` configuration properties. +In the absence of these properties `hbase.rpc.timeout` will be used. + +A higher-level timeout is `hbase.client.operation.timeout` which is valid for each client call. +When an RPC call fails for instance for a timeout due to `hbase.rpc.timeout` it will be retried until `hbase.client.operation.timeout` is reached. +Client operation timeout for system tables can be fine tuned by setting `hbase.client.meta.operation.timeout` configuration value. +When this is not set its value will use `hbase.client.operation.timeout`. + +Timeout for scan operations is controlled differently. Use `hbase.client.scanner.timeout.period` property to set this timeout. [[example_config]] == Example Configurations diff --git a/src/main/asciidoc/_chapters/troubleshooting.adoc b/src/main/asciidoc/_chapters/troubleshooting.adoc index 1776c9e..2166f60 100644 --- a/src/main/asciidoc/_chapters/troubleshooting.adoc +++ b/src/main/asciidoc/_chapters/troubleshooting.adoc @@ -582,8 +582,8 @@ See also Jesse Andersen's link:http://blog.cloudera.com/blog/2014/04/how-to-use- In some situations clients that fetch data from a RegionServer get a LeaseException instead of the usual <<trouble.client.scantimeout>>. Usually the source of the exception is `org.apache.hadoop.hbase.regionserver.Leases.removeLease(Leases.java:230)` (line number may vary). It tends to happen in the context of a slow/freezing `RegionServer#next` call. -It can be prevented by having `hbase.rpc.timeout` > `hbase.regionserver.lease.period`. -Harsh J investigated the issue as part of the mailing list thread link:http://mail-archives.apache.org/mod_mbox/hbase-user/201209.mbox/%3CCAOcnVr3R-LqtKhFsk8Bhrm-YW2i9O6J6Fhjz2h7q6_sxvwd2yw%40mail.gmail.com%3E[HBase, mail # user - Lease does not exist exceptions] +It can be prevented by having `hbase.rpc.timeout` > `hbase.client.scanner.timeout.period`. +Harsh J investigated the issue as part of the mailing list thread link:https://mail-archives.apache.org/mod_mbox/hbase-user/201209.mbox/%3CCAOcnVr3R-LqtKhFsk8Bhrm-YW2i9O6J6Fhjz2h7q6_sxvwd2yw%40mail.gmail.com%3E[HBase, mail # user - Lease does not exist exceptions] [[trouble.client.scarylogs]] === Shell or client application throws lots of scary exceptions during normal operation