You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jx...@apache.org on 2013/08/16 17:38:42 UTC

svn commit: r1514751 - in /hbase/branches/0.95/hbase-server/src: main/java/org/apache/hadoop/hbase/master/ main/java/org/apache/hadoop/hbase/util/ test/java/org/apache/hadoop/hbase/master/handler/ test/java/org/apache/hadoop/hbase/regionserver/

Author: jxiang
Date: Fri Aug 16 15:38:42 2013
New Revision: 1514751

URL: http://svn.apache.org/r1514751
Log:
HBASE-9204 An Offline SplitParent Region can be assigned breaking split references

Modified:
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ModifyRegionUtils.java
    hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestCreateTableHandler.java
    hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java?rev=1514751&r1=1514750&r2=1514751&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java Fri Aug 16 15:38:42 2013
@@ -655,17 +655,28 @@ public class AssignmentManager extends Z
           LOG.warn("Processed region " + prettyPrintedRegionName + " in state : " + et +
               " on a dead regionserver: " + sn + " doing nothing");
         } else {
+          // Splitting region should be online. We could have skipped it during
+          // user region rebuilding since we may consider the split is completed.
+          // Put it in SPLITTING state to avoid complications.
+          regionStates.regionOnline(regionInfo, sn);
           regionStates.updateRegionState(rt, RegionState.State.SPLITTING);
           LOG.info("Processed " + prettyPrintedRegionName + " in state : " + et);
         }
         break;
       case RS_ZK_REGION_SPLIT:
         if (!serverManager.isServerOnline(sn)) {
-          forceOffline(regionInfo, rt);
+          // The region is already in SPLIT state, do nothing
+          LOG.warn("Processed " + prettyPrintedRegionName
+            + " in state : " + et + " on a dead regionserver: " + sn
+            + " doing nothing");
         } else {
-          LOG.info("Processed " + prettyPrintedRegionName + " in state : " + et +
-            " nothing to do.");
-          // We don't do anything. The regionserver is supposed to update the znode
+          // Splitting region should be online. We could have skipped it during
+          // user region rebuilding since we may consider the split is completed.
+          // Put it in SPLITTING state to avoid complications.
+          regionStates.regionOnline(regionInfo, sn);
+          regionStates.updateRegionState(rt, RegionState.State.SPLITTING);
+          LOG.info("Processed " + prettyPrintedRegionName + " in state : " + et);
+          // Move the region to splitting state. The regionserver is supposed to update the znode
           // multiple times so if it's still up we will receive an update soon.
         }
         break;
@@ -684,13 +695,18 @@ public class AssignmentManager extends Z
         break;
       case RS_ZK_REGION_MERGED:
         if (!serverManager.isServerOnline(sn)) {
-          // ServerShutdownHandler would handle this region
+          // Do nothing, merging regions are already removed from meta,
+          // so they are not in region states map any more.
+          // The new region will be assigned by the ServerShutdownHandler
           LOG.warn("Processed " + prettyPrintedRegionName
-              + " in state : " + et + " on a dead regionserver: " + sn
-              + " doing nothing");
+            + " in state : " + et + " on a dead regionserver: " + sn
+            + " doing nothing");
         } else {
+          // Merging regions are already removed from meta. It doesn't hurt to
+          // do nothing here, no need to set them to merging state here. We are fine
+          // to put the new region to online state during user region rebuilding.
           LOG.info("Processed " + prettyPrintedRegionName + " in state : " +
-              et + " nothing to do.");
+            et + " nothing to do.");
           // We don't do anything. The regionserver is supposed to update the znode
           // multiple times so if it's still up we will receive an update soon.
         }
@@ -1786,34 +1802,34 @@ public class AssignmentManager extends Z
     if (state == null) {
       LOG.warn("Assigning a region not in region states: " + region);
       state = regionStates.createRegionState(region);
-    } else {
-      switch (state.getState()) {
-      case OPEN:
-      case OPENING:
-      case PENDING_OPEN:
-        if (!forceNewPlan) {
-          LOG.debug("Attempting to assign region " +
-            region + " but it is already in transition: " + state);
-          return null;
-        }
-      case CLOSING:
-      case PENDING_CLOSE:
-      case FAILED_CLOSE:
-      case FAILED_OPEN:
-        unassign(region, state, -1, null, false, null);
-        state = regionStates.getRegionState(region);
-        if (state.isOffline()) break;
-      case CLOSED:
-        LOG.debug("Forcing OFFLINE; was=" + state);
-        state = regionStates.updateRegionState(
-          region, RegionState.State.OFFLINE);
-      case OFFLINE:
-        break;
-      default:
-        LOG.error("Trying to assign region " + region
-          + ", which is in state " + state);
+    }
+
+    switch (state.getState()) {
+    case OPEN:
+    case OPENING:
+    case PENDING_OPEN:
+      if (!forceNewPlan) {
+        LOG.debug("Attempting to assign region " +
+          region + " but it is already in transition: " + state);
         return null;
       }
+    case CLOSING:
+    case PENDING_CLOSE:
+    case FAILED_CLOSE:
+    case FAILED_OPEN:
+      unassign(region, state, -1, null, false, null);
+      state = regionStates.getRegionState(region);
+      if (state.isOffline()) break;
+    case CLOSED:
+      LOG.debug("Forcing OFFLINE; was=" + state);
+      state = regionStates.updateRegionState(
+        region, RegionState.State.OFFLINE);
+    case OFFLINE:
+      break;
+    default:
+      LOG.error("Trying to assign region " + region
+        + ", which is in state " + state);
+      return null;
     }
     return state;
   }
@@ -2640,6 +2656,13 @@ public class AssignmentManager extends Z
       ServerName regionLocation = region.getSecond();
       if (regionInfo == null) continue;
       regionStates.createRegionState(regionInfo);
+      if (regionStates.isRegionInState(regionInfo, State.SPLIT)) {
+        // Split is considered to be completed. If the split znode still
+        // exists, the region will be put back to SPLITTING state later
+        LOG.debug("Region " + regionInfo.getRegionNameAsString()
+           + " split is completed. Hence need not add to regions list");
+        continue;
+      }
       TableName tableName = regionInfo.getTableName();
       if (regionLocation == null) {
         // regionLocation could be null if createTable didn't finish properly.
@@ -2672,19 +2695,6 @@ public class AssignmentManager extends Z
           setEnabledTable(tableName);
         }
       } else {
-        // If region is in offline and split state check the ZKNode
-        if (regionInfo.isOffline() && regionInfo.isSplit()) {
-          String node = ZKAssign.getNodeName(this.watcher, regionInfo
-              .getEncodedName());
-          Stat stat = new Stat();
-          byte[] data = ZKUtil.getDataNoWatch(this.watcher, node, stat);
-          // If znode does not exist, don't consider this region
-          if (data == null) {
-            LOG.debug("Region "	+  regionInfo.getRegionNameAsString()
-               + " split is completed. Hence need not add to regions list");
-            continue;
-          }
-        }
         // Region is being served and on an active server
         // add only if region not in disabled or enabling table
         if (!disabledOrEnablingTables.contains(tableName)) {

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java?rev=1514751&r1=1514750&r2=1514751&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/master/RegionStates.java Fri Aug 16 15:38:42 2013
@@ -29,12 +29,12 @@ import java.util.TreeMap;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.classification.InterfaceAudience;
-import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.RegionTransition;
 import org.apache.hadoop.hbase.Server;
 import org.apache.hadoop.hbase.ServerLoad;
 import org.apache.hadoop.hbase.ServerName;
+import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.catalog.MetaReader;
 import org.apache.hadoop.hbase.master.RegionState.State;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -173,8 +173,9 @@ public class RegionStates {
   }
 
   /**
-   * Add a list of regions to RegionStates. The initial state is OFFLINE.
-   * If any region is already in RegionStates, that region will be skipped.
+   * Add a list of regions to RegionStates. If a region is split
+   * and offline, its state will be SPLIT. Otherwise, its state will
+   * be OFFLINE. Region already in RegionStates will be skipped.
    */
   public synchronized void createRegionStates(
       final List<HRegionInfo> hris) {
@@ -184,18 +185,20 @@ public class RegionStates {
   }
 
   /**
-   * Add a region to RegionStates. The initial state is OFFLINE.
-   * If it is already in RegionStates, this call has no effect,
-   * and the original state is returned.
+   * Add a region to RegionStates. If the region is split
+   * and offline, its state will be SPLIT. Otherwise, its state will
+   * be OFFLINE. If it is already in RegionStates, this call has
+   * no effect, and the original state is returned.
    */
   public synchronized RegionState createRegionState(final HRegionInfo hri) {
+    State newState = (hri.isOffline() && hri.isSplit()) ? State.SPLIT : State.OFFLINE;
     String regionName = hri.getEncodedName();
     RegionState regionState = regionStates.get(regionName);
     if (regionState != null) {
-      LOG.warn("Tried to create a state of a region already in RegionStates, " +
-        "used existing state: " + regionState + ", ignored new state: state=OFFLINE, server=null");
+      LOG.warn("Tried to create a state for a region already in RegionStates, "
+        + "used existing: " + regionState + ", ignored new: " + newState);
     } else {
-      regionState = new RegionState(hri, State.OFFLINE);
+      regionState = new RegionState(hri, newState);
       regionStates.put(regionName, regionState);
     }
     return regionState;
@@ -579,8 +582,8 @@ public class RegionStates {
       }
       return hri;
     } catch (IOException e) {
-      server.abort("Aborting because error occoured while reading " +
-        Bytes.toStringBinary(regionName) + " from .META.", e);
+      server.abort("Aborting because error occoured while reading "
+        + Bytes.toStringBinary(regionName) + " from .META.", e);
       return null;
     }
   }

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ModifyRegionUtils.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ModifyRegionUtils.java?rev=1514751&r1=1514750&r2=1514751&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ModifyRegionUtils.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/util/ModifyRegionUtils.java Fri Aug 16 15:38:42 2013
@@ -22,7 +22,6 @@ package org.apache.hadoop.hbase.util;
 import java.io.IOException;
 import java.io.InterruptedIOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CompletionService;
@@ -35,18 +34,11 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.backup.HFileArchiver;
-import org.apache.hadoop.hbase.catalog.CatalogTracker;
-import org.apache.hadoop.hbase.catalog.MetaEditor;
-import org.apache.hadoop.hbase.client.Delete;
-import org.apache.hadoop.hbase.master.AssignmentManager;
 import org.apache.hadoop.hbase.regionserver.HRegion;
 
 /**
@@ -157,21 +149,4 @@ public abstract class ModifyRegionUtils 
         });
     return regionOpenAndInitThreadPool;
   }
-
-  /**
-   * Trigger immediate assignment of the regions in round-robin fashion
-   *
-   * @param assignmentManager
-   * @param regions
-   */
-  public static void assignRegions(final AssignmentManager assignmentManager,
-      final List<HRegionInfo> regions) throws IOException {
-    try {
-      assignmentManager.getRegionStates().createRegionStates(regions);
-      assignmentManager.assign(regions);
-    } catch (InterruptedException e) {
-      LOG.error("Caught " + e + " during round-robin assignment");
-      throw new InterruptedIOException(e.getMessage());
-    }
-  }
 }

Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestCreateTableHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestCreateTableHandler.java?rev=1514751&r1=1514750&r2=1514751&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestCreateTableHandler.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestCreateTableHandler.java Fri Aug 16 15:38:42 2013
@@ -26,8 +26,8 @@ import java.util.List;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HRegionInfo;
@@ -35,10 +35,14 @@ import org.apache.hadoop.hbase.HTableDes
 import org.apache.hadoop.hbase.MediumTests;
 import org.apache.hadoop.hbase.MiniHBaseCluster;
 import org.apache.hadoop.hbase.Server;
+import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.master.HMaster;
 import org.apache.hadoop.hbase.master.MasterFileSystem;
 import org.apache.hadoop.hbase.master.MasterServices;
+import org.apache.hadoop.hbase.master.RegionState.State;
+import org.apache.hadoop.hbase.master.RegionStates;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.FSUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -48,7 +52,6 @@ import org.junit.experimental.categories
 public class TestCreateTableHandler {
   private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
   private static final Log LOG = LogFactory.getLog(TestCreateTableHandler.class);
-  private static final byte[] TABLENAME = Bytes.toBytes("TestCreateTableHandler");
   private static final byte[] FAMILYNAME = Bytes.toBytes("fam");
   private static boolean throwException = false;
   
@@ -65,10 +68,11 @@ public class TestCreateTableHandler {
   }
 
   @Test (timeout=300000)
-  public void testCreateTableHandlerIfCalledTwoTimesAndFirstOneIsUnderProgress() throws Exception {
+  public void testCreateTableCalledTwiceAndFirstOneInProgress() throws Exception {
+    final byte[] tableName = Bytes.toBytes("testCreateTableCalledTwiceAndFirstOneInProgress");
     final MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
     final HMaster m = cluster.getMaster();
-    final HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(TABLENAME));
+    final HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName));
     desc.addFamily(new HColumnDescriptor(FAMILYNAME));
     final HRegionInfo[] hRegionInfos = new HRegionInfo[] { new HRegionInfo(desc.getTableName(), null,
         null) };
@@ -83,13 +87,48 @@ public class TestCreateTableHandler {
     handler1.prepare();
     handler1.process();
     for (int i = 0; i < 100; i++) {
-      if (!TEST_UTIL.getHBaseAdmin().isTableAvailable(TABLENAME)) {
+      if (!TEST_UTIL.getHBaseAdmin().isTableAvailable(tableName)) {
         Thread.sleep(200);
       }
     }
-    assertTrue(TEST_UTIL.getHBaseAdmin().isTableEnabled(TABLENAME));
+    assertTrue(TEST_UTIL.getHBaseAdmin().isTableEnabled(tableName));
+  }
 
+  @Test (timeout=300000)
+  public void testCreateTableWithSplitRegion() throws Exception {
+    final byte[] tableName = Bytes.toBytes("testCreateTableWithSplitRegion");
+    final MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();
+    final HMaster m = cluster.getMaster();
+    final HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName));
+    desc.addFamily(new HColumnDescriptor(FAMILYNAME));
+    byte[] splitPoint = Bytes.toBytes("split-point");
+    long ts = System.currentTimeMillis();
+    HRegionInfo d1 = new HRegionInfo(desc.getTableName(), null, splitPoint, false, ts);
+    HRegionInfo d2 = new HRegionInfo(desc.getTableName(), splitPoint, null, false, ts + 1);
+    HRegionInfo parent = new HRegionInfo(desc.getTableName(), null, null, true, ts + 2);
+    parent.setOffline(true);
+
+    Path tempdir = m.getMasterFileSystem().getTempDir();
+    FileSystem fs = m.getMasterFileSystem().getFileSystem();
+    Path tempTableDir = FSUtils.getTableDir(tempdir, desc.getTableName());
+    fs.delete(tempTableDir, true); // Clean up temp table dir if exists
+
+    final HRegionInfo[] hRegionInfos = new HRegionInfo[] {d1, d2, parent};
+    CreateTableHandler handler = new CreateTableHandler(m, m.getMasterFileSystem(),
+      desc, cluster.getConfiguration(), hRegionInfos, m);
+    handler.prepare();
+    handler.process();
+    for (int i = 0; i < 100; i++) {
+      if (!TEST_UTIL.getHBaseAdmin().isTableAvailable(tableName)) {
+        Thread.sleep(300);
+      }
+    }
+    assertTrue(TEST_UTIL.getHBaseAdmin().isTableEnabled(tableName));
+    RegionStates regionStates = m.getAssignmentManager().getRegionStates();
+    assertTrue("Parent should be in SPLIT state",
+      regionStates.isRegionInState(parent, State.SPLIT));
   }
+
   @Test (timeout=60000)
   public void testMasterRestartAfterEnablingNodeIsCreated() throws Exception {
     byte[] tableName = Bytes.toBytes("testMasterRestartAfterEnablingNodeIsCreated");
@@ -106,9 +145,8 @@ public class TestCreateTableHandler {
     handler.process();
     abortAndStartNewMaster(cluster);
     assertTrue(cluster.getLiveMasterThreads().size() == 1);
-    
   }
-  
+
   private void abortAndStartNewMaster(final MiniHBaseCluster cluster) throws IOException {
     cluster.abortMaster(0);
     cluster.waitOnMaster(0);

Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java?rev=1514751&r1=1514750&r2=1514751&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java Fri Aug 16 15:38:42 2013
@@ -34,8 +34,6 @@ import java.util.concurrent.CountDownLat
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Abortable;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.HBaseIOException;
@@ -71,8 +69,6 @@ import org.apache.hadoop.hbase.master.ha
 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
-import org.apache.hadoop.hbase.util.FSUtils;
-import org.apache.hadoop.hbase.util.HBaseFsck;
 import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread;
 import org.apache.hadoop.hbase.util.Threads;
 import org.apache.hadoop.hbase.zookeeper.ZKAssign;
@@ -550,7 +546,7 @@ public class TestSplitTransactionOnClust
    * @throws KeeperException
    * @throws DeserializationException
    */
-  @Test(timeout = 300000)
+  @Test(timeout = 400000)
   public void testMasterRestartWhenSplittingIsPartial()
       throws IOException, InterruptedException, NodeExistsException,
       KeeperException, DeserializationException, ServiceException {
@@ -598,13 +594,30 @@ public class TestSplitTransactionOnClust
 
       this.admin = new HBaseAdmin(TESTING_UTIL.getConfiguration());
 
-      // update the hri to be offlined and splitted.
+      // Update the region to be offline and split, so that HRegionInfo#equals
+      // returns true in checking rebuilt region states map.
       hri.setOffline(true);
       hri.setSplit(true);
       ServerName regionServerOfRegion = master.getAssignmentManager()
         .getRegionStates().getRegionServerOfRegion(hri);
       assertTrue(regionServerOfRegion != null);
 
+      // Remove the block so that split can move ahead.
+      SplitRegionHandler.TEST_SKIP = false;
+      String node = ZKAssign.getNodeName(zkw, hri.getEncodedName());
+      Stat stat = new Stat();
+      byte[] data = ZKUtil.getDataNoWatch(zkw, node, stat);
+      // ZKUtil.create
+      for (int i=0; data != null && i<60; i++) {
+        Thread.sleep(1000);
+        data = ZKUtil.getDataNoWatch(zkw, node, stat);
+      }
+      assertNull("Waited too long for ZK node to be removed: "+node, data);
+      RegionStates regionStates = master.getAssignmentManager().getRegionStates();
+      assertTrue("Split parent should be in SPLIT state",
+        regionStates.isRegionInState(hri, State.SPLIT));
+      regionServerOfRegion = regionStates.getRegionServerOfRegion(hri);
+      assertTrue(regionServerOfRegion == null);
     } finally {
       // Set this flag back.
       SplitRegionHandler.TEST_SKIP = false;
@@ -663,7 +676,6 @@ public class TestSplitTransactionOnClust
       for (int i=0; data != null && i<60; i++) {
         Thread.sleep(1000);
         data = ZKUtil.getDataNoWatch(zkw, node, stat);
-
       }
       assertNull("Waited too long for ZK node to be removed: "+node, data);
 
@@ -671,10 +683,14 @@ public class TestSplitTransactionOnClust
 
       this.admin = new HBaseAdmin(TESTING_UTIL.getConfiguration());
 
+      // Update the region to be offline and split, so that HRegionInfo#equals
+      // returns true in checking rebuilt region states map.
       hri.setOffline(true);
       hri.setSplit(true);
-      ServerName regionServerOfRegion = master.getAssignmentManager()
-        .getRegionStates().getRegionServerOfRegion(hri);
+      RegionStates regionStates = master.getAssignmentManager().getRegionStates();
+      assertTrue("Split parent should be in SPLIT state",
+        regionStates.isRegionInState(hri, State.SPLIT));
+      ServerName regionServerOfRegion = regionStates.getRegionServerOfRegion(hri);
       assertTrue(regionServerOfRegion == null);
     } finally {
       // Set this flag back.
@@ -815,7 +831,7 @@ public class TestSplitTransactionOnClust
     final byte[] tableName = Bytes.toBytes("testSplitBeforeSettingSplittingInZK");
     try {
       // Create table then get the single region for our new table.
-      HTable t = createTableAndWait(tableName, CF);
+      createTableAndWait(tableName, CF);
 
       List<HRegion> regions = awaitTableRegions(tableName);
       assertTrue("Table not online", cluster.getRegions(tableName).size() != 0);
@@ -908,7 +924,6 @@ public class TestSplitTransactionOnClust
   }
 
   private HRegion findSplittableRegion(final List<HRegion> regions) throws InterruptedException {
-    HRegion region = null;
     for (int i = 0; i < 5; ++i) {
       for (HRegion r: regions) {
         if (r.isSplittable()) {
@@ -957,17 +972,6 @@ public class TestSplitTransactionOnClust
         ProtobufUtil.getOnlineRegions(server).size() <= regionCount);
   }
 
-  private void removeDaughterFromMeta(final byte [] regionName) throws IOException {
-    HTable metaTable = new HTable(TESTING_UTIL.getConfiguration(), TableName.META_TABLE_NAME);
-    try {
-      Delete d = new Delete(regionName);
-      LOG.info("Deleted " + Bytes.toString(regionName));
-      metaTable.delete(d);
-    } finally {
-      metaTable.close();
-    }
-  }
-
   /**
    * Ensure single table region is not on same server as the single .META. table
    * region.
@@ -1100,10 +1104,11 @@ public class TestSplitTransactionOnClust
   }
 
   private static class SplittingNodeCreationFailedException  extends IOException {
+    private static final long serialVersionUID = 1652404976265623004L;
+
     public SplittingNodeCreationFailedException () {
       super();
     }
   }
-
 }