blob: 428aee2a142c7f198de7be549ce0c63ad0a1cf54 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.hadoop.hbase.master;
import static org.apache.hadoop.hbase.HConstants.DEFAULT_HBASE_RPC_TIMEOUT;
import static org.apache.hadoop.hbase.HConstants.HBASE_RPC_TIMEOUT_KEY;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.HRegionLocation;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.StartMiniClusterOption;
import org.apache.hadoop.hbase.ipc.HBaseRpcController;
import org.apache.hadoop.hbase.ipc.RpcClient;
import org.apache.hadoop.hbase.ipc.RpcClientFactory;
import org.apache.hadoop.hbase.ipc.RpcControllerFactory;
import org.apache.hadoop.hbase.security.User;
import org.apache.hadoop.hbase.testclassification.MasterTests;
import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.apache.hadoop.hbase.util.JVMClusterUtil;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.ClientMetaService;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetActiveMasterRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetActiveMasterResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterIdRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetClusterIdResponse;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMetaRegionLocationsRequest;
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetMetaRegionLocationsResponse;
@Category({MediumTests.class, MasterTests.class})
public class TestClientMetaServiceRPCs {
@ClassRule
public static final HBaseClassTestRule CLASS_RULE =
HBaseClassTestRule.forClass(TestClientMetaServiceRPCs.class);
// Total number of masters (active + stand by) for the purpose of this test.
private static final int MASTER_COUNT = 3;
private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
private static Configuration conf;
private static int rpcTimeout;
private static RpcClient rpcClient;
@BeforeClass
public static void setUp() throws Exception {
// Start the mini cluster with stand-by masters.
StartMiniClusterOption.Builder builder = StartMiniClusterOption.builder();
builder.numMasters(MASTER_COUNT).numRegionServers(3);
TEST_UTIL.startMiniCluster(builder.build());
conf = TEST_UTIL.getConfiguration();
rpcTimeout = (int) Math.min(Integer.MAX_VALUE, TimeUnit.MILLISECONDS.toNanos(
conf.getLong(HBASE_RPC_TIMEOUT_KEY, DEFAULT_HBASE_RPC_TIMEOUT)));
rpcClient = RpcClientFactory.createClient(conf,
TEST_UTIL.getMiniHBaseCluster().getMaster().getClusterId());
}
@AfterClass
public static void tearDown() throws Exception {
if (rpcClient != null) {
rpcClient.close();
}
TEST_UTIL.shutdownMiniCluster();
}
private static ClientMetaService.BlockingInterface getMasterStub(ServerName server)
throws IOException {
return ClientMetaService.newBlockingStub(
rpcClient.createBlockingRpcChannel(server, User.getCurrent(), rpcTimeout));
}
private static HBaseRpcController getRpcController() {
return RpcControllerFactory.instantiate(conf).newController();
}
/**
* Verifies the cluster ID from all running masters.
*/
@Test public void TestClusterID() throws Exception {
HBaseRpcController rpcController = getRpcController();
String clusterID = TEST_UTIL.getMiniHBaseCluster().getMaster().getClusterId();
int rpcCount = 0;
for (JVMClusterUtil.MasterThread masterThread:
TEST_UTIL.getMiniHBaseCluster().getMasterThreads()) {
ClientMetaService.BlockingInterface stub =
getMasterStub(masterThread.getMaster().getServerName());
GetClusterIdResponse resp =
stub.getClusterId(rpcController, GetClusterIdRequest.getDefaultInstance());
assertEquals(clusterID, resp.getClusterId());
rpcCount++;
}
assertEquals(MASTER_COUNT, rpcCount);
}
/**
* Verifies the active master ServerName as seen by all masters.
*/
@Test public void TestActiveMaster() throws Exception {
HBaseRpcController rpcController = getRpcController();
ServerName activeMaster = TEST_UTIL.getMiniHBaseCluster().getMaster().getServerName();
int rpcCount = 0;
for (JVMClusterUtil.MasterThread masterThread:
TEST_UTIL.getMiniHBaseCluster().getMasterThreads()) {
ClientMetaService.BlockingInterface stub =
getMasterStub(masterThread.getMaster().getServerName());
GetActiveMasterResponse resp =
stub.getActiveMaster(rpcController, GetActiveMasterRequest.getDefaultInstance());
assertEquals(activeMaster, ProtobufUtil.toServerName(resp.getServerName()));
rpcCount++;
}
assertEquals(MASTER_COUNT, rpcCount);
}
/**
* Verifies that the meta region locations RPC returns consistent results across all masters.
*/
@Test public void TestMetaLocations() throws Exception {
HBaseRpcController rpcController = getRpcController();
List<HRegionLocation> metaLocations = TEST_UTIL.getMiniHBaseCluster().getMaster()
.getMetaRegionLocationCache().getMetaRegionLocations().get();
Collections.sort(metaLocations);
int rpcCount = 0;
for (JVMClusterUtil.MasterThread masterThread:
TEST_UTIL.getMiniHBaseCluster().getMasterThreads()) {
ClientMetaService.BlockingInterface stub =
getMasterStub(masterThread.getMaster().getServerName());
GetMetaRegionLocationsResponse resp = stub.getMetaRegionLocations(
rpcController, GetMetaRegionLocationsRequest.getDefaultInstance());
List<HRegionLocation> result = new ArrayList<>();
resp.getMetaLocationsList().forEach(
location -> result.add(ProtobufUtil.toRegionLocation(location)));
Collections.sort(result);
assertEquals(metaLocations, result);
rpcCount++;
}
assertEquals(MASTER_COUNT, rpcCount);
}
}