Skip to content

Commit 719e051

Browse files
petersomogyitok_sfci135 tok_sfci135
authored andcommitted
HBASE-28948 RegionMover tool fails when table is deleted (apache#6425)
Signed-off-by: Wellington Chevreuil <wchevreuil@apache.org> (cherry picked from commit 344bf78)
1 parent 391148f commit 719e051

File tree

2 files changed

+79
-26
lines changed

2 files changed

+79
-26
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;

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

Lines changed: 78 additions & 25 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 HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
7576

7677
@BeforeClass
@@ -87,19 +88,54 @@ public static void tearDownAfterClass() throws Exception {
8788

8889
@Before
8990
public void setUp() throws Exception {
91+
createTable(name.getMethodName());
92+
}
93+
94+
@After
95+
public void tearDown() throws Exception {
9096
final TableName tableName = TableName.valueOf(name.getMethodName());
97+
TEST_UTIL.getAdmin().disableTable(tableName);
98+
TEST_UTIL.getAdmin().deleteTable(tableName);
99+
}
100+
101+
private TableName createTable(String name) throws IOException {
102+
final TableName tableName = TableName.valueOf(name);
91103
TableDescriptor tableDesc = TableDescriptorBuilder.newBuilder(tableName)
92-
.setColumnFamily(ColumnFamilyDescriptorBuilder.of("fam1")).build();
104+
.setColumnFamily(ColumnFamilyDescriptorBuilder.of(CF)).build();
93105
int startKey = 0;
94106
int endKey = 80000;
95107
TEST_UTIL.getAdmin().createTable(tableDesc, Bytes.toBytes(startKey), Bytes.toBytes(endKey), 9);
108+
return tableName;
96109
}
97110

98-
@After
99-
public void tearDown() throws Exception {
111+
@Test
112+
public void testWithMergedRegions() throws Exception {
100113
final TableName tableName = TableName.valueOf(name.getMethodName());
101-
TEST_UTIL.getAdmin().disableTable(tableName);
102-
TEST_UTIL.getAdmin().deleteTable(tableName);
114+
MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
115+
Admin admin = TEST_UTIL.getAdmin();
116+
Table table = TEST_UTIL.getConnection().getTable(tableName);
117+
List<Put> puts = createPuts(10000);
118+
table.put(puts);
119+
admin.flush(tableName);
120+
HRegionServer regionServer = cluster.getRegionServer(0);
121+
String rsName = regionServer.getServerName().getAddress().toString();
122+
int numRegions = regionServer.getNumberOfOnlineRegions();
123+
List<HRegion> hRegions = regionServer.getRegions().stream()
124+
.filter(hRegion -> hRegion.getRegionInfo().getTable().equals(tableName))
125+
.collect(Collectors.toList());
126+
RegionMover.RegionMoverBuilder rmBuilder =
127+
new RegionMover.RegionMoverBuilder(rsName, TEST_UTIL.getConfiguration()).ack(true)
128+
.maxthreads(8);
129+
try (RegionMover rm = rmBuilder.build()) {
130+
LOG.debug("Unloading {}", regionServer.getServerName());
131+
rm.unload();
132+
Assert.assertEquals(0, regionServer.getNumberOfOnlineRegions());
133+
LOG.debug("Successfully Unloaded, now Loading");
134+
admin.mergeRegionsAsync(new byte[][] { hRegions.get(0).getRegionInfo().getRegionName(),
135+
hRegions.get(1).getRegionInfo().getRegionName() }, true).get(5, TimeUnit.SECONDS);
136+
Assert.assertTrue(rm.load());
137+
Assert.assertEquals(numRegions - 2, regionServer.getNumberOfOnlineRegions());
138+
}
103139
}
104140

105141
@Test
@@ -108,11 +144,7 @@ public void testWithSplitRegions() throws Exception {
108144
MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
109145
Admin admin = TEST_UTIL.getAdmin();
110146
Table table = TEST_UTIL.getConnection().getTable(tableName);
111-
List<Put> puts = new ArrayList<>();
112-
for (int i = 10; i < 50000; i++) {
113-
puts.add(new Put(Bytes.toBytes(i)).addColumn(Bytes.toBytes("fam1"), Bytes.toBytes("q1"),
114-
Bytes.toBytes("val_" + i)));
115-
}
147+
List<Put> puts = createPuts(50000);
116148
table.put(puts);
117149
admin.flush(tableName);
118150
admin.compact(tableName);
@@ -157,11 +189,7 @@ public void testFailedRegionMove() throws Exception {
157189
MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
158190
Admin admin = TEST_UTIL.getAdmin();
159191
Table table = TEST_UTIL.getConnection().getTable(tableName);
160-
List<Put> puts = new ArrayList<>();
161-
for (int i = 0; i < 1000; i++) {
162-
puts.add(new Put(Bytes.toBytes("rowkey_" + i)).addColumn(Bytes.toBytes("fam1"),
163-
Bytes.toBytes("q1"), Bytes.toBytes("val_" + i)));
164-
}
192+
List<Put> puts = createPuts(1000);
165193
table.put(puts);
166194
admin.flush(tableName);
167195
HRegionServer regionServer = cluster.getRegionServer(0);
@@ -183,14 +211,30 @@ public void testFailedRegionMove() throws Exception {
183211
}
184212
}
185213

214+
@Test
215+
public void testDeletedTable() throws Exception {
216+
TableName tableNameToDelete = createTable(name.getMethodName() + "ToDelete");
217+
MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
218+
HRegionServer regionServer = cluster.getRegionServer(0);
219+
String rsName = regionServer.getServerName().getAddress().toString();
220+
RegionMover.RegionMoverBuilder rmBuilder =
221+
new RegionMover.RegionMoverBuilder(rsName, TEST_UTIL.getConfiguration()).ack(true)
222+
.maxthreads(8);
223+
try (Admin admin = TEST_UTIL.getAdmin(); RegionMover rm = rmBuilder.build()) {
224+
LOG.debug("Unloading {}", regionServer.getServerName());
225+
rm.unload();
226+
Assert.assertEquals(0, regionServer.getNumberOfOnlineRegions());
227+
LOG.debug("Successfully Unloaded, now delete table");
228+
admin.disableTable(tableNameToDelete);
229+
admin.deleteTable(tableNameToDelete);
230+
Assert.assertTrue(rm.load());
231+
}
232+
}
233+
186234
public void loadDummyDataInTable(TableName tableName) throws Exception {
187235
Admin admin = TEST_UTIL.getAdmin();
188236
Table table = TEST_UTIL.getConnection().getTable(tableName);
189-
List<Put> puts = new ArrayList<>();
190-
for (int i = 0; i < 1000; i++) {
191-
puts.add(new Put(Bytes.toBytes("rowkey_" + i)).addColumn(Bytes.toBytes("fam1"),
192-
Bytes.toBytes("q1"), Bytes.toBytes("val_" + i)));
193-
}
237+
List<Put> puts = createPuts(1000);
194238
table.put(puts);
195239
admin.flush(tableName);
196240
}
@@ -263,6 +307,15 @@ public void testIsolateMetaAndRandomRegionOnTheRandomServer() throws Exception {
263307
regionIsolationOperation(randomSeverRegion, randomSeverRegion, 2, true);
264308
}
265309

310+
private List<Put> createPuts(int count) {
311+
List<Put> puts = new ArrayList<>();
312+
for (int i = 0; i < count; i++) {
313+
puts.add(new Put(Bytes.toBytes("rowkey_" + i)).addColumn(Bytes.toBytes(CF),
314+
Bytes.toBytes("q1"), Bytes.toBytes("val_" + i)));
315+
}
316+
return puts;
317+
}
318+
266319
public ServerName findMetaRSLocation() throws Exception {
267320
ZKWatcher zkWatcher = new ZKWatcher(TEST_UTIL.getConfiguration(), null, null);
268321
List<HRegionLocation> result = new ArrayList<>();
@@ -291,7 +344,7 @@ public ServerName findSourceServerName(TableName tableName) throws Exception {
291344
}
292345
if (sourceServer == null) {
293346
throw new Exception(
294-
"This shouln't happen, No RS found with more than 2 regions of table : " + tableName);
347+
"This shouldn't happen, No RS found with more than 2 regions of table : " + tableName);
295348
}
296349
return sourceServer;
297350
}
@@ -338,7 +391,7 @@ public void regionIsolationOperation(ServerName sourceServerName,
338391
new RegionMover.RegionMoverBuilder(destinationRSName, TEST_UTIL.getConfiguration()).ack(true)
339392
.maxthreads(8).isolateRegionIdArray(listOfRegionIDsToIsolate);
340393
try (RegionMover rm = rmBuilder.build()) {
341-
LOG.debug("Unloading {} except regions : {}", destinationRS.getServerName(),
394+
LOG.debug("Unloading {} except regions: {}", destinationRS.getServerName(),
342395
listOfRegionIDsToIsolate);
343396
rm.isolateRegions();
344397
Assert.assertEquals(numRegionsToIsolate, destinationRS.getNumberOfOnlineRegions());
@@ -347,8 +400,8 @@ public void regionIsolationOperation(ServerName sourceServerName,
347400
Assert.assertTrue(
348401
listOfRegionIDsToIsolate.contains(onlineRegions.get(i).getRegionInfo().getEncodedName()));
349402
}
350-
LOG.debug("Successfully Isolated " + listOfRegionIDsToIsolate.size() + " regions : "
351-
+ listOfRegionIDsToIsolate + " on " + destinationRS.getServerName());
403+
LOG.debug("Successfully Isolated {} regions: {} on {}", listOfRegionIDsToIsolate.size(),
404+
listOfRegionIDsToIsolate, destinationRS.getServerName());
352405
} finally {
353406
admin.recommissionRegionServer(destinationRS.getServerName(), null);
354407
}

0 commit comments

Comments
 (0)