HBASE-5857 RIT map in RS not getting cleared while region opening

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1329470 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael Stack 2012-04-23 21:54:14 +00:00
parent abae95c2aa
commit 17cf114310
2 changed files with 29 additions and 1 deletions

View File

@ -2485,9 +2485,9 @@ public class HRegionServer extends RegionServer
} }
LOG.info("Received request to open region: " + LOG.info("Received request to open region: " +
region.getRegionNameAsString()); region.getRegionNameAsString());
HTableDescriptor htd = this.tableDescriptors.get(region.getTableName());
this.regionsInTransitionInRS.putIfAbsent(region.getEncodedNameAsBytes(), this.regionsInTransitionInRS.putIfAbsent(region.getEncodedNameAsBytes(),
true); true);
HTableDescriptor htd = this.tableDescriptors.get(region.getTableName());
// Need to pass the expected version in the constructor. // Need to pass the expected version in the constructor.
if (region.isRootRegion()) { if (region.isRootRegion()) {
this.service.submit(new OpenRootHandler(this, this, region, htd, this.service.submit(new OpenRootHandler(this, this, region, htd,

View File

@ -47,9 +47,13 @@ import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import org.junit.experimental.categories.Category; import org.junit.experimental.categories.Category;
import org.mockito.Mockito;
import org.mockito.internal.util.reflection.Whitebox;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assert.assertFalse;
/** /**
* Test open and close of regions using zk. * Test open and close of regions using zk.
@ -308,6 +312,30 @@ public class TestZKBasedOpenCloseRegion {
LOG.info("Done with testCloseRegion"); LOG.info("Done with testCloseRegion");
} }
/**
* If region open fails with IOException in openRegion() while doing tableDescriptors.get()
* the region should not add into regionsInTransitionInRS map
* @throws Exception
*/
@Test
public void testRegionOpenFailsDueToIOException() throws Exception {
HRegionInfo REGIONINFO = new HRegionInfo(Bytes.toBytes("t"),
HConstants.EMPTY_START_ROW, HConstants.EMPTY_START_ROW);
HRegionServer regionServer = TEST_UTIL.getHBaseCluster().getRegionServer(0);
TableDescriptors htd = Mockito.mock(TableDescriptors.class);
Object orizinalState = Whitebox.getInternalState(regionServer,"tableDescriptors");
Whitebox.setInternalState(regionServer, "tableDescriptors", htd);
Mockito.doThrow(new IOException()).when(htd).get((byte[]) Mockito.any());
try {
regionServer.openRegion(REGIONINFO);
fail("It should throw IOException ");
} catch (IOException e) {
}
Whitebox.setInternalState(regionServer, "tableDescriptors", orizinalState);
assertFalse("Region should not be in RIT",
regionServer.getRegionsInTransitionInRS().containsKey(REGIONINFO.getEncodedNameAsBytes()));
}
private static void waitUntilAllRegionsAssigned() private static void waitUntilAllRegionsAssigned()
throws IOException { throws IOException {
HTable meta = new HTable(TEST_UTIL.getConfiguration(), HTable meta = new HTable(TEST_UTIL.getConfiguration(),