You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ra...@apache.org on 2012/05/02 19:40:43 UTC
svn commit: r1333124 - in /hbase/trunk/src:
main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
Author: ramkrishna
Date: Wed May 2 17:40:43 2012
New Revision: 1333124
URL: http://svn.apache.org/viewvc?rev=1333124&view=rev
Log:
HBASE-5840 Open Region FAILED_OPEN doesn't clear the TaskMonitor Status, keeps showing the old status (RajeshBabu)
Modified:
hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1333124&r1=1333123&r2=1333124&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Wed May 2 17:40:43 2012
@@ -491,6 +491,22 @@ public class HRegion implements HeapSize
MonitoredTask status = TaskMonitor.get().createStatus(
"Initializing region " + this);
+ long nextSeqId = -1;
+ try {
+ nextSeqId = initializeRegionInternals(reporter, status);
+ return nextSeqId;
+ } finally {
+ // nextSeqid will be -1 if the initialization fails.
+ // At least it will be 0 otherwise.
+ if (nextSeqId == -1) {
+ status
+ .abort("Exception during region " + this.getRegionNameAsString() + " initialization.");
+ }
+ }
+ }
+
+ private long initializeRegionInternals(final CancelableProgressable reporter, MonitoredTask status)
+ throws IOException, UnsupportedEncodingException {
if (coprocessorHost != null) {
status.setStatus("Running coprocessor pre-open hook");
coprocessorHost.preOpen();
Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java?rev=1333124&r1=1333123&r2=1333124&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java (original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java Wed May 2 17:40:43 2012
@@ -69,6 +69,7 @@ import org.apache.hadoop.hbase.filter.Nu
import org.apache.hadoop.hbase.filter.PrefixFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.master.HMaster;
+import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;
import org.apache.hadoop.hbase.monitoring.MonitoredTask;
import org.apache.hadoop.hbase.monitoring.TaskMonitor;
import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;
@@ -87,6 +88,7 @@ import org.apache.hadoop.hbase.util.Pair
import org.apache.hadoop.hbase.util.Threads;
import org.junit.Test;
import org.junit.experimental.categories.Category;
+import org.mockito.Mockito;
import com.google.common.collect.Lists;
@@ -3459,6 +3461,45 @@ public class TestHRegion extends HBaseTe
}
}
}
+
+ /**
+ * Testcase to check state of region initialization task set to ABORTED or not if any exceptions
+ * during initialization
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {
+ HRegionInfo info = null;
+ try {
+ FileSystem fs = Mockito.mock(FileSystem.class);
+ Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());
+ HTableDescriptor htd = new HTableDescriptor(tableName);
+ htd.addFamily(new HColumnDescriptor("cf"));
+ info = new HRegionInfo(htd.getName(), HConstants.EMPTY_BYTE_ARRAY,
+ HConstants.EMPTY_BYTE_ARRAY, false);
+ Path path = new Path(DIR + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");
+ // no where we are instantiating HStore in this test case so useTableNameGlobally is null. To
+ // avoid NullPointerException we are setting useTableNameGlobally to false.
+ SchemaMetrics.setUseTableNameInTest(false);
+ region = HRegion.newHRegion(path, null, fs, conf, info, htd, null);
+ // region initialization throws IOException and set task state to ABORTED.
+ region.initialize();
+ fail("Region initialization should fail due to IOException");
+ } catch (IOException io) {
+ List<MonitoredTask> tasks = TaskMonitor.get().getTasks();
+ for (MonitoredTask monitoredTask : tasks) {
+ if (!(monitoredTask instanceof MonitoredRPCHandler)
+ && monitoredTask.getDescription().contains(region.toString())) {
+ assertTrue("Region state should be ABORTED.",
+ monitoredTask.getState().equals(MonitoredTask.State.ABORTED));
+ break;
+ }
+ }
+ } finally {
+ HRegion.closeHRegion(region);
+ }
+ }
private void putData(int startRow, int numRows, byte [] qf,
byte [] ...families)