HBASE-17498 Implement listTables and listTableNames methods
Signed-off-by: Michael Stack <stack@apache.org>
This commit is contained in:
parent
2285c57a35
commit
79018056f5
|
@ -17,8 +17,11 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase.client;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.hadoop.hbase.HTableDescriptor;
|
||||
import org.apache.hadoop.hbase.TableName;
|
||||
|
||||
import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
||||
|
@ -30,6 +33,54 @@ import org.apache.hadoop.hbase.classification.InterfaceStability;
|
|||
@InterfaceAudience.Public
|
||||
@InterfaceStability.Unstable
|
||||
public interface AsyncAdmin {
|
||||
/**
|
||||
* List all the userspace tables.
|
||||
* @return - returns an array of HTableDescriptors wrapped by a {@link CompletableFuture}.
|
||||
* @see #listTables(Pattern, boolean)
|
||||
*/
|
||||
CompletableFuture<HTableDescriptor[]> listTables();
|
||||
|
||||
/**
|
||||
* List all the tables matching the given pattern.
|
||||
* @param regex The regular expression to match against
|
||||
* @param includeSysTables False to match only against userspace tables
|
||||
* @return - returns an array of HTableDescriptors wrapped by a {@link CompletableFuture}.
|
||||
* @see #listTables(Pattern, boolean)
|
||||
*/
|
||||
CompletableFuture<HTableDescriptor[]> listTables(String regex, boolean includeSysTables);
|
||||
|
||||
/**
|
||||
* List all the tables matching the given pattern.
|
||||
* @param pattern The compiled regular expression to match against
|
||||
* @param includeSysTables False to match only against userspace tables
|
||||
* @return - returns an array of HTableDescriptors wrapped by a {@link CompletableFuture}.
|
||||
*/
|
||||
CompletableFuture<HTableDescriptor[]> listTables(Pattern pattern, boolean includeSysTables);
|
||||
|
||||
/**
|
||||
* List all of the names of userspace tables.
|
||||
* @return TableName[] an array of table names wrapped by a {@link CompletableFuture}.
|
||||
* @see #listTableNames(Pattern, boolean)
|
||||
*/
|
||||
CompletableFuture<TableName[]> listTableNames();
|
||||
|
||||
/**
|
||||
* List all of the names of userspace tables.
|
||||
* @param regex The regular expression to match against
|
||||
* @param includeSysTables False to match only against userspace tables
|
||||
* @return TableName[] an array of table names wrapped by a {@link CompletableFuture}.
|
||||
* @see #listTableNames(Pattern, boolean)
|
||||
*/
|
||||
CompletableFuture<TableName[]> listTableNames(final String regex, final boolean includeSysTables);
|
||||
|
||||
/**
|
||||
* List all of the names of userspace tables.
|
||||
* @param pattern The regular expression to match against
|
||||
* @param includeSysTables False to match only against userspace tables
|
||||
* @return TableName[] an array of table names wrapped by a {@link CompletableFuture}.
|
||||
*/
|
||||
CompletableFuture<TableName[]> listTableNames(final Pattern pattern,
|
||||
final boolean includeSysTables);
|
||||
|
||||
/**
|
||||
* @param tableName Table to check.
|
||||
|
@ -43,7 +94,7 @@ public interface AsyncAdmin {
|
|||
* @param on
|
||||
* @return Previous balancer value wrapped by a {@link CompletableFuture}.
|
||||
*/
|
||||
CompletableFuture<Boolean> setBalancerRunning(final boolean on) throws IOException;
|
||||
CompletableFuture<Boolean> setBalancerRunning(final boolean on);
|
||||
|
||||
/**
|
||||
* Invoke the balancer. Will run the balancer and if regions to move, it will go ahead and do the
|
||||
|
@ -51,7 +102,7 @@ public interface AsyncAdmin {
|
|||
* @return True if balancer ran, false otherwise. The return value will be wrapped by a
|
||||
* {@link CompletableFuture}.
|
||||
*/
|
||||
CompletableFuture<Boolean> balancer() throws IOException;
|
||||
CompletableFuture<Boolean> balancer();
|
||||
|
||||
/**
|
||||
* Invoke the balancer. Will run the balancer and if regions to move, it will go ahead and do the
|
||||
|
@ -61,12 +112,12 @@ public interface AsyncAdmin {
|
|||
* @return True if balancer ran, false otherwise. The return value will be wrapped by a
|
||||
* {@link CompletableFuture}.
|
||||
*/
|
||||
CompletableFuture<Boolean> balancer(boolean force) throws IOException;
|
||||
CompletableFuture<Boolean> balancer(boolean force);
|
||||
|
||||
/**
|
||||
* Query the current state of the balancer.
|
||||
* @return true if the balancer is enabled, false otherwise.
|
||||
* The return value will be wrapped by a {@link CompletableFuture}.
|
||||
*/
|
||||
CompletableFuture<Boolean> isBalancerEnabled() throws IOException;
|
||||
CompletableFuture<Boolean> isBalancerEnabled();
|
||||
}
|
||||
|
|
|
@ -20,7 +20,10 @@ package org.apache.hadoop.hbase.client;
|
|||
import java.io.IOException;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.hadoop.hbase.HTableDescriptor;
|
||||
import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.AsyncMetaTableAccessor;
|
||||
import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.classification.InterfaceAudience;
|
||||
|
@ -28,9 +31,14 @@ import org.apache.hadoop.hbase.classification.InterfaceStability;
|
|||
import org.apache.hadoop.hbase.client.AsyncRpcRetryingCallerFactory.MasterRequestCallerBuilder;
|
||||
import org.apache.hadoop.hbase.ipc.HBaseRpcController;
|
||||
import org.apache.hadoop.hbase.shaded.com.google.protobuf.RpcCallback;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.RequestConverter;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BalanceRequest;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.BalanceResponse;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableDescriptorsRequest;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableDescriptorsResponse;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableNamesRequest;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.GetTableNamesResponse;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledRequest;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.IsBalancerEnabledResponse;
|
||||
import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.MasterService;
|
||||
|
@ -107,7 +115,51 @@ public class AsyncHBaseAdmin implements AsyncAdmin {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> setBalancerRunning(final boolean on) throws IOException {
|
||||
public CompletableFuture<HTableDescriptor[]> listTables() {
|
||||
return listTables((Pattern)null, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<HTableDescriptor[]> listTables(String regex, boolean includeSysTables) {
|
||||
return listTables(Pattern.compile(regex), false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<HTableDescriptor[]> listTables(Pattern pattern, boolean includeSysTables) {
|
||||
return this
|
||||
.<HTableDescriptor[]> newCaller()
|
||||
.action(
|
||||
(controller, stub) -> this
|
||||
.<GetTableDescriptorsRequest, GetTableDescriptorsResponse, HTableDescriptor[]> call(
|
||||
controller, stub, RequestConverter.buildGetTableDescriptorsRequest(pattern,
|
||||
includeSysTables), (s, c, req, done) -> s.getTableDescriptors(c, req, done), (
|
||||
resp) -> ProtobufUtil.getHTableDescriptorArray(resp))).call();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<TableName[]> listTableNames() {
|
||||
return listTableNames((Pattern)null, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<TableName[]> listTableNames(String regex, boolean includeSysTables) {
|
||||
return listTableNames(Pattern.compile(regex), false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<TableName[]> listTableNames(Pattern pattern, boolean includeSysTables) {
|
||||
return this
|
||||
.<TableName[]> newCaller()
|
||||
.action(
|
||||
(controller, stub) -> this
|
||||
.<GetTableNamesRequest, GetTableNamesResponse, TableName[]> call(controller, stub,
|
||||
RequestConverter.buildGetTableNamesRequest(pattern, includeSysTables), (s, c, req,
|
||||
done) -> s.getTableNames(c, req, done), (resp) -> ProtobufUtil
|
||||
.getTableNameArray(resp.getTableNamesList()))).call();
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> setBalancerRunning(final boolean on) {
|
||||
return this
|
||||
.<Boolean> newCaller()
|
||||
.action(
|
||||
|
@ -119,12 +171,12 @@ public class AsyncHBaseAdmin implements AsyncAdmin {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> balancer() throws IOException {
|
||||
public CompletableFuture<Boolean> balancer() {
|
||||
return balancer(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> balancer(boolean force) throws IOException {
|
||||
public CompletableFuture<Boolean> balancer(boolean force) {
|
||||
return this
|
||||
.<Boolean> newCaller()
|
||||
.action(
|
||||
|
@ -134,7 +186,7 @@ public class AsyncHBaseAdmin implements AsyncAdmin {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Boolean> isBalancerEnabled() throws IOException {
|
||||
public CompletableFuture<Boolean> isBalancerEnabled() {
|
||||
return this
|
||||
.<Boolean> newCaller()
|
||||
.action(
|
||||
|
@ -148,4 +200,4 @@ public class AsyncHBaseAdmin implements AsyncAdmin {
|
|||
public CompletableFuture<Boolean> tableExists(TableName tableName) {
|
||||
return AsyncMetaTableAccessor.tableExists(connection, tableName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,15 +18,21 @@
|
|||
package org.apache.hadoop.hbase.client;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.hadoop.hbase.HBaseTestingUtility;
|
||||
import org.apache.hadoop.hbase.HTableDescriptor;
|
||||
import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.TableName;
|
||||
import org.apache.hadoop.hbase.testclassification.ClientTests;
|
||||
import org.apache.hadoop.hbase.testclassification.LargeTests;
|
||||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.Before;
|
||||
import org.junit.BeforeClass;
|
||||
|
@ -66,6 +72,58 @@ public class TestAsyncAdmin {
|
|||
this.admin = ASYNC_CONN.getAdmin();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testListTables() throws Exception {
|
||||
TableName t1 = TableName.valueOf("testListTables1");
|
||||
TableName t2 = TableName.valueOf("testListTables2");
|
||||
TableName t3 = TableName.valueOf("testListTables3");
|
||||
TableName[] tables = new TableName[] { t1, t2, t3 };
|
||||
for (int i = 0; i < tables.length; i++) {
|
||||
TEST_UTIL.createTable(tables[i], FAMILY);
|
||||
}
|
||||
|
||||
HTableDescriptor[] tableDescs = admin.listTables().get();
|
||||
int size = tableDescs.length;
|
||||
assertTrue(size >= tables.length);
|
||||
for (int i = 0; i < tables.length && i < size; i++) {
|
||||
boolean found = false;
|
||||
for (int j = 0; j < tableDescs.length; j++) {
|
||||
if (tableDescs[j].getTableName().equals(tables[i])) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
assertTrue("Not found: " + tables[i], found);
|
||||
}
|
||||
|
||||
TableName[] tableNames = admin.listTableNames().get();
|
||||
size = tableNames.length;
|
||||
assertTrue(size >= tables.length);
|
||||
for (int i = 0; i < tables.length && i < size; i++) {
|
||||
boolean found = false;
|
||||
for (int j = 0; j < tableNames.length; j++) {
|
||||
if (tableNames[j].equals(tables[i])) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
assertTrue("Not found: " + tables[i], found);
|
||||
}
|
||||
|
||||
for (int i = 0; i < tables.length; i++) {
|
||||
TEST_UTIL.deleteTable(tables[i]);
|
||||
}
|
||||
tableDescs = admin.listTables().get();
|
||||
assertEquals(0, tableDescs.length);
|
||||
tableNames = admin.listTableNames().get();
|
||||
assertEquals(0, tableNames.length);
|
||||
|
||||
tableDescs = admin.listTables((Pattern) null, true).get();
|
||||
assertTrue("Not found system tables", tableDescs.length > 0);
|
||||
tableNames = admin.listTableNames((Pattern) null, true).get();
|
||||
assertTrue("Not found system tables", tableNames.length > 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTableExist() throws Exception {
|
||||
final TableName table = TableName.valueOf("testTableExist");
|
||||
|
|
Loading…
Reference in New Issue