Skip to content

Commit 2d11a01

Browse files
authored
HBASE-28948 RegionMover tool fails when table is deleted (#6426)
Signed-off-by: Wellington Chevreuil <[email protected]> (cherry picked from commit 344bf78)
1 parent ff7e36c commit 2d11a01

File tree

2 files changed

+51
-33
lines changed

2 files changed

+51
-33
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/util/MoveWithAck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ private boolean isSameServer(RegionInfo region, ServerName serverName) throws IO
138138
*/
139139
static ServerName getServerNameForRegion(RegionInfo region, Admin admin, Connection conn)
140140
throws IOException {
141-
if (!admin.isTableEnabled(region.getTable())) {
141+
if (!admin.tableExists(region.getTable()) || !admin.isTableEnabled(region.getTable())) {
142142
return null;
143143
}
144144
HRegionLocation loc = conn.getRegionLocator(region.getTable())

hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionMover2.java

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package org.apache.hadoop.hbase.util;
1919

20+
import java.io.IOException;
2021
import java.util.ArrayList;
2122
import java.util.List;
2223
import java.util.concurrent.TimeUnit;
@@ -65,12 +66,12 @@ public class TestRegionMover2 {
6566
@ClassRule
6667
public static final HBaseClassTestRule CLASS_RULE =
6768
HBaseClassTestRule.forClass(TestRegionMover2.class);
69+
private static final String CF = "fam1";
6870

6971
@Rule
7072
public TestName name = new TestName();
7173

7274
private static final Logger LOG = LoggerFactory.getLogger(TestRegionMover2.class);
73-
7475
private static final HBaseTestingUtil TEST_UTIL = new HBaseTestingUtil();
7576

7677
@BeforeClass
@@ -86,12 +87,7 @@ public static void tearDownAfterClass() throws Exception {
8687

8788
@Before
8889
public void setUp() throws Exception {
89-
final TableName tableName = TableName.valueOf(name.getMethodName());
90-
TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(tableName)
91-
.setColumnFamily(ColumnFamilyDescriptorBuilder.of("fam1")).build();
92-
int startKey = 0;
93-
int endKey = 80000;
94-
TEST_UTIL.getAdmin().createTable(tableDesc, Bytes.toBytes(startKey), Bytes.toBytes(endKey), 9);
90+
createTable(name.getMethodName());
9591
}
9692

9793
@After
@@ -101,17 +97,23 @@ public void tearDown() throws Exception {
10197
TEST_UTIL.getAdmin().deleteTable(tableName);
10298
}
10399

100+
private TableName createTable(String name) throws IOException {
101+
final TableName tableName = TableName.valueOf(name);
102+
TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(tableName)
103+
.setColumnFamily(ColumnFamilyDescriptorBuilder.of(CF)).build();
104+
int startKey = 0;
105+
int endKey = 80000;
106+
TEST_UTIL.getAdmin().createTable(tableDesc, Bytes.toBytes(startKey), Bytes.toBytes(endKey), 9);
107+
return tableName;
108+
}
109+
104110
@Test
105111
public void testWithMergedRegions() throws Exception {
106112
final TableName tableName = TableName.valueOf(name.getMethodName());
107113
SingleProcessHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
108114
Admin admin = TEST_UTIL.getAdmin();
109115
Table table = TEST_UTIL.getConnection().getTable(tableName);
110-
List<Put> puts = new ArrayList<>();
111-
for (int i = 0; i < 10000; i++) {
112-
puts.add(new Put(Bytes.toBytes("rowkey_" + i)).addColumn(Bytes.toBytes("fam1"),
113-
Bytes.toBytes("q1"), Bytes.toBytes("val_" + i)));
114-
}
116+
List<Put> puts = createPuts(10000);
115117
table.put(puts);
116118
admin.flush(tableName);
117119
HRegionServer regionServer = cluster.getRegionServer(0);
@@ -141,11 +143,7 @@ public void testWithSplitRegions() throws Exception {
141143
SingleProcessHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
142144
Admin admin = TEST_UTIL.getAdmin();
143145
Table table = TEST_UTIL.getConnection().getTable(tableName);
144-
List<Put> puts = new ArrayList<>();
145-
for (int i = 10; i < 50000; i++) {
146-
puts.add(new Put(Bytes.toBytes(i)).addColumn(Bytes.toBytes("fam1"), Bytes.toBytes("q1"),
147-
Bytes.toBytes("val_" + i)));
148-
}
146+
List<Put> puts = createPuts(50000);
149147
table.put(puts);
150148
admin.flush(tableName);
151149
admin.compact(tableName);
@@ -190,16 +188,11 @@ public void testFailedRegionMove() throws Exception {
190188
SingleProcessHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
191189
Admin admin = TEST_UTIL.getAdmin();
192190
Table table = TEST_UTIL.getConnection().getTable(tableName);
193-
List<Put> puts = new ArrayList<>();
194-
for (int i = 0; i < 1000; i++) {
195-
puts.add(new Put(Bytes.toBytes("rowkey_" + i)).addColumn(Bytes.toBytes("fam1"),
196-
Bytes.toBytes("q1"), Bytes.toBytes("val_" + i)));
197-
}
191+
List<Put> puts = createPuts(1000);
198192
table.put(puts);
199193
admin.flush(tableName);
200194
HRegionServer regionServer = cluster.getRegionServer(0);
201195
String rsName = regionServer.getServerName().getAddress().toString();
202-
int numRegions = regionServer.getNumberOfOnlineRegions();
203196
List<HRegion> hRegions = regionServer.getRegions().stream()
204197
.filter(hRegion -> hRegion.getRegionInfo().getTable().equals(tableName))
205198
.collect(Collectors.toList());
@@ -217,14 +210,30 @@ public void testFailedRegionMove() throws Exception {
217210
}
218211
}
219212

213+
@Test
214+
public void testDeletedTable() throws Exception {
215+
TableName tableNameToDelete = createTable(name.getMethodName() + "ToDelete");
216+
SingleProcessHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
217+
HRegionServer regionServer = cluster.getRegionServer(0);
218+
String rsName = regionServer.getServerName().getAddress().toString();
219+
RegionMover.RegionMoverBuilder rmBuilder =
220+
new RegionMover.RegionMoverBuilder(rsName, TEST_UTIL.getConfiguration()).ack(true)
221+
.maxthreads(8);
222+
try (Admin admin = TEST_UTIL.getAdmin(); RegionMover rm = rmBuilder.build()) {
223+
LOG.debug("Unloading {}", regionServer.getServerName());
224+
rm.unload();
225+
Assert.assertEquals(0, regionServer.getNumberOfOnlineRegions());
226+
LOG.debug("Successfully Unloaded, now delete table");
227+
admin.disableTable(tableNameToDelete);
228+
admin.deleteTable(tableNameToDelete);
229+
Assert.assertTrue(rm.load());
230+
}
231+
}
232+
220233
public void loadDummyDataInTable(TableName tableName) throws Exception {
221234
Admin admin = TEST_UTIL.getAdmin();
222235
Table table = TEST_UTIL.getConnection().getTable(tableName);
223-
List<Put> puts = new ArrayList<>();
224-
for (int i = 0; i < 1000; i++) {
225-
puts.add(new Put(Bytes.toBytes("rowkey_" + i)).addColumn(Bytes.toBytes("fam1"),
226-
Bytes.toBytes("q1"), Bytes.toBytes("val_" + i)));
227-
}
236+
List<Put> puts = createPuts(1000);
228237
table.put(puts);
229238
admin.flush(tableName);
230239
}
@@ -297,6 +306,15 @@ public void testIsolateMetaAndRandomRegionOnTheRandomServer() throws Exception {
297306
regionIsolationOperation(randomSeverRegion, randomSeverRegion, 2, true);
298307
}
299308

309+
private List<Put> createPuts(int count) {
310+
List<Put> puts = new ArrayList<>();
311+
for (int i = 0; i < count; i++) {
312+
puts.add(new Put(Bytes.toBytes("rowkey_" + i)).addColumn(Bytes.toBytes(CF),
313+
Bytes.toBytes("q1"), Bytes.toBytes("val_" + i)));
314+
}
315+
return puts;
316+
}
317+
300318
public ServerName findMetaRSLocation() throws Exception {
301319
ZKWatcher zkWatcher = new ZKWatcher(TEST_UTIL.getConfiguration(), null, null);
302320
List<HRegionLocation> result = new ArrayList<>();
@@ -325,7 +343,7 @@ public ServerName findSourceServerName(TableName tableName) throws Exception {
325343
}
326344
if (sourceServer == null) {
327345
throw new Exception(
328-
"This shouln't happen, No RS found with more than 2 regions of table : " + tableName);
346+
"This shouldn't happen, No RS found with more than 2 regions of table : " + tableName);
329347
}
330348
return sourceServer;
331349
}
@@ -372,7 +390,7 @@ public void regionIsolationOperation(ServerName sourceServerName,
372390
new RegionMover.RegionMoverBuilder(destinationRSName, TEST_UTIL.getConfiguration()).ack(true)
373391
.maxthreads(8).isolateRegionIdArray(listOfRegionIDsToIsolate);
374392
try (RegionMover rm = rmBuilder.build()) {
375-
LOG.debug("Unloading {} except regions : {}", destinationRS.getServerName(),
393+
LOG.debug("Unloading {} except regions: {}", destinationRS.getServerName(),
376394
listOfRegionIDsToIsolate);
377395
rm.isolateRegions();
378396
Assert.assertEquals(numRegionsToIsolate, destinationRS.getNumberOfOnlineRegions());
@@ -381,8 +399,8 @@ public void regionIsolationOperation(ServerName sourceServerName,
381399
Assert.assertTrue(
382400
listOfRegionIDsToIsolate.contains(onlineRegions.get(i).getRegionInfo().getEncodedName()));
383401
}
384-
LOG.debug("Successfully Isolated " + listOfRegionIDsToIsolate.size() + " regions : "
385-
+ listOfRegionIDsToIsolate + " on " + destinationRS.getServerName());
402+
LOG.debug("Successfully Isolated {} regions: {} on {}", listOfRegionIDsToIsolate.size(),
403+
listOfRegionIDsToIsolate, destinationRS.getServerName());
386404
} finally {
387405
admin.recommissionRegionServer(destinationRS.getServerName(), null);
388406
}

0 commit comments

Comments
 (0)