HBASE-25835 Ignore duplicate split requests from regionserver reports (#3218)
Processing of the RS report happens asynchronously from other activities which can mutate region state. For example, a split procedure may already be running. A split procedure cannot succeed if the parent region is no longer open, so we can ignore it in that case. Note that submitting more than one split procedure for a given region is harmless -- the split is fenced in the procedure handling -- but it would be noisy in the logs. Only one procedure can succeed. The other procedure(s) would abort during initialization and report failure with WARN level logging. Signed-off-by: Bharath Vissapragada <bharathv@apache.org> Signed-off-by: Viraj Jasani <vjasani@apache.org> Signed-off-by: Pankaj <pankajkumar@apache.org>
This commit is contained in:
parent
fd3e28364c
commit
0fc6852f6a
|
@ -1119,7 +1119,23 @@ public class AssignmentManager {
|
||||||
LOG.debug("Split request from " + serverName +
|
LOG.debug("Split request from " + serverName +
|
||||||
", parent=" + parent + " splitKey=" + Bytes.toStringBinary(splitKey));
|
", parent=" + parent + " splitKey=" + Bytes.toStringBinary(splitKey));
|
||||||
}
|
}
|
||||||
master.getMasterProcedureExecutor().submitProcedure(createSplitProcedure(parent, splitKey));
|
// Processing this report happens asynchronously from other activities which can mutate
|
||||||
|
// the region state. For example, a split procedure may already be running for this parent.
|
||||||
|
// A split procedure cannot succeed if the parent region is no longer open, so we can
|
||||||
|
// ignore it in that case.
|
||||||
|
// Note that submitting more than one split procedure for a given region is
|
||||||
|
// harmless -- the split is fenced in the procedure handling -- but it would be noisy in
|
||||||
|
// the logs. Only one procedure can succeed. The other procedure(s) would abort during
|
||||||
|
// initialization and report failure with WARN level logging.
|
||||||
|
RegionState parentState = regionStates.getRegionState(parent);
|
||||||
|
if (parentState != null && parentState.isOpened()) {
|
||||||
|
master.getMasterProcedureExecutor().submitProcedure(createSplitProcedure(parent,
|
||||||
|
splitKey));
|
||||||
|
} else {
|
||||||
|
LOG.info("Ignoring split request from " + serverName +
|
||||||
|
", parent=" + parent + " because parent is unknown or not open");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// If the RS is < 2.0 throw an exception to abort the operation, we are handling the split
|
// If the RS is < 2.0 throw an exception to abort the operation, we are handling the split
|
||||||
if (master.getServerManager().getVersionNumber(serverName) < 0x0200000) {
|
if (master.getServerManager().getVersionNumber(serverName) < 0x0200000) {
|
||||||
|
|
Loading…
Reference in New Issue