HBASE-15645 hbase.rpc.timeout is not used in operations of HTable Signed-off-by: stack <[email protected]>
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/48f158f0 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/48f158f0 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/48f158f0 Branch: refs/heads/branch-1.0 Commit: 48f158f0a834c28ec06a88aa39389da685ec7a0e Parents: 0b20b27 Author: Phil Yang <[email protected]> Authored: Tue Apr 26 18:02:22 2016 +0800 Committer: stack <[email protected]> Committed: Tue Apr 26 10:55:36 2016 -0700 ---------------------------------------------------------------------- .../apache/hadoop/hbase/client/HBaseAdmin.java | 5 ++- .../org/apache/hadoop/hbase/client/HTable.java | 43 +++++++++++++++----- .../apache/hadoop/hbase/client/HTablePool.java | 16 ++++++++ .../hadoop/hbase/client/RpcRetryingCaller.java | 16 ++++++-- .../hbase/client/RpcRetryingCallerFactory.java | 25 +++++++++++- .../client/StatsTrackingRpcRetryingCaller.java | 2 +- .../org/apache/hadoop/hbase/client/Table.java | 31 ++++++++++++++ .../client/TestFastFailWithoutTestUtil.java | 2 +- .../org/apache/hadoop/hbase/HConstants.java | 4 +- .../src/main/resources/hbase-default.xml | 11 ++++- .../hadoop/hbase/rest/client/RemoteHTable.java | 16 ++++++++ .../hadoop/hbase/client/HTableWrapper.java | 16 ++++++++ .../org/apache/hadoop/hbase/client/TestHCM.java | 26 +++++++++++- 13 files changed, 191 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java index 8cd3037..73d8c89 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java @@ -183,6 +183,7 @@ public class HBaseAdmin implements Admin { private boolean cleanupConnectionOnClose = false; // close the connection in close() private boolean closed = false; private int operationTimeout; + private int rpcTimeout; private RpcRetryingCallerFactory rpcCallerFactory; @@ -237,6 +238,8 @@ public class HBaseAdmin implements Admin { "hbase.client.retries.longer.multiplier", 10); this.operationTimeout = this.conf.getInt(HConstants.HBASE_CLIENT_OPERATION_TIMEOUT, HConstants.DEFAULT_HBASE_CLIENT_OPERATION_TIMEOUT); + this.rpcTimeout = this.conf.getInt(HConstants.HBASE_RPC_TIMEOUT_KEY, + HConstants.DEFAULT_HBASE_RPC_TIMEOUT); this.rpcCallerFactory = RpcRetryingCallerFactory.instantiate(this.conf); } @@ -3596,7 +3599,7 @@ public class HBaseAdmin implements Admin { } private <V> V executeCallable(MasterCallable<V> callable) throws IOException { - RpcRetryingCaller<V> caller = rpcCallerFactory.newCaller(); + RpcRetryingCaller<V> caller = rpcCallerFactory.newCaller(rpcTimeout); try { return caller.callWithRetries(callable, operationTimeout); } finally { http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java index 533cbab..2bc0791 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java @@ -129,7 +129,8 @@ public class HTable implements HTableInterface, RegionLocator { protected int scannerCaching; protected long scannerMaxResultSize; private ExecutorService pool; // For Multi & Scan - private int operationTimeout; + private int operationTimeout; // global timeout for each blocking method with retrying rpc + private int rpcTimeout; // timeout for each rpc request private final boolean cleanupPoolOnClose; // shutdown the pool in close() private final boolean cleanupConnectionOnClose; // close the connection in close() private Consistency defaultConsistency = Consistency.STRONG; @@ -360,6 +361,8 @@ public class HTable implements HTableInterface, RegionLocator { this.operationTimeout = tableName.isSystemTable() ? tableConfiguration.getMetaOperationTimeout() : tableConfiguration.getOperationTimeout(); + this.rpcTimeout = configuration.getInt(HConstants.HBASE_RPC_TIMEOUT_KEY, + HConstants.DEFAULT_HBASE_RPC_TIMEOUT); this.scannerCaching = tableConfiguration.getScannerCaching(); this.scannerMaxResultSize = tableConfiguration.getScannerMaxResultSize(); if (this.rpcCallerFactory == null) { @@ -808,7 +811,8 @@ public class HTable implements HTableInterface, RegionLocator { } } }; - return rpcCallerFactory.<Result>newCaller().callWithRetries(callable, this.operationTimeout); + return rpcCallerFactory.<Result>newCaller(rpcTimeout).callWithRetries(callable, + this.operationTimeout); } /** @@ -913,7 +917,8 @@ public class HTable implements HTableInterface, RegionLocator { } } }; - return rpcCallerFactory.<Result>newCaller().callWithRetries(callable, this.operationTimeout); + return rpcCallerFactory.<Result>newCaller(rpcTimeout).callWithRetries(callable, + this.operationTimeout); } // Call that takes into account the replica @@ -1029,7 +1034,8 @@ public class HTable implements HTableInterface, RegionLocator { } } }; - rpcCallerFactory.<Boolean> newCaller().callWithRetries(callable, this.operationTimeout); + rpcCallerFactory.<Boolean> newCaller(rpcTimeout).callWithRetries(callable, + this.operationTimeout); } /** @@ -1146,7 +1152,8 @@ public class HTable implements HTableInterface, RegionLocator { } } }; - return rpcCallerFactory.<Result> newCaller().callWithRetries(callable, this.operationTimeout); + return rpcCallerFactory.<Result> newCaller(rpcTimeout).callWithRetries(callable, + this.operationTimeout); } /** @@ -1177,7 +1184,8 @@ public class HTable implements HTableInterface, RegionLocator { } } }; - return rpcCallerFactory.<Result> newCaller().callWithRetries(callable, this.operationTimeout); + return rpcCallerFactory.<Result> newCaller(rpcTimeout).callWithRetries(callable, + this.operationTimeout); } /** @@ -1244,7 +1252,8 @@ public class HTable implements HTableInterface, RegionLocator { } } }; - return rpcCallerFactory.<Long> newCaller().callWithRetries(callable, this.operationTimeout); + return rpcCallerFactory.<Long> newCaller(rpcTimeout).callWithRetries(callable, + this.operationTimeout); } /** @@ -1273,7 +1282,8 @@ public class HTable implements HTableInterface, RegionLocator { } } }; - return rpcCallerFactory.<Boolean> newCaller().callWithRetries(callable, this.operationTimeout); + return rpcCallerFactory.<Boolean> newCaller(rpcTimeout).callWithRetries(callable, + this.operationTimeout); } /** @@ -1303,7 +1313,8 @@ public class HTable implements HTableInterface, RegionLocator { } } }; - return rpcCallerFactory.<Boolean> newCaller().callWithRetries(callable, this.operationTimeout); + return rpcCallerFactory.<Boolean> newCaller(rpcTimeout).callWithRetries(callable, + this.operationTimeout); } /** @@ -1332,7 +1343,8 @@ public class HTable implements HTableInterface, RegionLocator { } } }; - return rpcCallerFactory.<Boolean> newCaller().callWithRetries(callable, this.operationTimeout); + return rpcCallerFactory.<Boolean> newCaller(rpcTimeout).callWithRetries(callable, + this.operationTimeout); } /** @@ -1362,7 +1374,8 @@ public class HTable implements HTableInterface, RegionLocator { } } }; - return rpcCallerFactory.<Boolean> newCaller().callWithRetries(callable, this.operationTimeout); + return rpcCallerFactory.<Boolean> newCaller(rpcTimeout).callWithRetries(callable, + this.operationTimeout); } /** @@ -1815,6 +1828,14 @@ public class HTable implements HTableInterface, RegionLocator { return operationTimeout; } + @Override public void setRpcTimeout(int rpcTimeout) { + this.rpcTimeout = rpcTimeout; + } + + @Override public int getRpcTimeout() { + return rpcTimeout; + } + @Override public String toString() { return tableName + ";" + connection; http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java index 4b998a6..d837bf8 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTablePool.java @@ -672,5 +672,21 @@ public class HTablePool implements Closeable { checkState(); return table.checkAndMutate(row, family, qualifier, compareOp, value, mutation); } + + @Override public void setOperationTimeout(int operationTimeout) { + table.setOperationTimeout(operationTimeout); + } + + @Override public int getOperationTimeout() { + return table.getOperationTimeout(); + } + + @Override public void setRpcTimeout(int rpcTimeout) { + table.setRpcTimeout(rpcTimeout); + } + + @Override public int getRpcTimeout() { + return table.getRpcTimeout(); + } } } http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCaller.java ---------------------------------------------------------------------- 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 49c7efd..77ed031 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 @@ -63,21 +63,23 @@ public class RpcRetryingCaller<T> { private final long pause; private final int retries; + private final int rpcTimeout;// timeout for each rpc request private final AtomicBoolean cancelled = new AtomicBoolean(false); private final RetryingCallerInterceptor interceptor; private final RetryingCallerInterceptorContext context; public RpcRetryingCaller(long pause, int retries, int startLogErrorsCnt) { - this(pause, retries, RetryingCallerInterceptorFactory.NO_OP_INTERCEPTOR, startLogErrorsCnt); + this(pause, retries, RetryingCallerInterceptorFactory.NO_OP_INTERCEPTOR, startLogErrorsCnt, 0); } public RpcRetryingCaller(long pause, int retries, - RetryingCallerInterceptor interceptor, int startLogErrorsCnt) { + RetryingCallerInterceptor interceptor, int startLogErrorsCnt, int rpcTimeout) { this.pause = pause; this.retries = retries; this.interceptor = interceptor; context = interceptor.createEmptyContext(); this.startLogErrorsCnt = startLogErrorsCnt; + this.rpcTimeout = rpcTimeout; } private int getRemainingTime(int callTimeout) { @@ -97,6 +99,14 @@ public class RpcRetryingCaller<T> { } } + private int getTimeout(int callTimeout){ + int timeout = getRemainingTime(callTimeout); + if (timeout <= 0 || rpcTimeout > 0 && rpcTimeout < timeout){ + timeout = rpcTimeout; + } + return timeout; + } + public void cancel(){ cancelled.set(true); synchronized (cancelled){ @@ -123,7 +133,7 @@ public class RpcRetryingCaller<T> { try { callable.prepare(tries != 0); // if called with false, check table status on ZK interceptor.intercept(context.prepare(callable, tries)); - return callable.call(getRemainingTime(callTimeout)); + return callable.call(getTimeout(callTimeout)); } catch (PreemptiveFastFailException e) { throw e; } catch (Throwable t) { http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.java index 1bf7bb0..09b70b8 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.java @@ -33,6 +33,7 @@ public class RpcRetryingCallerFactory { protected final Configuration conf; private final long pause; private final int retries; + private final int rpcTimeout; private final RetryingCallerInterceptor interceptor; private final int startLogErrorsCnt; private final boolean enableBackPressure; @@ -53,6 +54,7 @@ public class RpcRetryingCallerFactory { this.interceptor = interceptor; enableBackPressure = conf.getBoolean(HConstants.ENABLE_CLIENT_BACKPRESSURE, HConstants.DEFAULT_ENABLE_CLIENT_BACKPRESSURE); + rpcTimeout = conf.getInt(HConstants.HBASE_RPC_TIMEOUT_KEY,HConstants.DEFAULT_HBASE_RPC_TIMEOUT); } /** @@ -62,11 +64,32 @@ public class RpcRetryingCallerFactory { this.stats = statisticTracker; } + /** + * Create a new RetryingCaller with specific rpc timeout. + */ + public <T> RpcRetryingCaller<T> newCaller(int rpcTimeout) { + // We store the values in the factory instance. This way, constructing new objects + // is cheap as it does not require parsing a complex structure. + RpcRetryingCaller<T> caller = new RpcRetryingCaller<T>(pause, retries, interceptor, + startLogErrorsCnt, rpcTimeout); + + // wrap it with stats, if we are tracking them + if (enableBackPressure && this.stats != null) { + caller = new StatsTrackingRpcRetryingCaller<T>(pause, retries, interceptor, + startLogErrorsCnt, stats); + } + + return caller; + } + + /** + * Create a new RetryingCaller with configured rpc timeout. + */ public <T> RpcRetryingCaller<T> newCaller() { // We store the values in the factory instance. This way, constructing new objects // is cheap as it does not require parsing a complex structure. RpcRetryingCaller<T> caller = new RpcRetryingCaller<T>(pause, retries, interceptor, - startLogErrorsCnt); + startLogErrorsCnt, rpcTimeout); // wrap it with stats, if we are tracking them if (enableBackPressure && this.stats != null) { http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-client/src/main/java/org/apache/hadoop/hbase/client/StatsTrackingRpcRetryingCaller.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/StatsTrackingRpcRetryingCaller.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/StatsTrackingRpcRetryingCaller.java index fc175bb..cbd625d 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/StatsTrackingRpcRetryingCaller.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/StatsTrackingRpcRetryingCaller.java @@ -39,7 +39,7 @@ public class StatsTrackingRpcRetryingCaller<T> extends RpcRetryingCaller<T> { public StatsTrackingRpcRetryingCaller(long pause, int retries, RetryingCallerInterceptor interceptor, int startLogErrorsCnt, ServerStatisticTracker stats) { - super(pause, retries, interceptor, startLogErrorsCnt); + super(pause, retries, interceptor, startLogErrorsCnt, 0); this.stats = stats; } http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Table.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Table.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Table.java index 9a6744b..8c6169d 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Table.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Table.java @@ -595,4 +595,35 @@ public interface Table extends Closeable { */ boolean checkAndMutate(byte[] row, byte[] family, byte[] qualifier, CompareFilter.CompareOp compareOp, byte[] value, RowMutations mutation) throws IOException; + + /** + * Set timeout (millisecond) of each operation in this Table instance, will override the value + * of hbase.client.operation.timeout in configuration. + * Operation timeout is a top-level restriction that makes sure a blocking method will not be + * blocked more than this. In each operation, if rpc request fails because of timeout or + * other reason, it will retry until success or throw a RetriesExhaustedException. But if the + * total time being blocking reach the operation timeout before retries exhausted, it will break + * early and throw SocketTimeoutException. + * @param operationTimeout the total timeout of each operation in millisecond. + */ + public void setOperationTimeout(int operationTimeout); + + /** + * Get timeout (millisecond) of each operation for in Table instance. + */ + public int getOperationTimeout(); + + /** + * Set timeout (millisecond) of each rpc request in operations of this Table instance, will + * override the value of hbase.rpc.timeout in configuration. + * If a rpc request waiting too long, it will stop waiting and send a new request to retry until + * retries exhausted or operation timeout reached. + * @param rpcTimeout the timeout of each rpc request in millisecond. + */ + public void setRpcTimeout(int rpcTimeout); + + /** + * Get timeout (millisecond) of each rpc request in this Table instance. + */ + public int getRpcTimeout(); } http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestFastFailWithoutTestUtil.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestFastFailWithoutTestUtil.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestFastFailWithoutTestUtil.java index 7cb0be6..b387683 100644 --- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestFastFailWithoutTestUtil.java +++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestFastFailWithoutTestUtil.java @@ -563,7 +563,7 @@ public class TestFastFailWithoutTestUtil { public RpcRetryingCaller<Void> getRpcRetryingCaller(int pauseTime, int retries, RetryingCallerInterceptor interceptor) { - return new RpcRetryingCaller<Void>(pauseTime, retries, interceptor, 9) { + return new RpcRetryingCaller<Void>(pauseTime, retries, interceptor, 9, 0) { @Override public Void callWithRetries(RetryingCallable<Void> callable, int callTimeout) throws IOException, RuntimeException { http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-common/src/main/java/org/apache/hadoop/hbase/HConstants.java ---------------------------------------------------------------------- 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 f1f3e1a..4ad01c8 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 @@ -272,10 +272,10 @@ public final class HConstants { /** Parameter name for HBase client IPC pool size */ public static final String HBASE_CLIENT_IPC_POOL_SIZE = "hbase.client.ipc.pool.size"; - /** Parameter name for HBase client operation timeout, which overrides RPC timeout */ + /** 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, which overrides RPC timeout */ + /** Parameter name for HBase client operation timeout. */ public static final String HBASE_CLIENT_META_OPERATION_TIMEOUT = "hbase.client.meta.operation.timeout"; http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-common/src/main/resources/hbase-default.xml ---------------------------------------------------------------------- diff --git a/hbase-common/src/main/resources/hbase-default.xml b/hbase-common/src/main/resources/hbase-default.xml index c2581bf..9cc2a9e 100644 --- a/hbase-common/src/main/resources/hbase-default.xml +++ b/hbase-common/src/main/resources/hbase-default.xml @@ -795,11 +795,20 @@ possible configurations would overwhelm and obscure the important. <property> <name>hbase.rpc.timeout</name> <value>60000</value> - <description>This is for the RPC layer to define how long HBase client applications + <description>This is for the RPC layer to define how long (millisecond) HBase client applications take for a remote call to time out. It uses pings to check connections but will eventually throw a TimeoutException.</description> </property> <property> + <name>hbase.client.operation.timeout</name> + <value>1200000</value> + <description>Operation timeout is a top-level restriction (millisecond) that makes sure a + blocking operation in Table will not be blocked more than this. In each operation, if rpc + request fails because of timeout or other reason, it will retry until success or throw + RetriesExhaustedException. But if the total time being blocking reach the operation timeout + before retries exhausted, it will break early and throw SocketTimeoutException.</description> + </property> + <property> <name>hbase.rpc.shortoperation.timeout</name> <value>10000</value> <description>This is another version of "hbase.rpc.timeout". For those RPC operation http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java ---------------------------------------------------------------------- diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java index 0300ea2..8429e12 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java @@ -856,4 +856,20 @@ public class RemoteHTable implements Table { CompareOp compareOp, byte[] value, RowMutations rm) throws IOException { throw new UnsupportedOperationException("checkAndMutate not implemented"); } + + @Override public void setOperationTimeout(int operationTimeout) { + throw new UnsupportedOperationException(); + } + + @Override public int getOperationTimeout() { + throw new UnsupportedOperationException(); + } + + @Override public void setRpcTimeout(int rpcTimeout) { + throw new UnsupportedOperationException(); + } + + @Override public int getRpcTimeout() { + throw new UnsupportedOperationException(); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HTableWrapper.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HTableWrapper.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HTableWrapper.java index 1f84bb4..2d25f63 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HTableWrapper.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/HTableWrapper.java @@ -365,4 +365,20 @@ public class HTableWrapper implements HTableInterface { CompareOp compareOp, byte[] value, RowMutations rm) throws IOException { return table.checkAndMutate(row, family, qualifier, compareOp, value, rm); } + + @Override public void setOperationTimeout(int operationTimeout) { + table.setOperationTimeout(operationTimeout); + } + + @Override public int getOperationTimeout() { + return table.getOperationTimeout(); + } + + @Override public void setRpcTimeout(int rpcTimeout) { + table.setRpcTimeout(rpcTimeout); + } + + @Override public int getRpcTimeout() { + return table.getRpcTimeout(); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/48f158f0/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java index 306e139..832ee93 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestHCM.java @@ -126,9 +126,19 @@ public class TestHCM { } } + public static class SleepCoprocessor extends BaseRegionObserver { + public static final int SLEEP_TIME = 5000; + + @Override public void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e, + final Get get, final List<Cell> results) throws IOException { + Threads.sleep(SLEEP_TIME); + } + } + @BeforeClass public static void setUpBeforeClass() throws Exception { TEST_UTIL.getConfiguration().setBoolean(HConstants.STATUS_PUBLISHED, true); + TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 5); TEST_UTIL.startMiniCluster(2); } @@ -299,7 +309,7 @@ public class TestHCM { HTableDescriptor hdt = TEST_UTIL.createTableDescriptor("HCM-testOperationTimeout"); hdt.addCoprocessor(SleepAndFailFirstTime.class.getName()); HTable table = TEST_UTIL.createTable(hdt, new byte[][]{FAM_NAM}, TEST_UTIL.getConfiguration()); - + table.setRpcTimeout(Integer.MAX_VALUE); // Check that it works if the timeout is big enough table.setOperationTimeout(120 * 1000); table.get(new Get(FAM_NAM)); @@ -322,6 +332,20 @@ public class TestHCM { } } + @Test(expected = RetriesExhaustedException.class) + public void testRpcTimeout() throws Exception { + HTableDescriptor hdt = TEST_UTIL.createTableDescriptor("HCM-testRpcTimeout"); + hdt.addCoprocessor(SleepCoprocessor.class.getName()); + Configuration c = new Configuration(TEST_UTIL.getConfiguration()); + + try (Table t = TEST_UTIL.createTable(hdt, new byte[][] { FAM_NAM }, c)) { + assert t instanceof HTable; + HTable table = (HTable) t; + table.setRpcTimeout(SleepCoprocessor.SLEEP_TIME / 2); + table.setOperationTimeout(SleepCoprocessor.SLEEP_TIME * 100); + table.get(new Get(FAM_NAM)); + } + } private void testConnectionClose(boolean allowsInterrupt) throws Exception { TableName tableName = TableName.valueOf("HCM-testConnectionClose" + allowsInterrupt);
