From commits-return-65798-archive-asf-public=cust-asf.ponee.io@hbase.apache.org Fri Jan 19 16:31:08 2018 Return-Path: X-Original-To: archive-asf-public@eu.ponee.io Delivered-To: archive-asf-public@eu.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by mx-eu-01.ponee.io (Postfix) with ESMTP id B3BC8180799 for ; Fri, 19 Jan 2018 16:31:07 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id A3D51160C27; Fri, 19 Jan 2018 15:31:07 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id A0E97160C28 for ; Fri, 19 Jan 2018 16:31:04 +0100 (CET) Received: (qmail 26367 invoked by uid 500); 19 Jan 2018 15:30:58 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 24863 invoked by uid 99); 19 Jan 2018 15:30:57 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 19 Jan 2018 15:30:57 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 42460F3543; Fri, 19 Jan 2018 15:30:53 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: git-site-role@apache.org To: commits@hbase.apache.org Date: Fri, 19 Jan 2018 15:31:00 -0000 Message-Id: <1711d51c5fd84681882d4fb83fa824ee@git.apache.org> In-Reply-To: <10e595f691db492d91eeeb92178d60e5@git.apache.org> References: <10e595f691db492d91eeeb92178d60e5@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [09/51] [partial] hbase-site git commit: Published site at . http://git-wip-us.apache.org/repos/asf/hbase-site/blob/14db89d7/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html ---------------------------------------------------------------------- diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html index f1db5ca..d8515d7 100644 --- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html +++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.HangThenRSCrashExecutor.html @@ -32,813 +32,820 @@ 024import static org.junit.Assert.fail; 025 026import java.io.IOException; -027import java.net.SocketTimeoutException; -028import java.util.NavigableMap; -029import java.util.Random; -030import java.util.Set; -031import java.util.SortedSet; -032import java.util.concurrent.ConcurrentSkipListMap; -033import java.util.concurrent.ConcurrentSkipListSet; -034import java.util.concurrent.ExecutionException; -035import java.util.concurrent.Executors; -036import java.util.concurrent.Future; -037import java.util.concurrent.ScheduledExecutorService; -038import java.util.concurrent.TimeUnit; -039 -040import org.apache.hadoop.conf.Configuration; -041import org.apache.hadoop.hbase.CategoryBasedTimeout; -042import org.apache.hadoop.hbase.DoNotRetryIOException; -043import org.apache.hadoop.hbase.HBaseTestingUtility; -044import org.apache.hadoop.hbase.NotServingRegionException; -045import org.apache.hadoop.hbase.ServerName; -046import org.apache.hadoop.hbase.TableName; -047import org.apache.hadoop.hbase.client.RegionInfo; -048import org.apache.hadoop.hbase.client.RegionInfoBuilder; -049import org.apache.hadoop.hbase.client.RetriesExhaustedException; -050import org.apache.hadoop.hbase.exceptions.UnexpectedStateException; -051import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException; -052import org.apache.hadoop.hbase.master.MasterServices; -053import org.apache.hadoop.hbase.master.RegionState.State; -054import org.apache.hadoop.hbase.master.procedure.MasterProcedureConstants; -055import org.apache.hadoop.hbase.master.procedure.ProcedureSyncWait; -056import org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher; -057import org.apache.hadoop.hbase.procedure2.Procedure; -058import org.apache.hadoop.hbase.procedure2.ProcedureMetrics; -059import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility; -060import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore; -061import org.apache.hadoop.hbase.procedure2.util.StringUtils; -062import org.apache.hadoop.hbase.regionserver.RegionServerAbortedException; -063import org.apache.hadoop.hbase.regionserver.RegionServerStoppedException; -064import org.apache.hadoop.hbase.testclassification.MasterTests; -065import org.apache.hadoop.hbase.testclassification.MediumTests; -066import org.apache.hadoop.hbase.util.Bytes; -067import org.apache.hadoop.hbase.util.FSUtils; -068import org.apache.hadoop.ipc.RemoteException; -069import org.junit.After; -070import org.junit.Before; -071import org.junit.Ignore; -072import org.junit.Rule; -073import org.junit.Test; -074import org.junit.experimental.categories.Category; -075import org.junit.rules.ExpectedException; -076import org.junit.rules.TestName; -077import org.junit.rules.TestRule; -078import org.slf4j.Logger; -079import org.slf4j.LoggerFactory; -080import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; -081import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionRequest; -082import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse; -083import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest; -084import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse; -085import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest; -086import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest.RegionOpenInfo; -087import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse; -088import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse.RegionOpeningState; -089import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition; -090import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode; -091import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest; -092 -093@Category({MasterTests.class, MediumTests.class}) -094public class TestAssignmentManager { -095 private static final Logger LOG = LoggerFactory.getLogger(TestAssignmentManager.class); -096 -097 @Rule public TestName name = new TestName(); -098 @Rule public final TestRule timeout = -099 CategoryBasedTimeout.builder().withTimeout(this.getClass()). -100 withLookingForStuckThread(true).build(); -101 @Rule public final ExpectedException exception = ExpectedException.none(); -102 -103 private static final int PROC_NTHREADS = 64; -104 private static final int NREGIONS = 1 * 1000; -105 private static final int NSERVERS = Math.max(1, NREGIONS / 100); -106 -107 private HBaseTestingUtility UTIL; -108 private MockRSProcedureDispatcher rsDispatcher; -109 private MockMasterServices master; -110 private AssignmentManager am; -111 private NavigableMap<ServerName, SortedSet<byte []>> regionsToRegionServers = -112 new ConcurrentSkipListMap<ServerName, SortedSet<byte []>>(); -113 // Simple executor to run some simple tasks. -114 private ScheduledExecutorService executor; -115 -116 private ProcedureMetrics assignProcMetrics; -117 private ProcedureMetrics unassignProcMetrics; -118 -119 private long assignSubmittedCount = 0; -120 private long assignFailedCount = 0; -121 private long unassignSubmittedCount = 0; -122 private long unassignFailedCount = 0; -123 -124 private void setupConfiguration(Configuration conf) throws Exception { -125 FSUtils.setRootDir(conf, UTIL.getDataTestDir()); -126 conf.setBoolean(WALProcedureStore.USE_HSYNC_CONF_KEY, false); -127 conf.setInt(WALProcedureStore.SYNC_WAIT_MSEC_CONF_KEY, 10); -128 conf.setInt(MasterProcedureConstants.MASTER_PROCEDURE_THREADS, PROC_NTHREADS); -129 conf.setInt(RSProcedureDispatcher.RS_RPC_STARTUP_WAIT_TIME_CONF_KEY, 1000); -130 conf.setInt(AssignmentManager.ASSIGN_MAX_ATTEMPTS, 100); // Have many so we succeed eventually. -131 } -132 -133 @Before -134 public void setUp() throws Exception { -135 UTIL = new HBaseTestingUtility(); -136 this.executor = Executors.newSingleThreadScheduledExecutor(); -137 setupConfiguration(UTIL.getConfiguration()); -138 master = new MockMasterServices(UTIL.getConfiguration(), this.regionsToRegionServers); -139 rsDispatcher = new MockRSProcedureDispatcher(master); -140 master.start(NSERVERS, rsDispatcher); -141 am = master.getAssignmentManager(); -142 assignProcMetrics = am.getAssignmentManagerMetrics().getAssignProcMetrics(); -143 unassignProcMetrics = am.getAssignmentManagerMetrics().getUnassignProcMetrics(); -144 setUpMeta(); -145 } -146 -147 private void setUpMeta() throws Exception { -148 rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); -149 am.assign(RegionInfoBuilder.FIRST_META_REGIONINFO); -150 am.wakeMetaLoadedEvent(); -151 am.setFailoverCleanupDone(true); -152 } -153 -154 @After -155 public void tearDown() throws Exception { -156 master.stop("tearDown"); -157 this.executor.shutdownNow(); -158 } -159 -160 @Test (expected=NullPointerException.class) -161 public void testWaitServerReportEventWithNullServer() throws UnexpectedStateException { -162 // Test what happens if we pass in null server. I'd expect it throws NPE. -163 if (this.am.waitServerReportEvent(null, null)) throw new UnexpectedStateException(); -164 } -165 -166 @Test -167 public void testAssignWithGoodExec() throws Exception { -168 // collect AM metrics before test -169 collectAssignmentManagerMetrics(); -170 -171 testAssign(new GoodRsExecutor()); -172 -173 assertEquals(assignSubmittedCount + NREGIONS, -174 assignProcMetrics.getSubmittedCounter().getCount()); -175 assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); -176 } -177 -178 @Test -179 public void testAssignAndCrashBeforeResponse() throws Exception { -180 final TableName tableName = TableName.valueOf("testAssignAndCrashBeforeResponse"); -181 final RegionInfo hri = createRegionInfo(tableName, 1); -182 rsDispatcher.setMockRsExecutor(new HangThenRSCrashExecutor()); -183 AssignProcedure proc = am.createAssignProcedure(hri); -184 waitOnFuture(submitProcedure(proc)); -185 } -186 -187 @Test -188 public void testUnassignAndCrashBeforeResponse() throws Exception { -189 final TableName tableName = TableName.valueOf("testAssignAndCrashBeforeResponse"); -190 final RegionInfo hri = createRegionInfo(tableName, 1); -191 rsDispatcher.setMockRsExecutor(new HangOnCloseThenRSCrashExecutor()); -192 for (int i = 0; i < HangOnCloseThenRSCrashExecutor.TYPES_OF_FAILURE; i++) { -193 AssignProcedure assign = am.createAssignProcedure(hri); -194 waitOnFuture(submitProcedure(assign)); -195 UnassignProcedure unassign = am.createUnassignProcedure(hri, -196 am.getRegionStates().getRegionServerOfRegion(hri), false); -197 waitOnFuture(submitProcedure(unassign)); -198 } -199 } -200 -201 @Test -202 public void testAssignWithRandExec() throws Exception { -203 final TableName tableName = TableName.valueOf("testAssignWithRandExec"); -204 final RegionInfo hri = createRegionInfo(tableName, 1); -205 -206 rsDispatcher.setMockRsExecutor(new RandRsExecutor()); -207 // Loop a bunch of times so we hit various combos of exceptions. -208 for (int i = 0; i < 10; i++) { -209 LOG.info("" + i); -210 AssignProcedure proc = am.createAssignProcedure(hri); -211 waitOnFuture(submitProcedure(proc)); -212 } -213 } -214 -215 @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient. -216 public void testSocketTimeout() throws Exception { -217 final TableName tableName = TableName.valueOf(this.name.getMethodName()); -218 final RegionInfo hri = createRegionInfo(tableName, 1); -219 -220 // collect AM metrics before test -221 collectAssignmentManagerMetrics(); -222 -223 rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3)); -224 waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); -225 -226 rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1)); -227 // exception.expect(ServerCrashException.class); -228 waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false))); -229 -230 assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount()); -231 assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); -232 assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount()); -233 assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount()); -234 } -235 -236 @Test -237 public void testServerNotYetRunning() throws Exception { -238 testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()), -239 new ServerNotYetRunningRsExecutor()); -240 } -241 -242 private void testRetriesExhaustedFailure(final TableName tableName, -243 final MockRSExecutor executor) throws Exception { -244 final RegionInfo hri = createRegionInfo(tableName, 1); -245 -246 // collect AM metrics before test -247 collectAssignmentManagerMetrics(); -248 -249 // Test Assign operation failure -250 rsDispatcher.setMockRsExecutor(executor); -251 try { -252 waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); -253 fail("unexpected assign completion"); -254 } catch (RetriesExhaustedException e) { -255 // expected exception -256 LOG.info("expected exception from assign operation: " + e.getMessage(), e); -257 } -258 -259 // Assign the region (without problems) -260 rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); -261 waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); -262 -263 // TODO: Currently unassign just keeps trying until it sees a server crash. -264 // There is no count on unassign. -265 /* -266 // Test Unassign operation failure -267 rsDispatcher.setMockRsExecutor(executor); -268 waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false))); -269 -270 assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount()); -271 assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount()); -272 assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount()); -273 -274 // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign -275 // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it! -276 assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount()); -277 */ -278 } -279 +027import java.io.InterruptedIOException; +028import java.net.SocketTimeoutException; +029import java.util.NavigableMap; +030import java.util.Random; +031import java.util.Set; +032import java.util.SortedSet; +033import java.util.concurrent.ConcurrentSkipListMap; +034import java.util.concurrent.ConcurrentSkipListSet; +035import java.util.concurrent.ExecutionException; +036import java.util.concurrent.Executors; +037import java.util.concurrent.Future; +038import java.util.concurrent.ScheduledExecutorService; +039import java.util.concurrent.TimeUnit; +040 +041import org.apache.hadoop.conf.Configuration; +042import org.apache.hadoop.hbase.CategoryBasedTimeout; +043import org.apache.hadoop.hbase.DoNotRetryIOException; +044import org.apache.hadoop.hbase.HBaseTestingUtility; +045import org.apache.hadoop.hbase.NotServingRegionException; +046import org.apache.hadoop.hbase.ServerName; +047import org.apache.hadoop.hbase.TableName; +048import org.apache.hadoop.hbase.client.RegionInfo; +049import org.apache.hadoop.hbase.client.RegionInfoBuilder; +050import org.apache.hadoop.hbase.client.RetriesExhaustedException; +051import org.apache.hadoop.hbase.exceptions.UnexpectedStateException; +052import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException; +053import org.apache.hadoop.hbase.master.MasterServices; +054import org.apache.hadoop.hbase.master.RegionState.State; +055import org.apache.hadoop.hbase.master.procedure.MasterProcedureConstants; +056import org.apache.hadoop.hbase.master.procedure.ProcedureSyncWait; +057import org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher; +058import org.apache.hadoop.hbase.procedure2.Procedure; +059import org.apache.hadoop.hbase.procedure2.ProcedureMetrics; +060import org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility; +061import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore; +062import org.apache.hadoop.hbase.procedure2.util.StringUtils; +063import org.apache.hadoop.hbase.regionserver.RegionServerAbortedException; +064import org.apache.hadoop.hbase.regionserver.RegionServerStoppedException; +065import org.apache.hadoop.hbase.testclassification.MasterTests; +066import org.apache.hadoop.hbase.testclassification.MediumTests; +067import org.apache.hadoop.hbase.util.Bytes; +068import org.apache.hadoop.hbase.util.FSUtils; +069import org.apache.hadoop.ipc.RemoteException; +070import org.junit.After; +071import org.junit.Before; +072import org.junit.Ignore; +073import org.junit.Rule; +074import org.junit.Test; +075import org.junit.experimental.categories.Category; +076import org.junit.rules.ExpectedException; +077import org.junit.rules.TestName; +078import org.junit.rules.TestRule; +079import org.slf4j.Logger; +080import org.slf4j.LoggerFactory; +081import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; +082import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionRequest; +083import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.CloseRegionResponse; +084import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresRequest; +085import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.ExecuteProceduresResponse; +086import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest; +087import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionRequest.RegionOpenInfo; +088import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse; +089import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.OpenRegionResponse.RegionOpeningState; +090import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition; +091import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.RegionStateTransition.TransitionCode; +092import org.apache.hadoop.hbase.shaded.protobuf.generated.RegionServerStatusProtos.ReportRegionStateTransitionRequest; +093 +094@Category({MasterTests.class, MediumTests.class}) +095public class TestAssignmentManager { +096 private static final Logger LOG = LoggerFactory.getLogger(TestAssignmentManager.class); +097 +098 @Rule public TestName name = new TestName(); +099 @Rule public final TestRule timeout = +100 CategoryBasedTimeout.builder().withTimeout(this.getClass()). +101 withLookingForStuckThread(true).build(); +102 @Rule public final ExpectedException exception = ExpectedException.none(); +103 +104 private static final int PROC_NTHREADS = 64; +105 private static final int NREGIONS = 1 * 1000; +106 private static final int NSERVERS = Math.max(1, NREGIONS / 100); +107 +108 private HBaseTestingUtility UTIL; +109 private MockRSProcedureDispatcher rsDispatcher; +110 private MockMasterServices master; +111 private AssignmentManager am; +112 private NavigableMap<ServerName, SortedSet<byte []>> regionsToRegionServers = +113 new ConcurrentSkipListMap<ServerName, SortedSet<byte []>>(); +114 // Simple executor to run some simple tasks. +115 private ScheduledExecutorService executor; +116 +117 private ProcedureMetrics assignProcMetrics; +118 private ProcedureMetrics unassignProcMetrics; +119 +120 private long assignSubmittedCount = 0; +121 private long assignFailedCount = 0; +122 private long unassignSubmittedCount = 0; +123 private long unassignFailedCount = 0; +124 +125 private void setupConfiguration(Configuration conf) throws Exception { +126 FSUtils.setRootDir(conf, UTIL.getDataTestDir()); +127 conf.setBoolean(WALProcedureStore.USE_HSYNC_CONF_KEY, false); +128 conf.setInt(WALProcedureStore.SYNC_WAIT_MSEC_CONF_KEY, 10); +129 conf.setInt(MasterProcedureConstants.MASTER_PROCEDURE_THREADS, PROC_NTHREADS); +130 conf.setInt(RSProcedureDispatcher.RS_RPC_STARTUP_WAIT_TIME_CONF_KEY, 1000); +131 conf.setInt(AssignmentManager.ASSIGN_MAX_ATTEMPTS, 100); // Have many so we succeed eventually. +132 } +133 +134 @Before +135 public void setUp() throws Exception { +136 UTIL = new HBaseTestingUtility(); +137 this.executor = Executors.newSingleThreadScheduledExecutor(); +138 setupConfiguration(UTIL.getConfiguration()); +139 master = new MockMasterServices(UTIL.getConfiguration(), this.regionsToRegionServers); +140 rsDispatcher = new MockRSProcedureDispatcher(master); +141 master.start(NSERVERS, rsDispatcher); +142 am = master.getAssignmentManager(); +143 assignProcMetrics = am.getAssignmentManagerMetrics().getAssignProcMetrics(); +144 unassignProcMetrics = am.getAssignmentManagerMetrics().getUnassignProcMetrics(); +145 setUpMeta(); +146 } +147 +148 private void setUpMeta() throws Exception { +149 rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); +150 am.assign(RegionInfoBuilder.FIRST_META_REGIONINFO); +151 am.wakeMetaLoadedEvent(); +152 am.setFailoverCleanupDone(true); +153 } +154 +155 @After +156 public void tearDown() throws Exception { +157 master.stop("tearDown"); +158 this.executor.shutdownNow(); +159 } +160 +161 @Test (expected=NullPointerException.class) +162 public void testWaitServerReportEventWithNullServer() throws UnexpectedStateException { +163 // Test what happens if we pass in null server. I'd expect it throws NPE. +164 if (this.am.waitServerReportEvent(null, null)) throw new UnexpectedStateException(); +165 } +166 +167 @Test +168 public void testAssignWithGoodExec() throws Exception { +169 // collect AM metrics before test +170 collectAssignmentManagerMetrics(); +171 +172 testAssign(new GoodRsExecutor()); +173 +174 assertEquals(assignSubmittedCount + NREGIONS, +175 assignProcMetrics.getSubmittedCounter().getCount()); +176 assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); +177 } +178 +179 @Test +180 public void testAssignAndCrashBeforeResponse() throws Exception { +181 final TableName tableName = TableName.valueOf("testAssignAndCrashBeforeResponse"); +182 final RegionInfo hri = createRegionInfo(tableName, 1); +183 rsDispatcher.setMockRsExecutor(new HangThenRSCrashExecutor()); +184 AssignProcedure proc = am.createAssignProcedure(hri); +185 waitOnFuture(submitProcedure(proc)); +186 } +187 +188 @Test +189 public void testUnassignAndCrashBeforeResponse() throws Exception { +190 final TableName tableName = TableName.valueOf("testAssignAndCrashBeforeResponse"); +191 final RegionInfo hri = createRegionInfo(tableName, 1); +192 rsDispatcher.setMockRsExecutor(new HangOnCloseThenRSCrashExecutor()); +193 for (int i = 0; i < HangOnCloseThenRSCrashExecutor.TYPES_OF_FAILURE; i++) { +194 AssignProcedure assign = am.createAssignProcedure(hri); +195 waitOnFuture(submitProcedure(assign)); +196 UnassignProcedure unassign = am.createUnassignProcedure(hri, +197 am.getRegionStates().getRegionServerOfRegion(hri), false); +198 waitOnFuture(submitProcedure(unassign)); +199 } +200 } +201 +202 @Test +203 public void testAssignWithRandExec() throws Exception { +204 final TableName tableName = TableName.valueOf("testAssignWithRandExec"); +205 final RegionInfo hri = createRegionInfo(tableName, 1); +206 +207 rsDispatcher.setMockRsExecutor(new RandRsExecutor()); +208 // Loop a bunch of times so we hit various combos of exceptions. +209 for (int i = 0; i < 10; i++) { +210 LOG.info("ROUND=" + i); +211 AssignProcedure proc = am.createAssignProcedure(hri); +212 waitOnFuture(submitProcedure(proc)); +213 } +214 } +215 +216 @Ignore @Test // Disabled for now. Since HBASE-18551, this mock is insufficient. +217 public void testSocketTimeout() throws Exception { +218 final TableName tableName = TableName.valueOf(this.name.getMethodName()); +219 final RegionInfo hri = createRegionInfo(tableName, 1); +220 +221 // collect AM metrics before test +222 collectAssignmentManagerMetrics(); +223 +224 rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 3)); +225 waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); +226 +227 rsDispatcher.setMockRsExecutor(new SocketTimeoutRsExecutor(20, 1)); +228 // exception.expect(ServerCrashException.class); +229 waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false))); +230 +231 assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount()); +232 assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); +233 assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount()); +234 assertEquals(unassignFailedCount + 1, unassignProcMetrics.getFailedCounter().getCount()); +235 } +236 +237 @Test +238 public void testServerNotYetRunning() throws Exception { +239 testRetriesExhaustedFailure(TableName.valueOf(this.name.getMethodName()), +240 new ServerNotYetRunningRsExecutor()); +241 } +242 +243 private void testRetriesExhaustedFailure(final TableName tableName, +244 final MockRSExecutor executor) throws Exception { +245 final RegionInfo hri = createRegionInfo(tableName, 1); +246 +247 // collect AM metrics before test +248 collectAssignmentManagerMetrics(); +249 +250 // Test Assign operation failure +251 rsDispatcher.setMockRsExecutor(executor); +252 try { +253 waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); +254 fail("unexpected assign completion"); +255 } catch (RetriesExhaustedException e) { +256 // expected exception +257 LOG.info("expected exception from assign operation: " + e.getMessage(), e); +258 } +259 +260 // Assign the region (without problems) +261 rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); +262 waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); +263 +264 // TODO: Currently unassign just keeps trying until it sees a server crash. +265 // There is no count on unassign. +266 /* +267 // Test Unassign operation failure +268 rsDispatcher.setMockRsExecutor(executor); +269 waitOnFuture(submitProcedure(am.createUnassignProcedure(hri, null, false))); +270 +271 assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount()); +272 assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount()); +273 assertEquals(unassignSubmittedCount + 1, unassignProcMetrics.getSubmittedCounter().getCount()); +274 +275 // TODO: We supposed to have 1 failed assign, 1 successful assign and a failed unassign +276 // operation. But ProcV2 framework marks aborted unassign operation as success. Fix it! +277 assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount()); +278 */ +279 } 280 -281 @Test -282 public void testIOExceptionOnAssignment() throws Exception { -283 // collect AM metrics before test -284 collectAssignmentManagerMetrics(); -285 -286 testFailedOpen(TableName.valueOf("testExceptionOnAssignment"), -287 new FaultyRsExecutor(new IOException("test fault"))); -288 -289 assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount()); -290 assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount()); -291 } -292 -293 @Test -294 public void testDoNotRetryExceptionOnAssignment() throws Exception { -295 // collect AM metrics before test -296 collectAssignmentManagerMetrics(); -297 -298 testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"), -299 new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault"))); -300 -301 assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount()); -302 assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount()); -303 } -304 -305 private void testFailedOpen(final TableName tableName, -306 final MockRSExecutor executor) throws Exception { -307 final RegionInfo hri = createRegionInfo(tableName, 1); -308 -309 // Test Assign operation failure -310 rsDispatcher.setMockRsExecutor(executor); -311 try { -312 waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); -313 fail("unexpected assign completion"); -314 } catch (RetriesExhaustedException e) { -315 // expected exception -316 LOG.info("REGION STATE " + am.getRegionStates().getRegionStateNode(hri)); -317 LOG.info("expected exception from assign operation: " + e.getMessage(), e); -318 assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen()); -319 } -320 } -321 -322 private void testAssign(final MockRSExecutor executor) throws Exception { -323 testAssign(executor, NREGIONS); -324 } -325 -326 private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception { -327 rsDispatcher.setMockRsExecutor(executor); -328 -329 AssignProcedure[] assignments = new AssignProcedure[nregions]; -330 -331 long st = System.currentTimeMillis(); -332 bulkSubmit(assignments); -333 -334 for (int i = 0; i < assignments.length; ++i) { -335 ProcedureTestingUtility.waitProcedure( -336 master.getMasterProcedureExecutor(), assignments[i]); -337 assertTrue(assignments[i].toString(), assignments[i].isSuccess()); -338 } -339 long et = System.currentTimeMillis(); -340 float sec = ((et - st) / 1000.0f); -341 LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)", -342 assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec)); -343 } -344 -345 @Test -346 public void testAssignAnAssignedRegion() throws Exception { -347 final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion"); -348 final RegionInfo hri = createRegionInfo(tableName, 1); -349 -350 // collect AM metrics before test -351 collectAssignmentManagerMetrics(); -352 -353 rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); -354 -355 final Future<byte[]> futureA = submitProcedure(am.createAssignProcedure(hri)); -356 -357 // wait first assign -358 waitOnFuture(futureA); -359 am.getRegionStates().isRegionInState(hri, State.OPEN); -360 // Second should be a noop. We should recognize region is already OPEN internally -361 // and skip out doing nothing. -362 // wait second assign -363 final Future<byte[]> futureB = submitProcedure(am.createAssignProcedure(hri)); -364 waitOnFuture(futureB); -365 am.getRegionStates().isRegionInState(hri, State.OPEN); -366 // TODO: What else can we do to ensure just a noop. -367 -368 // TODO: Though second assign is noop, it's considered success, can noop be handled in a -369 // better way? -370 assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount()); -371 assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); -372 -373 } -374 -375 @Test -376 public void testUnassignAnUnassignedRegion() throws Exception { -377 final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion"); -378 final RegionInfo hri = createRegionInfo(tableName, 1); -379 -380 // collect AM metrics before test -381 collectAssignmentManagerMetrics(); -382 -383 rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); -384 -385 // assign the region first -386 waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); -387 -388 final Future<byte[]> futureA = submitProcedure(am.createUnassignProcedure(hri, null, false)); -389 -390 // Wait first unassign. -391 waitOnFuture(futureA); -392 am.getRegionStates().isRegionInState(hri, State.CLOSED); -393 // Second should be a noop. We should recognize region is already CLOSED internally -394 // and skip out doing nothing. -395 final Future<byte[]> futureB = -396 submitProcedure(am.createUnassignProcedure(hri, -397 ServerName.valueOf("example.org,1234,1"), false)); -398 waitOnFuture(futureB); -399 // Ensure we are still CLOSED. -400 am.getRegionStates().isRegionInState(hri, State.CLOSED); -401 // TODO: What else can we do to ensure just a noop. -402 -403 assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount()); -404 assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); -405 // TODO: Though second unassign is noop, it's considered success, can noop be handled in a -406 // better way? -407 assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount()); -408 assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount()); -409 } -410 -411 /** -412 * It is possible that when AM send assign meta request to a RS successfully, -413 * but RS can not send back any response, which cause master startup hangs forever -414 */ -415 @Test -416 public void testAssignMetaAndCrashBeforeResponse() throws Exception { -417 tearDown(); -418 // See setUp(), start HBase until set up meta -419 UTIL = new HBaseTestingUtility(); -420 this.executor = Executors.newSingleThreadScheduledExecutor(); -421 setupConfiguration(UTIL.getConfiguration()); -422 master = new MockMasterServices(UTIL.getConfiguration(), this.regionsToRegionServers); -423 rsDispatcher = new MockRSProcedureDispatcher(master); -424 master.start(NSERVERS, rsDispatcher); -425 am = master.getAssignmentManager(); -426 -427 // Assign meta -428 master.setServerCrashProcessingEnabled(false); -429 rsDispatcher.setMockRsExecutor(new HangThenRSRestartExecutor()); -430 am.assign(RegionInfoBuilder.FIRST_META_REGIONINFO); -431 assertEquals(true, am.isMetaInitialized()); -432 -433 // set it back as default, see setUpMeta() -434 master.setServerCrashProcessingEnabled(true); -435 am.wakeMetaLoadedEvent(); -436 am.setFailoverCleanupDone(true); -437 } -438 -439 private Future<byte[]> submitProcedure(final Procedure proc) { -440 return ProcedureSyncWait.submitProcedure(master.getMasterProcedureExecutor(), proc); -441 } -442 -443 private byte[] waitOnFuture(final Future<byte[]> future) throws Exception { -444 try { -445 return future.get(5, TimeUnit.SECONDS); -446 } catch (ExecutionException e) { -447 LOG.info("ExecutionException", e); -448 throw (Exception)e.getCause(); -449 } -450 } -451 -452 // ============================================================================================ -453 // Helpers -454 // ============================================================================================ -455 private void bulkSubmit(final AssignProcedure[] procs) throws Exception { -456 final Thread[] threads = new Thread[PROC_NTHREADS]; -457 for (int i = 0; i < threads.length; ++i) { -458 final int threadId = i; -459 threads[i] = new Thread() { -460 @Override -461 public void run() { -462 TableName tableName = TableName.valueOf("table-" + threadId); -463 int n = (procs.length / threads.length); -464 int start = threadId * n; -465 int stop = start + n; -466 for (int j = start; j < stop; ++j) { -467 procs[j] = createAndSubmitAssign(tableName, j); -468 } -469 } -470 }; -471 threads[i].start(); -472 } -473 for (int i = 0; i < threads.length; ++i) { -474 threads[i].join(); -475 } -476 for (int i = procs.length - 1; i >= 0 && procs[i] == null; --i) { -477 procs[i] = createAndSubmitAssign(TableName.valueOf("table-sync"), i); -478 } -479 } -480 -481 private AssignProcedure createAndSubmitAssign(TableName tableName, int regionId) { -482 RegionInfo hri = createRegionInfo(tableName, regionId); -483 AssignProcedure proc = am.createAssignProcedure(hri); -484 master.getMasterProcedureExecutor().submitProcedure(proc); -485 return proc; +281 +282 @Test +283 public void testIOExceptionOnAssignment() throws Exception { +284 // collect AM metrics before test +285 collectAssignmentManagerMetrics(); +286 +287 testFailedOpen(TableName.valueOf("testExceptionOnAssignment"), +288 new FaultyRsExecutor(new IOException("test fault"))); +289 +290 assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount()); +291 assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount()); +292 } +293 +294 @Test +295 public void testDoNotRetryExceptionOnAssignment() throws Exception { +296 // collect AM metrics before test +297 collectAssignmentManagerMetrics(); +298 +299 testFailedOpen(TableName.valueOf("testDoNotRetryExceptionOnAssignment"), +300 new FaultyRsExecutor(new DoNotRetryIOException("test do not retry fault"))); +301 +302 assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount()); +303 assertEquals(assignFailedCount + 1, assignProcMetrics.getFailedCounter().getCount()); +304 } +305 +306 private void testFailedOpen(final TableName tableName, +307 final MockRSExecutor executor) throws Exception { +308 final RegionInfo hri = createRegionInfo(tableName, 1); +309 +310 // Test Assign operation failure +311 rsDispatcher.setMockRsExecutor(executor); +312 try { +313 waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); +314 fail("unexpected assign completion"); +315 } catch (RetriesExhaustedException e) { +316 // expected exception +317 LOG.info("REGION STATE " + am.getRegionStates().getRegionStateNode(hri)); +318 LOG.info("expected exception from assign operation: " + e.getMessage(), e); +319 assertEquals(true, am.getRegionStates().getRegionState(hri).isFailedOpen()); +320 } +321 } +322 +323 private void testAssign(final MockRSExecutor executor) throws Exception { +324 testAssign(executor, NREGIONS); +325 } +326 +327 private void testAssign(final MockRSExecutor executor, final int nregions) throws Exception { +328 rsDispatcher.setMockRsExecutor(executor); +329 +330 AssignProcedure[] assignments = new AssignProcedure[nregions]; +331 +332 long st = System.currentTimeMillis(); +333 bulkSubmit(assignments); +334 +335 for (int i = 0; i < assignments.length; ++i) { +336 ProcedureTestingUtility.waitProcedure( +337 master.getMasterProcedureExecutor(), assignments[i]); +338 assertTrue(assignments[i].toString(), assignments[i].isSuccess()); +339 } +340 long et = System.currentTimeMillis(); +341 float sec = ((et - st) / 1000.0f); +342 LOG.info(String.format("[T] Assigning %dprocs in %s (%.2fproc/sec)", +343 assignments.length, StringUtils.humanTimeDiff(et - st), assignments.length / sec)); +344 } +345 +346 @Test +347 public void testAssignAnAssignedRegion() throws Exception { +348 final TableName tableName = TableName.valueOf("testAssignAnAssignedRegion"); +349 final RegionInfo hri = createRegionInfo(tableName, 1); +350 +351 // collect AM metrics before test +352 collectAssignmentManagerMetrics(); +353 +354 rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); +355 +356 final Future<byte[]> futureA = submitProcedure(am.createAssignProcedure(hri)); +357 +358 // wait first assign +359 waitOnFuture(futureA); +360 am.getRegionStates().isRegionInState(hri, State.OPEN); +361 // Second should be a noop. We should recognize region is already OPEN internally +362 // and skip out doing nothing. +363 // wait second assign +364 final Future<byte[]> futureB = submitProcedure(am.createAssignProcedure(hri)); +365 waitOnFuture(futureB); +366 am.getRegionStates().isRegionInState(hri, State.OPEN); +367 // TODO: What else can we do to ensure just a noop. +368 +369 // TODO: Though second assign is noop, it's considered success, can noop be handled in a +370 // better way? +371 assertEquals(assignSubmittedCount + 2, assignProcMetrics.getSubmittedCounter().getCount()); +372 assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); +373 +374 } +375 +376 @Test +377 public void testUnassignAnUnassignedRegion() throws Exception { +378 final TableName tableName = TableName.valueOf("testUnassignAnUnassignedRegion"); +379 final RegionInfo hri = createRegionInfo(tableName, 1); +380 +381 // collect AM metrics before test +382 collectAssignmentManagerMetrics(); +383 +384 rsDispatcher.setMockRsExecutor(new GoodRsExecutor()); +385 +386 // assign the region first +387 waitOnFuture(submitProcedure(am.createAssignProcedure(hri))); +388 +389 final Future<byte[]> futureA = submitProcedure(am.createUnassignProcedure(hri, null, false)); +390 +391 // Wait first unassign. +392 waitOnFuture(futureA); +393 am.getRegionStates().isRegionInState(hri, State.CLOSED); +394 // Second should be a noop. We should recognize region is already CLOSED internally +395 // and skip out doing nothing. +396 final Future<byte[]> futureB = +397 submitProcedure(am.createUnassignProcedure(hri, +398 ServerName.valueOf("example.org,1234,1"), false)); +399 waitOnFuture(futureB); +400 // Ensure we are still CLOSED. +401 am.getRegionStates().isRegionInState(hri, State.CLOSED); +402 // TODO: What else can we do to ensure just a noop. +403 +404 assertEquals(assignSubmittedCount + 1, assignProcMetrics.getSubmittedCounter().getCount()); +405 assertEquals(assignFailedCount, assignProcMetrics.getFailedCounter().getCount()); +406 // TODO: Though second unassign is noop, it's considered success, can noop be handled in a +407 // better way? +408 assertEquals(unassignSubmittedCount + 2, unassignProcMetrics.getSubmittedCounter().getCount()); +409 assertEquals(unassignFailedCount, unassignProcMetrics.getFailedCounter().getCount()); +410 } +411