HBASE-24195 : Admin.getRegionServers() should return live servers exc… (#1523)

Signed-off-by: Mingliang Liu <liuml07@apache.org>
Signed-off-by: Jan Hentschel <jan.hentschel@ultratendency.com>
This commit is contained in:
Viraj Jasani 2020-04-16 20:13:14 +05:30 committed by GitHub
parent a0ef4cb8a2
commit d212dc4df0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 65 additions and 1 deletions

View File

@ -66,6 +66,8 @@ import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Pair;
import org.apache.yetus.audience.InterfaceAudience;
import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;
/**
* The administrative API for HBase. Obtain an instance from {@link Connection#getAdmin()} and
* call {@link #close()} when done.
@ -1064,7 +1066,28 @@ public interface Admin extends Abortable, Closeable {
* @throws IOException if a remote or network exception occurs
*/
default Collection<ServerName> getRegionServers() throws IOException {
return getClusterMetrics(EnumSet.of(Option.SERVERS_NAME)).getServersName();
return getRegionServers(false);
}
/**
* Retrieve all current live region servers including decommissioned
* if excludeDecommissionedRS is false, else non-decommissioned ones only
*
* @param excludeDecommissionedRS should we exclude decommissioned RS nodes
* @return all current live region servers including/excluding decommissioned hosts
* @throws IOException if a remote or network exception occurs
*/
default Collection<ServerName> getRegionServers(boolean excludeDecommissionedRS)
throws IOException {
List<ServerName> allServers =
getClusterMetrics(EnumSet.of(Option.SERVERS_NAME)).getServersName();
if (!excludeDecommissionedRS) {
return allServers;
}
List<ServerName> decommissionedRegionServers = listDecommissionedRegionServers();
return allServers.stream()
.filter(s -> !decommissionedRegionServers.contains(s))
.collect(ImmutableList.toImmutableList());
}
/**

View File

@ -25,6 +25,7 @@ import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
@ -864,4 +865,44 @@ public class TestAdmin2 extends TestAdminBase {
Assert.assertEquals(onlineLogRecords.size(), 0);
}
@Test
public void testGetRegionServers() throws Exception {
// get all live server names
List<ServerName> serverNames = new ArrayList<>(ADMIN.getRegionServers(true));
Assert.assertEquals(3, serverNames.size());
List<ServerName> serversToDecom = new ArrayList<>();
ServerName serverToDecommission = serverNames.get(0);
serversToDecom.add(serverToDecommission);
ADMIN.decommissionRegionServers(serversToDecom, false);
waitForServerCommissioned(serverToDecommission, true);
Assert.assertEquals(2, ADMIN.getRegionServers(true).size());
Assert.assertEquals(3, ADMIN.getRegionServers(false).size());
ADMIN.recommissionRegionServer(serverToDecommission, Collections.emptyList());
waitForServerCommissioned(null, false);
Assert.assertEquals(3, ADMIN.getRegionServers(true).size());
Assert.assertEquals(3, ADMIN.getRegionServers(false).size());
}
private static void waitForServerCommissioned(ServerName excludeServer,
boolean anyServerDecommissioned) {
TEST_UTIL.waitFor(3000, () -> {
try {
List<ServerName> decomServers = TEST_UTIL.getAdmin().listDecommissionedRegionServers();
if (anyServerDecommissioned) {
return decomServers.size() == 1
&& decomServers.get(0).equals(excludeServer);
} else {
return decomServers.size() == 0;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
}