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:
parent
abae95c2aa
commit
17cf114310
|
@ -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,
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
Loading…
Reference in New Issue