Skip to content

Commit c27889e

Browse files
committed
[Chore] add _enable_kv_hbase_admin_ddl test and fix admin ddl exception
1 parent 2cb58dd commit c27889e

File tree

4 files changed

+231
-14
lines changed

4 files changed

+231
-14
lines changed

src/main/java/com/alipay/oceanbase/hbase/execute/AbstractObTableMetaExecutor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package com.alipay.oceanbase.hbase.execute;
1919

20+
import com.alipay.oceanbase.hbase.util.OHBaseExceptionUtil;
2021
import com.alipay.oceanbase.rpc.ObTableClient;
2122
import com.alipay.oceanbase.rpc.exception.ObTableException;
2223
import com.alipay.oceanbase.rpc.meta.ObTableMetaRequest;
@@ -41,7 +42,7 @@ public T execute(ObTableClient client, ObTableMetaRequest request) throws IOExce
4142
null /*tableName*/
4243
);
4344
} catch (Exception e) {
44-
throw new IOException("Failed to execute request", e);
45+
throw OHBaseExceptionUtil.convertTableException(e);
4546
}
4647
return parse(response);
4748
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.alipay.oceanbase.hbase.util;
2+
3+
import com.alipay.oceanbase.rpc.exception.ObTableException;
4+
import com.alipay.oceanbase.rpc.protocol.payload.ResultCodes;
5+
import org.apache.hadoop.hbase.*;
6+
7+
import java.io.IOException;
8+
9+
public class OHBaseExceptionUtil {
10+
public static IOException convertTableException(Exception e) {
11+
if (e instanceof ObTableException) {
12+
final int errCode = ((ObTableException) e).getErrorCode();
13+
if (errCode == ResultCodes.OB_KV_HBASE_TABLE_NOT_EXISTS.errorCode) {
14+
return (TableNotFoundException) new TableNotFoundException(e.getMessage()).initCause(e);
15+
} else if (errCode == ResultCodes.OB_KV_HBASE_TABLE_EXISTS.errorCode) {
16+
return (TableExistsException) new TableExistsException(e.getMessage()).initCause(e);
17+
} else if (errCode == ResultCodes.OB_KV_HBASE_NAMESPACE_NOT_FOUND.errorCode) {
18+
return (NamespaceNotFoundException) new NamespaceNotFoundException(e.getMessage()).initCause(e);
19+
} else if (errCode == ResultCodes.OB_KV_TABLE_NOT_ENABLED.errorCode) {
20+
return (TableNotEnabledException) new TableNotEnabledException(e.getMessage()).initCause(e);
21+
} else if (errCode == ResultCodes.OB_KV_TABLE_NOT_DISABLED.errorCode) {
22+
return (TableNotDisabledException) new TableNotDisabledException(e.getMessage()).initCause(e);
23+
}
24+
}
25+
return new IOException("Failed to execute request", e);
26+
}
27+
}

src/main/java/com/alipay/oceanbase/hbase/util/ObTableClientManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public static ObTableClient getOrCreateObTableClient(ObTableClientKey obTableCli
120120
OB_TABLE_CLIENT_INSTANCE.put(obTableClientKey, obTableClient);
121121
}
122122
} catch (Exception e) {
123-
throw new IOException(e);
123+
throw OHBaseExceptionUtil.convertTableException(e);
124124
} finally {
125125
lock.unlock();
126126
}

src/test/java/com/alipay/oceanbase/hbase/OHTableAdminInterfaceTest.java

Lines changed: 201 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@
2929
import org.apache.hadoop.hbase.util.Bytes;
3030
import org.apache.hadoop.hbase.util.Pair;
3131

32+
import org.junit.AfterClass;
3233
import org.junit.Assert;
34+
import org.junit.BeforeClass;
3335
import org.junit.Test;
3436

35-
3637
import java.io.IOException;
3738
import java.sql.SQLException;
3839
import java.sql.Statement;
@@ -45,7 +46,7 @@
4546
import static org.apache.hadoop.hbase.util.Bytes.toBytes;
4647
import static org.junit.Assert.*;
4748
import static org.junit.Assert.assertFalse;
48-
import static com.alipay.oceanbase.hbase.util.ObHTableSecondaryPartUtil.*;
49+
import static com.alipay.oceanbase.hbase.util.ObHTableSecondaryPartUtil.*;
4950

5051
public class OHTableAdminInterfaceTest {
5152
public OHTablePool setUpLoadPool() throws IOException {
@@ -58,6 +59,28 @@ public OHTablePool setUpLoadPool() throws IOException {
5859
return ohTablePool;
5960
}
6061

62+
public static void openHbaseAdminDDL() throws Exception {
63+
java.sql.Connection conn = ObHTableTestUtil.getConnection();
64+
String stmt = "ALTER SYSTEM SET _enable_kv_hbase_admin_ddl = true;";
65+
conn.createStatement().execute(stmt);
66+
}
67+
68+
public static void closeHbaseAdminDDL() throws Exception {
69+
java.sql.Connection conn = ObHTableTestUtil.getConnection();
70+
String stmt = "ALTER SYSTEM SET _enable_kv_hbase_admin_ddl = false;";
71+
conn.createStatement().execute(stmt);
72+
}
73+
74+
@BeforeClass
75+
public static void before() throws Exception {
76+
openHbaseAdminDDL();
77+
}
78+
79+
@AfterClass
80+
public static void finish() throws Exception {
81+
closeHbaseAdminDDL();
82+
}
83+
6184
public OHTablePool setUpPool() throws IOException {
6285
Configuration c = ObHTableTestUtil.newConfiguration();
6386
OHTablePool ohTablePool = new OHTablePool(c, 10);
@@ -321,7 +344,8 @@ public void testGetStartEndKeysOHTablePoolLoadNon() throws Exception {
321344
Assert.assertEquals(0, startEndKeys.getSecond()[0].length);
322345
}
323346

324-
public static void createTable(Admin admin, TableName tableName, String... columnFamilies) throws IOException {
347+
public static void createTable(Admin admin, TableName tableName, String... columnFamilies)
348+
throws IOException {
325349
HTableDescriptor htd = new HTableDescriptor(tableName);
326350
// Add column families
327351
for (String cf : columnFamilies) {
@@ -427,10 +451,8 @@ public void testAdminEnDisableTable() throws Exception {
427451
try {
428452
admin.enableTable(TableName.valueOf("en_dis", "test"));
429453
Assert.fail();
430-
} catch (IOException ex) {
431-
Assert.assertTrue(ex.getCause() instanceof ObTableException);
432-
Assert.assertEquals(ResultCodes.OB_KV_TABLE_NOT_ENABLED.errorCode,
433-
((ObTableException) ex.getCause()).getErrorCode());
454+
} catch (Exception ex) {
455+
Assert.assertEquals(TableNotDisabledException.class, ex.getClass());
434456
}
435457
}
436458

@@ -445,10 +467,8 @@ public void testAdminEnDisableTable() throws Exception {
445467
try {
446468
admin.disableTable(TableName.valueOf("en_dis", "test"));
447469
Assert.fail();
448-
} catch (IOException ex) {
449-
Assert.assertTrue(ex.getCause() instanceof ObTableException);
450-
Assert.assertEquals(ResultCodes.OB_KV_TABLE_NOT_DISABLED.errorCode,
451-
((ObTableException) ex.getCause()).getErrorCode());
470+
} catch (Exception ex) {
471+
Assert.assertEquals(TableNotEnabledException.class, ex.getClass());
452472
}
453473
}
454474

@@ -1255,7 +1275,9 @@ public void testHTableDDLDefense() throws Exception {
12551275

12561276
void checkKVAttributes(String tableName, String kvAttributes) throws Exception {
12571277
java.sql.Connection conn = ObHTableTestUtil.getConnection();
1258-
java.sql.ResultSet resultSet = conn.createStatement().executeQuery("select kv_attributes from oceanbase.__all_table where table_name = '" + tableName + "'");
1278+
java.sql.ResultSet resultSet = conn.createStatement().executeQuery(
1279+
"select kv_attributes from oceanbase.__all_table where table_name = '" + tableName
1280+
+ "'");
12591281
resultSet.next();
12601282
String value = resultSet.getString(1);
12611283
Assert.assertEquals(kvAttributes, value);
@@ -1329,4 +1351,171 @@ public void testCreateTableInjectError() throws Exception {
13291351
assertFalse("Table should not exist after normal delete",
13301352
admin.tableExists(TableName.valueOf(tableName)));
13311353
}
1354+
1355+
@Test
1356+
public void testHbaseAdminDDLKnob() throws Exception {
1357+
Configuration conf = ObHTableTestUtil.newConfiguration();
1358+
Connection connection = ConnectionFactory.createConnection(conf);
1359+
Admin admin = connection.getAdmin();
1360+
try {
1361+
closeHbaseAdminDDL();
1362+
try {
1363+
createTable(admin, TableName.valueOf("t1"), "cf1", "cf2", "cf3");
1364+
fail();
1365+
} catch (Exception e) {
1366+
Assert.assertEquals(-4007, ((ObTableException) e.getCause()).getErrorCode());
1367+
}
1368+
1369+
try {
1370+
admin.disableTable(TableName.valueOf("t1"));
1371+
fail();
1372+
} catch (Exception e) {
1373+
Assert.assertEquals(-4007, ((ObTableException) e.getCause()).getErrorCode());
1374+
}
1375+
1376+
try {
1377+
admin.enableTable(TableName.valueOf("t1"));
1378+
fail();
1379+
} catch (Exception e) {
1380+
Assert.assertEquals(-4007, ((ObTableException) e.getCause()).getErrorCode());
1381+
}
1382+
1383+
try {
1384+
admin.deleteTable(TableName.valueOf("t1"));
1385+
fail();
1386+
} catch (Exception e) {
1387+
Assert.assertEquals(-4007, ((ObTableException) e.getCause()).getErrorCode());
1388+
}
1389+
} catch (Exception e) {
1390+
e.printStackTrace();
1391+
throw e;
1392+
} finally {
1393+
openHbaseAdminDDL();
1394+
}
1395+
}
1396+
1397+
@Test
1398+
public void testHbaseDDLException() throws Exception {
1399+
Configuration conf = ObHTableTestUtil.newConfiguration();
1400+
Connection connection = ConnectionFactory.createConnection(conf);
1401+
Admin admin = connection.getAdmin();
1402+
1403+
// 1. create a created table
1404+
try {
1405+
createTable(admin, TableName.valueOf("t1"), "cf1", "cf2", "cf3");
1406+
createTable(admin, TableName.valueOf("t1"), "cf1", "cf2", "cf3");
1407+
fail();
1408+
} catch (Exception e) {
1409+
Assert.assertEquals(e.getClass(), TableExistsException.class);
1410+
} finally {
1411+
admin.deleteTable(TableName.valueOf("t1"));
1412+
}
1413+
1414+
// 2. delete a non-exist table
1415+
try {
1416+
admin.deleteTable(TableName.valueOf("t1"));
1417+
fail();
1418+
} catch (Exception e) {
1419+
Assert.assertEquals(e.getClass(), TableNotFoundException.class);
1420+
}
1421+
1422+
// 3. enable a enabled table
1423+
try {
1424+
createTable(admin, TableName.valueOf("t1"), "cf1", "cf2", "cf3");
1425+
admin.enableTable(TableName.valueOf("t1"));
1426+
fail();
1427+
} catch (Exception e) {
1428+
Assert.assertEquals(e.getClass(), TableNotDisabledException.class);
1429+
} finally {
1430+
admin.deleteTable(TableName.valueOf("t1"));
1431+
}
1432+
1433+
// 4. disable a disabled table
1434+
try {
1435+
createTable(admin, TableName.valueOf("t1"), "cf1", "cf2", "cf3");
1436+
admin.disableTable(TableName.valueOf("t1"));
1437+
admin.disableTable(TableName.valueOf("t1"));
1438+
fail();
1439+
} catch (Exception e) {
1440+
Assert.assertEquals(e.getClass(), TableNotEnabledException.class);
1441+
} finally {
1442+
admin.deleteTable(TableName.valueOf("t1"));
1443+
}
1444+
1445+
// 5. get htable descriptor from an uncreated table
1446+
try {
1447+
HTableDescriptor descriptor = admin.getTableDescriptor(TableName.valueOf("t1"));
1448+
fail();
1449+
} catch (Exception e) {
1450+
Assert.assertEquals(e.getClass(), TableNotFoundException.class);
1451+
}
1452+
1453+
// 6. get region metrics from an uncreated table
1454+
try {
1455+
admin.getRegionMetrics(null, TableName.valueOf("t1"));
1456+
fail();
1457+
} catch (Exception e) {
1458+
e.printStackTrace();
1459+
Assert.assertEquals(e.getClass(), TableNotFoundException.class);
1460+
}
1461+
1462+
// 6. create a table in an uncreated namespace
1463+
try {
1464+
createTable(admin, TableName.valueOf("t1"), "cf1", "cf2", "cf3");
1465+
createTable(admin, TableName.valueOf("t1"), "cf1", "cf2", "cf3");
1466+
fail();
1467+
} catch (Exception e) {
1468+
Assert.assertEquals(e.getClass(), TableExistsException.class);
1469+
} finally {
1470+
admin.deleteTable(TableName.valueOf("t1"));
1471+
}
1472+
1473+
// 7. delete a non-exist table in an uncreated namespace
1474+
try {
1475+
admin.deleteTable(TableName.valueOf("t1"));
1476+
fail();
1477+
} catch (Exception e) {
1478+
Assert.assertEquals(e.getClass(), TableNotFoundException.class);
1479+
}
1480+
1481+
// 8. enable a enabled table in an uncreated namespace
1482+
try {
1483+
createTable(admin, TableName.valueOf("t1"), "cf1", "cf2", "cf3");
1484+
admin.enableTable(TableName.valueOf("t1"));
1485+
fail();
1486+
} catch (Exception e) {
1487+
Assert.assertEquals(e.getClass(), TableNotDisabledException.class);
1488+
} finally {
1489+
admin.deleteTable(TableName.valueOf("t1"));
1490+
}
1491+
1492+
// 9. disable a disabled table in an uncreated namespace
1493+
try {
1494+
createTable(admin, TableName.valueOf("t1"), "cf1", "cf2", "cf3");
1495+
admin.disableTable(TableName.valueOf("t1"));
1496+
admin.disableTable(TableName.valueOf("t1"));
1497+
fail();
1498+
} catch (Exception e) {
1499+
Assert.assertEquals(e.getClass(), TableNotEnabledException.class);
1500+
} finally {
1501+
admin.deleteTable(TableName.valueOf("t1"));
1502+
}
1503+
1504+
// 10. get a table metrics from an uncreated namespace
1505+
try {
1506+
admin.getRegionMetrics(null, TableName.valueOf("n1:t1"));
1507+
fail();
1508+
} catch (Exception e) {
1509+
Assert.assertEquals(e.getClass(), NamespaceNotFoundException.class);
1510+
}
1511+
1512+
// 11. check table exists from an uncreated namespace
1513+
try {
1514+
admin.tableExists(TableName.valueOf("n1:t1"));
1515+
fail();
1516+
} catch (Exception e) {
1517+
Assert.assertEquals(e.getClass(), NamespaceNotFoundException.class);
1518+
}
1519+
1520+
}
13321521
}

0 commit comments

Comments
 (0)