Skip to content

Commit 6ad73b9

Browse files
committed
HBASE-24885 STUCK RIT by hbck2 assigns (#2283)
Adds region state check on hbck2 assigns/unassigns. Returns pid of -1 if in inappropriate state with logging explaination which suggests passing override if operator wants to assign/unassign anyways. Here is an example of what happens now if hbck2 tries an unassign and Region already unassigned: 2020-08-19 11:22:06,926 INFO [RpcServer.default.FPBQ.Fifo.handler=1,queue=0,port=50086] assignment.AssignmentManager(820): Failed {ENCODED => d1112e553991e938b6852f87774c91ee, NAME => 'TestHbck,zzzzz,1597861310769.d1112e553991e938b6852f87774c91ee.', STARTKEY => 'zzzzz', ENDKEY => ''} unassign, override=false; set override to by-pass state checks. org.apache.hadoop.hbase.client.DoNotRetryRegionException: Unexpected state for state=CLOSED, location=null, table=TestHbck, region=d1112e553991e938b6852f87774c91ee at org.apache.hadoop.hbase.master.assignment.AssignmentManager.preTransitCheck(AssignmentManager.java:583) at org.apache.hadoop.hbase.master.assignment.AssignmentManager.createOneUnassignProcedure(AssignmentManager.java:812) at org.apache.hadoop.hbase.master.MasterRpcServices.unassigns(MasterRpcServices.java:2616) at org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos$HbckService$2.callBlockingMethod(MasterProtos.java) at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:397) at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:133) at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:338) at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:318) Previous it would just create the unassign anyways. Now must pass override to queue the procedure regardless. Safer. hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java javadoc on assigns/unassigns. Minor refactor in assigns/unassigns to cater to case where procedure may come back null (if override not set and fails state checks). hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java checkstyle cleanups. Clarifying javadoc on how there is no state checking when bulk assigns creating/enabling tables. createOneAssignProcedure and createOneUnassignProcedure now handle exceptions which now can be thrown if no override and region state is not appropriate. Aggregation of createAssignProcedure and createUnassignProcedure instances adding in region state check invoked if override is NOT set. hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateNode.java Change to setProcedure so it returns passed proc as result instead of void Signed-off-by: Duo Zhang <zhangduo@apache.org>
1 parent e0c9f91 commit 6ad73b9

4 files changed

Lines changed: 177 additions & 108 deletions

File tree

hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import org.apache.hadoop.hbase.ipc.ServerNotRunningYetException;
7373
import org.apache.hadoop.hbase.ipc.ServerRpcController;
7474
import org.apache.hadoop.hbase.master.assignment.RegionStates;
75+
import org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure;
7576
import org.apache.hadoop.hbase.master.locking.LockProcedure;
7677
import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
7778
import org.apache.hadoop.hbase.master.procedure.MasterProcedureUtil;
@@ -2582,30 +2583,40 @@ private RegionInfo getRegionInfo(HBaseProtos.RegionSpecifier rs) throws UnknownR
25822583
}
25832584

25842585
/**
2585-
* A 'raw' version of assign that does bulk and skirts Master state checks (assigns can be made
2586-
* during Master startup). For use by Hbck2.
2586+
* @throws ServiceException If no MasterProcedureExecutor
25872587
*/
2588-
@Override
2589-
public MasterProtos.AssignsResponse assigns(RpcController controller,
2590-
MasterProtos.AssignsRequest request)
2591-
throws ServiceException {
2588+
private void checkMasterProcedureExecutor() throws ServiceException {
25922589
if (this.master.getMasterProcedureExecutor() == null) {
25932590
throw new ServiceException("Master's ProcedureExecutor not initialized; retry later");
25942591
}
2592+
}
2593+
2594+
/**
2595+
* A 'raw' version of assign that does bulk and can skirt Master state checks if override
2596+
* is set; i.e. assigns can be forced during Master startup or if RegionState is unclean.
2597+
* Used by HBCK2.
2598+
*/
2599+
@Override
2600+
public MasterProtos.AssignsResponse assigns(RpcController controller,
2601+
MasterProtos.AssignsRequest request) throws ServiceException {
2602+
checkMasterProcedureExecutor();
25952603
MasterProtos.AssignsResponse.Builder responseBuilder =
2596-
MasterProtos.AssignsResponse.newBuilder();
2604+
MasterProtos.AssignsResponse.newBuilder();
25972605
try {
25982606
boolean override = request.getOverride();
25992607
LOG.info("{} assigns, override={}", master.getClientIdAuditPrefix(), override);
26002608
for (HBaseProtos.RegionSpecifier rs: request.getRegionList()) {
2609+
long pid = Procedure.NO_PROC_ID;
26012610
RegionInfo ri = getRegionInfo(rs);
26022611
if (ri == null) {
26032612
LOG.info("Unknown={}", rs);
2604-
responseBuilder.addPid(Procedure.NO_PROC_ID);
2605-
continue;
2613+
} else {
2614+
Procedure p = this.master.getAssignmentManager().createOneAssignProcedure(ri, override);
2615+
if (p != null) {
2616+
pid = this.master.getMasterProcedureExecutor().submitProcedure(p);
2617+
}
26062618
}
2607-
responseBuilder.addPid(this.master.getMasterProcedureExecutor().submitProcedure(this.master
2608-
.getAssignmentManager().createOneAssignProcedure(ri, override)));
2619+
responseBuilder.addPid(pid);
26092620
}
26102621
return responseBuilder.build();
26112622
} catch (IOException ioe) {
@@ -2614,30 +2625,31 @@ public MasterProtos.AssignsResponse assigns(RpcController controller,
26142625
}
26152626

26162627
/**
2617-
* A 'raw' version of unassign that does bulk and skirts Master state checks (unassigns can be
2618-
* made during Master startup). For use by Hbck2.
2628+
* A 'raw' version of unassign that does bulk and can skirt Master state checks if override
2629+
* is set; i.e. unassigns can be forced during Master startup or if RegionState is unclean.
2630+
* Used by HBCK2.
26192631
*/
26202632
@Override
26212633
public MasterProtos.UnassignsResponse unassigns(RpcController controller,
2622-
MasterProtos.UnassignsRequest request)
2623-
throws ServiceException {
2624-
if (this.master.getMasterProcedureExecutor() == null) {
2625-
throw new ServiceException("Master's ProcedureExecutor not initialized; retry later");
2626-
}
2634+
MasterProtos.UnassignsRequest request) throws ServiceException {
2635+
checkMasterProcedureExecutor();
26272636
MasterProtos.UnassignsResponse.Builder responseBuilder =
26282637
MasterProtos.UnassignsResponse.newBuilder();
26292638
try {
26302639
boolean override = request.getOverride();
26312640
LOG.info("{} unassigns, override={}", master.getClientIdAuditPrefix(), override);
26322641
for (HBaseProtos.RegionSpecifier rs: request.getRegionList()) {
2642+
long pid = Procedure.NO_PROC_ID;
26332643
RegionInfo ri = getRegionInfo(rs);
26342644
if (ri == null) {
26352645
LOG.info("Unknown={}", rs);
2636-
responseBuilder.addPid(Procedure.NO_PROC_ID);
2637-
continue;
2646+
} else {
2647+
Procedure p = this.master.getAssignmentManager().createOneUnassignProcedure(ri, override);
2648+
if (p != null) {
2649+
pid = this.master.getMasterProcedureExecutor().submitProcedure(p);
2650+
}
26382651
}
2639-
responseBuilder.addPid(this.master.getMasterProcedureExecutor().submitProcedure(this.master
2640-
.getAssignmentManager().createOneUnassignProcedure(ri, override)));
2652+
responseBuilder.addPid(pid);
26412653
}
26422654
return responseBuilder.build();
26432655
} catch (IOException ioe) {

0 commit comments

Comments
 (0)