Index: src/main/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java (revision 1328451) +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -1174,6 +1174,11 @@ this.assignmentManager.unassign(hri); } else { dest = new ServerName(Bytes.toString(destServerName)); + if (dest.equals(p.getSecond())) { + LOG.debug("Skipping move of region " + hri.getRegionNameAsString() + + " because region already assigned to the same server " + dest +"."); + return; + } try { if (this.cpHost != null) { if (this.cpHost.preMove(p.getFirst(), p.getSecond(), dest)) { Index: src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java (revision 1328451) +++ src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java (working copy) @@ -43,6 +43,8 @@ import org.apache.hadoop.hbase.executor.EventHandler; import org.apache.hadoop.hbase.executor.EventHandler.EventType; import org.apache.hadoop.hbase.executor.ExecutorService; +import org.apache.hadoop.hbase.master.AssignmentManager; +import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.MasterServices; import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.regionserver.HRegionServer; @@ -1404,6 +1406,22 @@ assertTrue(("actual count: " + count), count <= 2); } + @Test + public void testMoveToPreviouslyAssignedRS() throws IOException { + byte[] tableName = Bytes.toBytes("testMoveToPreviouslyAssignedRS"); + MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster(); + HMaster master = cluster.getMaster(); + HBaseAdmin localAdmin = createTable(tableName); + List tableRegions = localAdmin.getTableRegions(tableName); + HRegionInfo hri = tableRegions.get(0); + AssignmentManager am = master.getAssignmentManager(); + ServerName server = am.getRegionServerOfRegion(hri); + localAdmin.move(hri.getEncodedNameAsBytes(), Bytes.toBytes(server.getServerName())); + assertEquals("Current region server and region server before move should be same.", server, + am.getRegionServerOfRegion(hri)); + } + + private void setUpforLogRolling() { // Force a region split after every 768KB TEST_UTIL.getConfiguration().setLong(HConstants.HREGION_MAX_FILESIZE,