diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/procedure/ProcedureMember.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/procedure/ProcedureMember.java index 5ef118e1a00..0559e12e5a3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/procedure/ProcedureMember.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/procedure/ProcedureMember.java @@ -246,7 +246,8 @@ public class ProcedureMember implements Closeable { ", ignoring it.", ee); return; // Procedure has already completed } - LOG.error("Propagating foreign exception to subprocedure " + sub.getName(), ee); - sub.monitor.receive(ee); + String msg = "Propagating foreign exception to subprocedure " + sub.getName(); + LOG.error(msg, ee); + sub.cancel(msg, ee); } -} \ No newline at end of file +} diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/procedure/Subprocedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/procedure/Subprocedure.java index 1c03f3d95dd..ee3d1342f03 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/procedure/Subprocedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/procedure/Subprocedure.java @@ -265,6 +265,7 @@ abstract public class Subprocedure implements Callable { */ public void cancel(String msg, Throwable cause) { LOG.error(msg, cause); + complete = true; if (cause instanceof ForeignException) { monitor.receive((ForeignException) cause); } else { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/procedure/TestZKProcedure.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/procedure/TestZKProcedure.java index cd43375c969..2c13181f01e 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/procedure/TestZKProcedure.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/procedure/TestZKProcedure.java @@ -231,7 +231,7 @@ public class TestZKProcedure { final int[] elem = new int[1]; for (int i = 0; i < members.size(); i++) { ForeignExceptionDispatcher cohortMonitor = new ForeignExceptionDispatcher(); - ProcedureMember comms = members.get(i).getFirst(); + final ProcedureMember comms = members.get(i).getFirst(); Subprocedure commit = Mockito .spy(new SubprocedureImpl(comms, opName, cohortMonitor, WAKE_FREQUENCY, TIMEOUT)); // This nasty bit has one of the impls throw a TimeoutException @@ -245,7 +245,8 @@ public class TestZKProcedure { new TimeoutException("subprocTimeout" , 1, 2, 0)); Subprocedure r = ((Subprocedure) invocation.getMock()); LOG.error("Remote commit failure, not propagating error:" + remoteCause); - r.monitor.receive(remoteCause); + comms.receiveAbortProcedure(r.getName(), remoteCause); + assertEquals(r.isComplete(), true); // don't complete the error phase until the coordinator has gotten the error // notification (which ensures that we never progress past prepare) try {