This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch branch-2.5
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.5 by this push:
new 0b2ffebcae9 HBASE-28333 Refactor TestClientTimeouts to make it more
clear that what we want to test (#5655)
0b2ffebcae9 is described below
commit 0b2ffebcae90a8a40c0db68120125b1a3be8dfa3
Author: Duo Zhang <[email protected]>
AuthorDate: Fri Jan 26 21:36:29 2024 +0800
HBASE-28333 Refactor TestClientTimeouts to make it more clear that what we
want to test (#5655)
Signed-off-by: Xin Sun <[email protected]>
(cherry picked from commit 11458ec57a6f756510ea6f6aa316290ccb88b694)
---
.../hadoop/hbase/client/TestClientTimeouts.java | 87 ++++++++--------------
1 file changed, 33 insertions(+), 54 deletions(-)
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientTimeouts.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientTimeouts.java
index c7a1b48676c..cb286bc13c6 100644
---
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientTimeouts.java
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestClientTimeouts.java
@@ -17,12 +17,12 @@
*/
package org.apache.hadoop.hbase.client;
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import java.io.IOException;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
-import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.hadoop.conf.Configuration;
@@ -30,7 +30,6 @@ import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.MasterNotRunningException;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.ipc.AbstractRpcClient;
import org.apache.hadoop.hbase.ipc.BlockingRpcClient;
@@ -40,7 +39,6 @@ import org.apache.hadoop.hbase.net.Address;
import org.apache.hadoop.hbase.security.User;
import org.apache.hadoop.hbase.testclassification.ClientTests;
import org.apache.hadoop.hbase.testclassification.MediumTests;
-import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
@@ -71,9 +69,6 @@ public class TestClientTimeouts {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
TEST_UTIL.startMiniCluster(SLAVES);
- // Set the custom RPC client with random timeouts as the client
-
TEST_UTIL.getConfiguration().set(RpcClientFactory.CUSTOM_RPC_CLIENT_IMPL_CONF_KEY,
- RandomTimeoutRpcClient.class.getName());
}
/**
@@ -84,53 +79,39 @@ public class TestClientTimeouts {
TEST_UTIL.shutdownMiniCluster();
}
+ private Connection createConnection() {
+ // Ensure the HBaseAdmin uses a new connection by changing Configuration.
+ Configuration conf =
HBaseConfiguration.create(TEST_UTIL.getConfiguration());
+ // Set the custom RPC client with random timeouts as the client
+ conf.set(RpcClientFactory.CUSTOM_RPC_CLIENT_IMPL_CONF_KEY,
+ RandomTimeoutRpcClient.class.getName());
+ conf.set(HConstants.HBASE_CLIENT_INSTANCE_ID, String.valueOf(-1));
+ for (;;) {
+ try {
+ return ConnectionFactory.createConnection(conf);
+ } catch (IOException e) {
+ // since we randomly throw SocketTimeoutException, it is possible that
we fail when creating
+ // the Connection, but this is not what we want to test here, so just
ignore it and try
+ // again
+ }
+ }
+ }
+
/**
* Test that a client that fails an RPC to the master retries properly and
doesn't throw any
* unexpected exceptions.
*/
@Test
public void testAdminTimeout() throws Exception {
- boolean lastFailed = false;
- int initialInvocations = RandomTimeoutBlockingRpcChannel.invokations.get();
- RandomTimeoutRpcClient rpcClient = (RandomTimeoutRpcClient)
RpcClientFactory
- .createClient(TEST_UTIL.getConfiguration(), TEST_UTIL.getClusterKey());
-
- try {
- for (int i = 0; i < 5 || (lastFailed && i < 100); ++i) {
- lastFailed = false;
- // Ensure the HBaseAdmin uses a new connection by changing
Configuration.
- Configuration conf =
HBaseConfiguration.create(TEST_UTIL.getConfiguration());
- conf.set(HConstants.HBASE_CLIENT_INSTANCE_ID, String.valueOf(-1));
- Admin admin = null;
- Connection connection = null;
- try {
- connection = ConnectionFactory.createConnection(conf);
- admin = connection.getAdmin();
- // run some admin commands
- HBaseAdmin.available(conf);
- admin.setBalancerRunning(false, false);
- } catch (MasterNotRunningException ex) {
- // Since we are randomly throwing SocketTimeoutExceptions, it is
possible to get
- // a MasterNotRunningException. It's a bug if we get other
exceptions.
- lastFailed = true;
- } finally {
- if (admin != null) {
- admin.close();
- if (admin.getConnection().isClosed()) {
- rpcClient = (RandomTimeoutRpcClient) RpcClientFactory
- .createClient(TEST_UTIL.getConfiguration(),
TEST_UTIL.getClusterKey());
- }
- }
- if (connection != null) {
- connection.close();
- }
- }
+ try (Connection conn = createConnection(); Admin admin = conn.getAdmin()) {
+ int initialInvocations = invokations.get();
+ boolean balanceEnabled = admin.isBalancerEnabled();
+ for (int i = 0; i < 5; i++) {
+ assertEquals(balanceEnabled, admin.balancerSwitch(!balanceEnabled,
false));
+ balanceEnabled = !balanceEnabled;
}
// Ensure the RandomTimeoutRpcEngine is actually being used.
- assertFalse(lastFailed);
- assertTrue(RandomTimeoutBlockingRpcChannel.invokations.get() >
initialInvocations);
- } finally {
- rpcClient.close();
+ assertTrue(invokations.get() > initialInvocations);
}
}
@@ -155,14 +136,14 @@ public class TestClientTimeouts {
}
}
+ private static final double CHANCE_OF_TIMEOUT = 0.3;
+ private static AtomicInteger invokations = new AtomicInteger();
+
/**
* Blocking rpc channel that goes via hbase rpc.
*/
static class RandomTimeoutBlockingRpcChannel
extends AbstractRpcClient.BlockingRpcChannelImplementation {
- private static final Random RANDOM = new
Random(EnvironmentEdgeManager.currentTime());
- public static final double CHANCE_OF_TIMEOUT = 0.3;
- private static AtomicInteger invokations = new AtomicInteger();
RandomTimeoutBlockingRpcChannel(final BlockingRpcClient rpcClient, final
ServerName sn,
final User ticket, final int rpcTimeout) {
@@ -173,7 +154,7 @@ public class TestClientTimeouts {
public Message callBlockingMethod(MethodDescriptor md, RpcController
controller, Message param,
Message returnType) throws ServiceException {
invokations.getAndIncrement();
- if (RANDOM.nextFloat() < CHANCE_OF_TIMEOUT) {
+ if (ThreadLocalRandom.current().nextFloat() < CHANCE_OF_TIMEOUT) {
// throw a ServiceException, becuase that is the only exception type
that
// {@link ProtobufRpcEngine} throws. If this RpcEngine is used with a
different
// "actual" type, this may not properly mimic the underlying RpcEngine.
@@ -193,10 +174,8 @@ public class TestClientTimeouts {
@Override
public void callMethod(MethodDescriptor md, RpcController controller,
Message param,
Message returnType, RpcCallback<Message> done) {
- RandomTimeoutBlockingRpcChannel.invokations.getAndIncrement();
- if (
- ThreadLocalRandom.current().nextFloat() <
RandomTimeoutBlockingRpcChannel.CHANCE_OF_TIMEOUT
- ) {
+ invokations.getAndIncrement();
+ if (ThreadLocalRandom.current().nextFloat() < CHANCE_OF_TIMEOUT) {
// throw a ServiceException, because that is the only exception type
that
// {@link ProtobufRpcEngine} throws. If this RpcEngine is used with a
different
// "actual" type, this may not properly mimic the underlying RpcEngine.