Repository: hbase
Updated Branches:
  refs/heads/branch-1.3 72edf521c -> 36ebe05fc


HBASE-18014 A case of Region remain unassigned when table enabled (Allan Yang)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/36ebe05f
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/36ebe05f
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/36ebe05f

Branch: refs/heads/branch-1.3
Commit: 36ebe05fc9013fe27ba0eca410ed11e5c5b112cb
Parents: 72edf52
Author: Andrew Purtell <apurt...@apache.org>
Authored: Fri May 12 16:59:38 2017 -0700
Committer: Andrew Purtell <apurt...@apache.org>
Committed: Fri May 12 17:46:12 2017 -0700

----------------------------------------------------------------------
 .../hadoop/hbase/master/AssignmentManager.java  |  2 ++
 .../apache/hadoop/hbase/client/TestAdmin2.java  | 35 ++++++++++++++++++++
 2 files changed, 37 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/36ebe05f/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
index 1e19397..d247b11 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
@@ -1561,6 +1561,8 @@ public class AssignmentManager extends ZooKeeperListener {
         EventType.RS_ZK_REGION_CLOSED, EventType.M_ZK_REGION_OFFLINE);
     }
     replicasToClose.remove(regionInfo);
+    //Set servername in regionstate to null, see HBASE-18014
+    getRegionStates().updateRegionState(regionInfo, State.OFFLINE, null);
     regionOffline(regionInfo);
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/36ebe05f/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java
index 051998b..72f41a76 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java
@@ -88,6 +88,12 @@ public class TestAdmin2 {
     
TEST_UTIL.getConfiguration().setInt("hbase.regionserver.metahandler.count", 30);
     TEST_UTIL.getConfiguration().setBoolean(
         "hbase.master.enabletable.roundrobin", true);
+    //Set a very short keeptime for processedServers, see HBASE-18014
+    
TEST_UTIL.getConfiguration().setLong("hbase.master.maximum.logsplit.keeptime", 
100);
+    //HBASE-18014, don't Know why @Test (timeout=30000) attribute doesn't work 
when
+    //calling enableTable.So I have to set the sync wait time to a short time 
to timeout
+    //the test of testEnableTableAfterprocessedServersCleaned
+    TEST_UTIL.getConfiguration().setInt("hbase.client.sync.wait.timeout.msec", 
30000);
     TEST_UTIL.startMiniCluster(3);
   }
 
@@ -790,4 +796,33 @@ public class TestAdmin2 {
     // Current state should be the original state again
     assertEquals(initialState, admin.isNormalizerEnabled());
   }
+
+  /**
+   * a UT for HBASE-18014
+   * @throws Exception
+   */
+  @Test (timeout=30000)
+  public void testEnableTableAfterprocessedServersCleaned() throws Exception {
+    String TABLENAME = "testEnableTableAfterprocessedServersCleaned";
+    HBaseAdmin admin = TEST_UTIL.getHBaseAdmin();
+    HTableDescriptor hds = new HTableDescriptor(TableName.valueOf(TABLENAME));
+    HColumnDescriptor hcs = new HColumnDescriptor("cf".getBytes());
+    hds.addFamily(hcs);
+    admin.createTable(hds);
+    HRegionServer server = TEST_UTIL.getHBaseCluster().getRegionServer(0);
+    ServerName serverName = server.getServerName();
+    HRegionInfo region = 
admin.getTableRegions(TableName.valueOf(TABLENAME)).get(0);
+    //move the region to the first server so we can abort this rs
+    admin.move(region.getEncodedNameAsBytes(), 
Bytes.toBytes(serverName.toString()));
+    TEST_UTIL.waitUntilAllRegionsAssigned(TableName.valueOf(TABLENAME));
+    admin.disableTable(TABLENAME);
+    server.abort("abort");
+    //wait for SSH to handle server shutdown
+    Thread.sleep(5000);
+    //trigger a clean of processedServers
+    TEST_UTIL.getHBaseCluster().getMaster().getAssignmentManager()
+        .getRegionStates().logSplit(ServerName.valueOf("fakeServer", 5000, 0));
+    admin.enableTable(TABLENAME);
+    TEST_UTIL.waitUntilAllRegionsAssigned(TableName.valueOf(TABLENAME), 10000);
+  }
 }

Reply via email to