OOZIE-3584 Fork-join action issue when action param cannot be resolved (jmakai via asalamon74)
diff --git a/core/src/main/java/org/apache/oozie/workflow/lite/LiteWorkflowInstance.java b/core/src/main/java/org/apache/oozie/workflow/lite/LiteWorkflowInstance.java
index 0a36574..dc13e08 100644
--- a/core/src/main/java/org/apache/oozie/workflow/lite/LiteWorkflowInstance.java
+++ b/core/src/main/java/org/apache/oozie/workflow/lite/LiteWorkflowInstance.java
@@ -334,9 +334,6 @@
     }
 
     public synchronized void fail(String nodeName) throws WorkflowException {
-        if (status.isEndState()) {
-            throw new WorkflowException(ErrorCode.E0718);
-        }
         String failedNode = failNode(nodeName);
         if (failedNode != null) {
             log.warn(XLog.STD, "Workflow Failed. Failing node [{0}]", failedNode);
@@ -344,11 +341,20 @@
         else {
             //TODO failed attempting to fail the action. EXCEPTION
         }
-        List<String> killedNodes = killNodes();
-        if (killedNodes.size() > 1) {
-            log.warn(XLog.STD, "Workflow Failed, killing [{0}] nodes", killedNodes.size());
+
+        if (status.isEndState()) {
+            if (status == Status.FAILED) {
+                log.warn(XLog.STD, "An attempt was made to fail the workflow, which is already failed");
+            } else {
+                throw new WorkflowException(ErrorCode.E0718);
+            }
+        } else {
+            List<String> killedNodes = killNodes();
+            if (killedNodes.size() > 1) {
+                log.warn(XLog.STD, "Workflow Failed, killing [{0}] nodes", killedNodes.size());
+            }
+            status = Status.FAILED;
         }
-        status = Status.FAILED;
     }
 
     public synchronized void kill() throws WorkflowException {
diff --git a/core/src/test/java/org/apache/oozie/workflow/lite/TestLiteWorkflowLib.java b/core/src/test/java/org/apache/oozie/workflow/lite/TestLiteWorkflowLib.java
index 4ea02ee..a18cdf0 100644
--- a/core/src/test/java/org/apache/oozie/workflow/lite/TestLiteWorkflowLib.java
+++ b/core/src/test/java/org/apache/oozie/workflow/lite/TestLiteWorkflowLib.java
@@ -543,6 +543,27 @@
         assertEquals(0, fails.size());
     }
 
+    public void testForkBothAsynchFailingNodes() throws WorkflowException {
+
+        LiteWorkflowApp def = new LiteWorkflowApp("wf", "<worklfow-app/>",
+                new StartNodeDef(TestControlNodeHandler.class, "f"))
+                .addNode(new ForkNodeDef("f", TestControlNodeHandler.class, Arrays.asList(new String[]{"a", "b"})))
+                .addNode(new NodeDef("a", null, AsynchNodeHandler.class, Arrays.asList(new String[]{"j"})))
+                .addNode(new NodeDef("b", null, AsynchNodeHandler.class, Arrays.asList(new String[]{"j"})))
+                .addNode(new JoinNodeDef("j", TestControlNodeHandler.class, "end"))
+                .addNode(new EndNodeDef("end", TestControlNodeHandler.class));
+
+        LiteWorkflowInstance job = new LiteWorkflowInstance(def, new XConfiguration(), "1");
+        job.start();
+        assertEquals(WorkflowInstance.Status.RUNNING, job.getStatus());
+        job.fail("a");
+        job.fail("b");
+        assertEquals("Both nodes should be entered", 2, enters.size());
+        assertEquals("One of the nodes should be killed, which gets failed parallelly", 1, kills.size());
+        assertEquals("None of the nodes should be exited", 0, exits.size());
+        assertEquals("Both nodes should be failed", 2, fails.size());
+    }
+
     public void testFailWithRunningNodes() throws WorkflowException {
 
         LiteWorkflowApp def = new LiteWorkflowApp("wf", "<worklfow-app/>",
diff --git a/release-log.txt b/release-log.txt
index 8a006d6..090899c 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -1,5 +1,6 @@
 -- Oozie 5.3.0 release (trunk - unreleased)
 
+OOZIE-3584 Fork-join action issue when action param cannot be resolved (jmakai via asalamon74)
 OOZIE-3589 Avoid calling copyActionData method multiple times in ReRunXCommand (zuston via asalamon74)
 OOZIE-3590 Fix missing log expression parameter in SLACalculatorMemory (zuston via asalamon74)
 OOZIE-3551 Spark shouldn't obtain tokens withing the Spark action (Liz Szilagyi via gezapeti)