diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/UnassignProcedure.java hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/UnassignProcedure.java index 740c7ff882..8b900e85c6 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/UnassignProcedure.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/UnassignProcedure.java @@ -33,19 +33,19 @@ import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.exceptions.UnexpectedStateException; import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException; +import org.apache.hadoop.hbase.master.RegionState.State; import org.apache.hadoop.hbase.master.assignment.RegionStates.RegionStateNode; import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv; -import org.apache.hadoop.hbase.master.procedure.ServerCrashException; import org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher.RegionCloseOperation; -import org.apache.hadoop.hbase.master.RegionState.State; +import org.apache.hadoop.hbase.master.procedure.ServerCrashException; import org.apache.hadoop.hbase.procedure2.ProcedureMetrics; import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteOperation; +import org.apache.hadoop.hbase.regionserver.RegionServerAbortedException; +import org.apache.hadoop.hbase.regionserver.RegionServerStoppedException; import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RegionTransitionState; import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.UnassignRegionStateData; import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode; -import org.apache.hadoop.hbase.regionserver.RegionServerAbortedException; -import org.apache.hadoop.hbase.regionserver.RegionServerStoppedException; /** diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index b02b042766..b1cd8bc954 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -20,13 +20,6 @@ package org.apache.hadoop.hbase.regionserver; import static org.apache.hadoop.hbase.HConstants.REPLICATION_SCOPE_LOCAL; import static org.apache.hadoop.hbase.util.CollectionUtils.computeIfAbsent; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.io.Closeables; - import java.io.EOFException; import java.io.FileNotFoundException; import java.io.IOException; @@ -191,6 +184,13 @@ import org.apache.hadoop.util.StringUtils; import org.apache.htrace.Trace; import org.apache.htrace.TraceScope; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.io.Closeables; + @SuppressWarnings("deprecation") @InterfaceAudience.Private public class HRegion implements HeapSize, PropagatingConfigurationObserver, Region { @@ -649,8 +649,8 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi private final NavigableMap replicationScope = new TreeMap<>( Bytes.BYTES_COMPARATOR); - // whether to unassign region if we hit FNFE - private final RegionUnassigner regionUnassigner; + // whether to reassign region if we hit FNFE + private final RegionReassigner regionReassigner; /** * HRegion constructor. This constructor should only be used for testing and * extensions. Instances of HRegion should be instantiated with the @@ -815,9 +815,9 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi boolean unassignForFNFE = conf.getBoolean(HREGION_UNASSIGN_FOR_FNFE, DEFAULT_HREGION_UNASSIGN_FOR_FNFE); if (unassignForFNFE) { - this.regionUnassigner = new RegionUnassigner(rsServices, fs.getRegionInfo()); + this.regionReassigner = new RegionReassigner(rsServices, fs.getRegionInfo()); } else { - this.regionUnassigner = null; + this.regionReassigner = null; } } @@ -5935,8 +5935,8 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi // Try reopening the region since we have lost some storefiles. // See HBASE-17712 for more details. LOG.warn("Store file is lost; close and reopen region", fnfe); - if (regionUnassigner != null) { - regionUnassigner.unassign(); + if (regionReassigner != null) { + regionReassigner.unassign(); } return fnfe; } @@ -7515,7 +7515,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi long deltaAmount = getLongValue(delta); apply = deltaAmount != 0; newCell = reckonIncrement(delta, deltaAmount, currentValue, columnFamily, now, - (Increment)mutation); + mutation); break; case APPEND: mutationType = MutationType.APPEND; diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index 986d6d4863..997cf03c65 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -18,10 +18,6 @@ */ package org.apache.hadoop.hbase.regionserver; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; -import com.google.common.collect.Maps; - import java.io.IOException; import java.io.InterruptedIOException; import java.lang.Thread.UncaughtExceptionHandler; @@ -87,6 +83,7 @@ import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.YouAreDeadException; import org.apache.hadoop.hbase.ZNodeClearer; import org.apache.hadoop.hbase.classification.InterfaceAudience; +import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.ClusterConnection; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionUtils; @@ -214,6 +211,10 @@ import org.apache.zookeeper.data.Stat; import sun.misc.Signal; import sun.misc.SignalHandler; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; + /** * HRegionServer makes a set of HRegions available to clients. It checks in with * the HMaster. There are many HRegionServers in a single HBase deployment. @@ -3744,8 +3745,11 @@ public class HRegionServer extends HasThread implements } @Override - public void unassign(byte[] regionName) throws IOException { - clusterConnection.getAdmin().unassign(regionName, false); + public void reassign(byte[] regionName) throws IOException { + try (final Admin admin = clusterConnection.getAdmin();) { + admin.unassign(regionName, false); + admin.assign(regionName); + } } @Override diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionUnassigner.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionReassigner.java similarity index 77% rename from hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionUnassigner.java rename to hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionReassigner.java index 8eb78a2716..f5c8ef2b51 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionUnassigner.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionReassigner.java @@ -28,9 +28,9 @@ import org.apache.hadoop.hbase.classification.InterfaceAudience; * Used to unssign a region when we hit FNFE. */ @InterfaceAudience.Private -class RegionUnassigner { +class RegionReassigner { - private static final Log LOG = LogFactory.getLog(RegionUnassigner.class); + private static final Log LOG = LogFactory.getLog(RegionReassigner.class); private final RegionServerServices rsServices; @@ -38,7 +38,7 @@ class RegionUnassigner { private boolean unassigning = false; - RegionUnassigner(RegionServerServices rsServices, HRegionInfo regionInfo) { + RegionReassigner(RegionServerServices rsServices, HRegionInfo regionInfo) { this.rsServices = rsServices; this.regionInfo = regionInfo; } @@ -48,16 +48,16 @@ class RegionUnassigner { return; } unassigning = true; - new Thread("RegionUnassigner." + regionInfo.getEncodedName()) { + new Thread("RegionReassigner." + regionInfo.getEncodedName()) { @Override public void run() { - LOG.info("Unassign " + regionInfo.getRegionNameAsString()); + LOG.info("Reaasign " + regionInfo.getRegionNameAsString()); try { - rsServices.unassign(regionInfo.getRegionName()); + rsServices.reassign(regionInfo.getRegionName()); } catch (IOException e) { - LOG.warn("Unassigned " + regionInfo.getRegionNameAsString() + " failed", e); + LOG.warn("Reassigning " + regionInfo.getRegionNameAsString() + " failed", e); } finally { - synchronized (RegionUnassigner.this) { + synchronized (RegionReassigner.this) { unassigning = false; } } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java index 5afa6529ad..5a3fc61a76 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionServerServices.java @@ -34,10 +34,10 @@ import org.apache.hadoop.hbase.classification.InterfaceStability; import org.apache.hadoop.hbase.client.locking.EntityLock; import org.apache.hadoop.hbase.executor.ExecutorService; import org.apache.hadoop.hbase.ipc.RpcServerInterface; -import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode; import org.apache.hadoop.hbase.quotas.RegionServerRpcQuotaManager; import org.apache.hadoop.hbase.quotas.RegionServerSpaceQuotaManager; import org.apache.hadoop.hbase.regionserver.throttle.ThroughputController; +import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode; import org.apache.hadoop.hbase.wal.WAL; import org.apache.zookeeper.KeeperException; @@ -278,5 +278,5 @@ public interface RegionServerServices extends OnlineRegions, FavoredNodesForRegi *

* See HBASE-17712 for more details. */ - void unassign(byte[] regionName) throws IOException; + void reassign(byte[] regionName) throws IOException; } diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java index a99345be75..61da9245d7 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java @@ -349,7 +349,7 @@ public class MockRegionServerServices implements RegionServerServices { } @Override - public void unassign(byte[] regionName) throws IOException { + public void reassign(byte[] regionName) throws IOException { } @Override diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java index 7ac75712b9..4dab763074 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/master/MockRegionServer.java @@ -713,7 +713,7 @@ ClientProtos.ClientService.BlockingInterface, RegionServerServices { } @Override - public void unassign(byte[] regionName) throws IOException { + public void reassign(byte[] regionName) throws IOException { } @Override diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCorruptedRegionStoreFile.java hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCorruptedRegionStoreFile.java index 430aef59da..788e430d13 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCorruptedRegionStoreFile.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCorruptedRegionStoreFile.java @@ -18,6 +18,9 @@ package org.apache.hadoop.hbase.regionserver; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; @@ -30,35 +33,30 @@ import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.client.Scan; -import org.apache.hadoop.hbase.client.Result; -import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Durability; import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.client.ResultScanner; +import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; import org.apache.hadoop.hbase.io.HFileLink; -import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.testclassification.LargeTests; -import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread; +import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.FSUtils; import org.apache.hadoop.hbase.util.FSVisitor; +import org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread; import org.apache.hadoop.hbase.util.TestTableName; - import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - /** * HBASE-13651 Handle StoreFileScanner FileNotFoundException */ -@Ignore + @Category({MasterTests.class, LargeTests.class}) public class TestCorruptedRegionStoreFile { private static final Log LOG = LogFactory.getLog(TestCorruptedRegionStoreFile.class); @@ -180,6 +178,7 @@ public class TestCorruptedRegionStoreFile { assertTrue("expected one file lost: rowCount=" + count + " lostRows=" + (NUM_ROWS - count), count >= (NUM_ROWS - ROW_PER_FILE)); } + private boolean hasFile = true; @Test(timeout=180000) public void testLosingFileAfterScannerInit() throws Exception { @@ -190,7 +189,6 @@ public class TestCorruptedRegionStoreFile { // try to query with the missing file int count = fullScanAndCount(TEST_TABLE.getTableName(), new ScanInjector() { - private boolean hasFile = true; @Override public void beforeScan(Table table, Scan scan) throws Exception {