From a7d7dead6fa0aa07725743b7d5c6fdbd0e4fa603 Mon Sep 17 00:00:00 2001 From: Michael Stack Date: Mon, 1 Oct 2018 12:12:38 -0700 Subject: [PATCH] HBASE-21270 [amv2] Let go of Procedure entity lock on CODE-BUG or UnsupportedOperationException --- .../hadoop/hbase/procedure2/ProcedureExecutor.java | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java index cb191aa5d4..ae9756746e 100644 --- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java +++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java @@ -1491,9 +1491,18 @@ public class ProcedureExecutor { LockState lockState = acquireLock(proc); switch (lockState) { case LOCK_ACQUIRED: - execProcedure(procStack, proc); + try { + execProcedure(procStack, proc); + } catch (Throwable t) { + // Here we presume unrecoverable error... release the lock. + // Release lock before rethrowing. + LOG.info("Releasing lock {} because of ", proc, t.getMessage()); + releaseLock(proc, true); + throw t; + } break; case LOCK_YIELD_WAIT: + // Yield with lock held. LOG.info(lockState + " " + proc); scheduler.yield(proc); break; @@ -1502,7 +1511,9 @@ public class ProcedureExecutor { LOG.debug(lockState + " " + proc); break; default: - throw new UnsupportedOperationException(); + // Release lock before throwing exception. + releaseLock(proc, true); + throw new UnsupportedOperationException(proc.toString()); } procStack.release(proc); @@ -1577,8 +1588,11 @@ public class ProcedureExecutor { return lockState; } - lockState = executeRollback(proc); - releaseLock(proc, false); + try { + lockState = executeRollback(proc); + } finally { + releaseLock(proc, false); + } boolean abortRollback = lockState != LockState.LOCK_ACQUIRED; abortRollback |= !isRunning() || !store.isRunning(); -- 2.16.3