Author: mona
Date: Tue Jul 16 16:26:55 2013
New Revision: 1503784

URL: http://svn.apache.org/r1503784
Log:
OOZIE-1450 Duplicate Coord_Action events on Waiting -> Timeout, and Coord 
Materialize not removing actions on Failure (mona)

Modified:
    oozie/trunk/client/src/main/java/org/apache/oozie/client/event/SLAEvent.java
    
oozie/trunk/core/src/main/java/org/apache/oozie/command/coord/CoordMaterializeTransitionXCommand.java
    oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalcStatus.java
    oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java
    oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLAOperations.java
    
oozie/trunk/core/src/test/java/org/apache/oozie/command/coord/TestCoordMaterializeTransitionXCommand.java
    oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAService.java
    oozie/trunk/core/src/test/java/org/apache/oozie/test/XDataTestCase.java
    oozie/trunk/release-log.txt

Modified: 
oozie/trunk/client/src/main/java/org/apache/oozie/client/event/SLAEvent.java
URL: 
http://svn.apache.org/viewvc/oozie/trunk/client/src/main/java/org/apache/oozie/client/event/SLAEvent.java?rev=1503784&r1=1503783&r2=1503784&view=diff
==============================================================================
--- 
oozie/trunk/client/src/main/java/org/apache/oozie/client/event/SLAEvent.java 
(original)
+++ 
oozie/trunk/client/src/main/java/org/apache/oozie/client/event/SLAEvent.java 
Tue Jul 16 16:26:55 2013
@@ -193,4 +193,10 @@ public abstract class SLAEvent extends E
      */
     public abstract Date getLastModifiedTime();
 
+    @Override
+    public String toString() {
+        return "ID: " + getId() + ", MsgType:" + getMsgType() + ", SLAStatus: 
" + getSLAStatus() + ", EventStatus: "
+                + getEventStatus() + " AppType " + getAppType();
+    }
+
 }

Modified: 
oozie/trunk/core/src/main/java/org/apache/oozie/command/coord/CoordMaterializeTransitionXCommand.java
URL: 
http://svn.apache.org/viewvc/oozie/trunk/core/src/main/java/org/apache/oozie/command/coord/CoordMaterializeTransitionXCommand.java?rev=1503784&r1=1503783&r2=1503784&view=diff
==============================================================================
--- 
oozie/trunk/core/src/main/java/org/apache/oozie/command/coord/CoordMaterializeTransitionXCommand.java
 (original)
+++ 
oozie/trunk/core/src/main/java/org/apache/oozie/command/coord/CoordMaterializeTransitionXCommand.java
 Tue Jul 16 16:26:55 2013
@@ -266,9 +266,11 @@ public class CoordMaterializeTransitionX
             updateJobMaterializeInfo(coordJob);
         }
         catch (CommandException ex) {
-            LOG.warn("Exception occurs:" + ex.getMessage() + " Making the job 
failed ", ex);
+            LOG.warn("Exception occurred:" + ex.getMessage() + " Making the 
job failed ", ex);
             coordJob.setStatus(Job.Status.FAILED);
             coordJob.resetPending();
+            // remove any materialized actions and slaEvents
+            insertList.clear();
         }
         catch (Exception e) {
             LOG.error("Exception thrown :", e);
@@ -378,14 +380,14 @@ public class CoordMaterializeTransitionX
         actionBean.setActionXml(actionXml);
 
         insertList.add(actionBean);
-        writeActionRegistration(actionXml, actionBean);
+        writeActionSlaRegistration(actionXml, actionBean);
 
         // TODO: time 100s should be configurable
         queue(new CoordActionNotificationXCommand(actionBean), 100);
         queue(new CoordActionInputCheckXCommand(actionBean.getId(), 
actionBean.getJobId()), 100);
     }
 
-    private void writeActionRegistration(String actionXml, 
CoordinatorActionBean actionBean) throws Exception {
+    private void writeActionSlaRegistration(String actionXml, 
CoordinatorActionBean actionBean) throws Exception {
         Element eAction = XmlUtils.parseXml(actionXml);
         Element eSla = eAction.getChild("action", 
eAction.getNamespace()).getChild("info", eAction.getNamespace("sla"));
         SLAEventBean slaEvent = 
SLADbOperations.createSlaRegistrationEvent(eSla, actionBean.getId(), 
SlaAppType.COORDINATOR_ACTION, coordJob

Modified: oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalcStatus.java
URL: 
http://svn.apache.org/viewvc/oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalcStatus.java?rev=1503784&r1=1503783&r2=1503784&view=diff
==============================================================================
--- oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalcStatus.java 
(original)
+++ oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalcStatus.java Tue 
Jul 16 16:26:55 2013
@@ -264,9 +264,4 @@ public class SLACalcStatus extends SLAEv
         return lastModifiedTime;
     }
 
-    @Override
-    public String toString() {
-        return "ID: " + getId() + " SLAStatus: " + slaStatus + " EventStatus: 
"+eventStatus + " AppType " + getAppType();
-    }
-
 }

Modified: 
oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java
URL: 
http://svn.apache.org/viewvc/oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java?rev=1503784&r1=1503783&r2=1503784&view=diff
==============================================================================
--- 
oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java 
(original)
+++ 
oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java 
Tue Jul 16 16:26:55 2013
@@ -600,17 +600,17 @@ public class SLACalculatorMemory impleme
      * @throws JPAExecutorException
      */
     private SLASummaryBean processJobEndFailureSLA(SLACalcStatus slaCalc, Date 
actualStart, Date actualEnd) throws JPAExecutorException {
-        if (actualStart == null) {
-            // job failed before starting
-            slaCalc.setEventProcessed(7);
-            slaCalc.setActualEnd(actualEnd);
-            slaCalc.setEventStatus(EventStatus.END_MISS);
-            slaCalc.setSLAStatus(SLAStatus.MISS);
-            eventHandler.queueEvent(new SLACalcStatus(slaCalc));
-            return getSLASummaryBean(slaCalc);
-        }
         slaCalc.setActualStart(actualStart);
         slaCalc.setActualEnd(actualEnd);
+        if (actualStart == null) { // job failed before starting
+            if (slaCalc.getEventProcessed() != 5) { // 101 = end+start already 
processed
+                slaCalc.setEventStatus(EventStatus.END_MISS);
+                slaCalc.setSLAStatus(SLAStatus.MISS);
+                eventHandler.queueEvent(new SLACalcStatus(slaCalc));
+                slaCalc.setEventProcessed(7);
+                return getSLASummaryBean(slaCalc);
+            }
+        }
         SLARegistrationBean reg = slaCalc.getSLARegistrationBean();
         long expectedDuration = reg.getExpectedDuration();
         long actualDuration = actualEnd.getTime() - actualStart.getTime();

Modified: oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLAOperations.java
URL: 
http://svn.apache.org/viewvc/oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLAOperations.java?rev=1503784&r1=1503783&r2=1503784&view=diff
==============================================================================
--- oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLAOperations.java 
(original)
+++ oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLAOperations.java Tue 
Jul 16 16:26:55 2013
@@ -19,7 +19,6 @@ package org.apache.oozie.sla;
 
 import java.text.ParseException;
 import java.util.Date;
-
 import org.apache.oozie.AppType;
 import org.apache.oozie.ErrorCode;
 import org.apache.oozie.client.event.SLAEvent.EventStatus;
@@ -118,8 +117,11 @@ public class SLAOperations {
                     EventStatus.valueOf(event);
                 }
                 catch (IllegalArgumentException iae) {
-                    throw new CommandException(ErrorCode.E0302, "'" + event + 
"'",
-                            " for SLA Alert event. Should be one of " + 
EventStatus.values());
+                    XLog.getLog(SLAService.class).warn(
+                            "Invalid value: [" + event + "]" + " for SLA 
Alert-event. Should be one of "
+                                    + EventStatus.values() + ". Setting it to 
default [" + EventStatus.END_MISS.name()
+                                    + "]");
+                    event = EventStatus.END_MISS.name();
                 }
                 alertsStr.append(event).append(",");
             }

Modified: 
oozie/trunk/core/src/test/java/org/apache/oozie/command/coord/TestCoordMaterializeTransitionXCommand.java
URL: 
http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/command/coord/TestCoordMaterializeTransitionXCommand.java?rev=1503784&r1=1503783&r2=1503784&view=diff
==============================================================================
--- 
oozie/trunk/core/src/test/java/org/apache/oozie/command/coord/TestCoordMaterializeTransitionXCommand.java
 (original)
+++ 
oozie/trunk/core/src/test/java/org/apache/oozie/command/coord/TestCoordMaterializeTransitionXCommand.java
 Tue Jul 16 16:26:55 2013
@@ -20,6 +20,7 @@ package org.apache.oozie.command.coord;
 import java.sql.Timestamp;
 import java.util.Date;
 import java.util.List;
+
 import org.apache.oozie.CoordinatorActionBean;
 import org.apache.oozie.CoordinatorJobBean;
 import org.apache.oozie.ErrorCode;
@@ -202,6 +203,35 @@ public class TestCoordMaterializeTransit
     }
 
     /**
+     * Test a coordinator does not materialize actions upon CommandException
+     * leading to FAILED state
+     *
+     * @throws Exception
+     */
+    public void testFailedJobNotMaterializeActions() throws Exception {
+        String coordXml = "<coordinator-app 
xmlns=\"uri:oozie:coordinator:0.4\"" + " name=\"NAME\" frequency=\"5\""
+                + " start=\"#start\" end=\"#end\" 
timezone=\"America/Los_Angeles\""
+                + " freq_timeunit=\"DAY\" end_of_duration=\"NONE\">" + 
"<input-events>"
+                + "<data-in name=\"a\" dataset=\"a\">"
+                + "<dataset name=\"a\" frequency=\"7\" 
initial-instance=\"2010-01-01T00:00Z\" timezone=\"UTC\" "
+                + "freq_timeunit=\"MINUTE\" end_of_duration=\"NONE\">"
+                + 
"<uri-template>${hcatNode}/${db}/${table}/ds=${YEAR}-${MONTH}-${DAY};region=${region}</uri-template>"
+                + "</dataset>" + 
"<start-instance>${coord:current(0)}</start-instance>"
+                + "<end-instance>${coord:latest(0)}</end-instance>" + 
"</data-in>" + "</input-events>" + "<action>"
+                + "<workflow>" + "<app-path>hdfs:///tmp/workflows/</app-path>" 
+ "</workflow>" + "</action>"
+                + "</coordinator-app>";
+        CoordinatorJobBean job = addRecordToCoordJobTable(coordXml);
+        new CoordMaterializeTransitionXCommand(job.getId(), 3600).call();
+        JPAService jpaService = Services.get().get(JPAService.class);
+        job = jpaService.execute(new CoordJobGetJPAExecutor(job.getId()));
+        assertEquals(CoordinatorJob.Status.FAILED, job.getStatus());
+        // GetActions for coord job, should be none
+        int actions = jpaService.execute(new 
CoordJobGetActionsJPAExecutor(job.getId()));
+        assertEquals(0, actions);
+
+    }
+
+    /**
      * Test a coordinator job that will run beyond 5 minutes from now,
      * materilization should not happen.
      * @throws Exception

Modified: 
oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAService.java
URL: 
http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAService.java?rev=1503784&r1=1503783&r2=1503784&view=diff
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAService.java 
(original)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAService.java Tue 
Jul 16 16:26:55 2013
@@ -31,6 +31,7 @@ import org.apache.oozie.client.event.SLA
 import org.apache.oozie.executor.jpa.WorkflowJobGetJPAExecutor;
 import org.apache.oozie.executor.jpa.WorkflowJobInsertJPAExecutor;
 import org.apache.oozie.executor.jpa.WorkflowJobUpdateJPAExecutor;
+import org.apache.oozie.executor.jpa.sla.SLARegistrationGetJPAExecutor;
 import org.apache.oozie.executor.jpa.sla.SLASummaryGetJPAExecutor;
 import org.apache.oozie.service.EventHandlerService;
 import org.apache.oozie.service.JPAService;
@@ -38,7 +39,9 @@ import org.apache.oozie.service.Services
 import org.apache.oozie.sla.listener.SLAEventListener;
 import org.apache.oozie.sla.service.SLAService;
 import org.apache.oozie.test.XDataTestCase;
+import org.apache.oozie.util.XmlUtils;
 import org.apache.oozie.workflow.WorkflowInstance;
+import org.jdom.Element;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -267,6 +270,24 @@ public class TestSLAService extends XDat
 
     }
 
+    /**
+     * Test SLAOperations handles unexpected alert-events in xml
+     * @throws Exception
+     */
+    public void testSLAOperations() throws Exception {
+        String slaXml = " <sla:info xmlns:sla='uri:oozie:sla:0.2'>"
+                + " <sla:nominal-time>2009-03-06T10:00Z</sla:nominal-time>" + 
" <sla:should-start>5</sla:should-start>"
+                + " <sla:should-end>120</sla:should-end>" + " 
<sla:max-duration>100</sla:max-duration>"
+                + " 
<sla:alert-events>\"invalid_event_miss\'</sla:alert-events>"
+                + " <sla:alert-contact>[email protected]</sla:alert-contact>" + 
"</sla:info>";
+        Element eSla = XmlUtils.parseXml(slaXml);
+        SLAOperations.createSlaRegistrationEvent(eSla, "job-id1", 
"parent-id1", AppType.WORKFLOW_JOB, getTestUser(),
+                "test-appname", log, false);
+        SLARegistrationBean reg = Services.get().get(JPAService.class)
+                .execute(new SLARegistrationGetJPAExecutor("job-id1"));
+        assertEquals("END_MISS", reg.getAlertEvents());
+    }
+
     static SLARegistrationBean _createSLARegistration(String jobId, AppType 
appType) {
         SLARegistrationBean bean = new SLARegistrationBean();
         bean.setId(jobId);

Modified: 
oozie/trunk/core/src/test/java/org/apache/oozie/test/XDataTestCase.java
URL: 
http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/test/XDataTestCase.java?rev=1503784&r1=1503783&r2=1503784&view=diff
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/test/XDataTestCase.java 
(original)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/test/XDataTestCase.java Tue 
Jul 16 16:26:55 2013
@@ -168,6 +168,31 @@ public abstract class XDataTestCase exte
         return coordJob;
     }
 
+    protected CoordinatorJobBean addRecordToCoordJobTable(String appXml) 
throws Exception {
+        Date start = DateUtils.parseDateOozieTZ("2009-02-01T01:00Z");
+        Date end = DateUtils.parseDateOozieTZ("2009-02-03T23:59Z");
+        appXml = appXml.replaceAll("#start", 
DateUtils.formatDateOozieTZ(start));
+        appXml = appXml.replaceAll("#end", DateUtils.formatDateOozieTZ(end));
+        Path appPath = new Path(getFsTestCaseDir(), "coord");
+        writeToFile(appXml, appPath, "coordinator.xml");
+        CoordinatorJobBean coordJob = createCoordBean(appPath, appXml, 
CoordinatorJob.Status.PREP, start, end, false,
+                false, 0);
+
+        try {
+            JPAService jpaService = Services.get().get(JPAService.class);
+            assertNotNull(jpaService);
+            CoordJobInsertJPAExecutor coordInsertCmd = new 
CoordJobInsertJPAExecutor(coordJob);
+            jpaService.execute(coordInsertCmd);
+        }
+        catch (JPAExecutorException je) {
+            je.printStackTrace();
+            fail("Unable to insert the test coord job record to table");
+            throw je;
+        }
+
+        return coordJob;
+    }
+
     /**
      * Insert coord job for testing.
      *
@@ -320,39 +345,12 @@ public abstract class XDataTestCase exte
         Path appPath = new Path(getFsTestCaseDir(), "coord");
         String appXml = writeCoordXml(appPath);
 
-        CoordinatorJobBean coordJob = new CoordinatorJobBean();
-        
coordJob.setId(Services.get().get(UUIDService.class).generateId(ApplicationType.COORDINATOR));
-        coordJob.setAppName("COORD-TEST");
-        coordJob.setAppPath(appPath.toString());
-        coordJob.setStatus(status);
-        coordJob.setTimeZone("America/Los_Angeles");
-        coordJob.setCreatedTime(new Date());
-        coordJob.setLastModifiedTime(new Date());
-        coordJob.setUser(getTestUser());
-        coordJob.setGroup(getTestGroup());
-        if (pending) {
-            coordJob.setPending();
-        }
-        if (doneMatd) {
-            coordJob.setDoneMaterialization();
-        }
-
-        Configuration conf = getCoordConf(appPath);
-        coordJob.setConf(XmlUtils.prettyPrint(conf).toString());
-        coordJob.setJobXml(appXml);
-        coordJob.setLastActionNumber(0);
-        coordJob.setFrequency("1");
-        coordJob.setTimeUnit(Timeunit.DAY);
-        coordJob.setExecution(Execution.FIFO);
-        coordJob.setConcurrency(1);
-        coordJob.setMatThrottling(1);
         // Set the start and end time in future
         String currentDatePlusMonth = 
XDataTestCase.getCurrentDateafterIncrementingInMonths(1);
         Date start = DateUtils.parseDateOozieTZ(currentDatePlusMonth);
         Date end = DateUtils.parseDateOozieTZ(currentDatePlusMonth);
-        coordJob.setStartTime(start);
-        coordJob.setEndTime(end);
-        return coordJob;
+
+        return createCoordBean(appPath, appXml, status, start, end, pending, 
doneMatd, 0);
     }
 
     /**
@@ -372,41 +370,7 @@ public abstract class XDataTestCase exte
         Path appPath = new Path(getFsTestCaseDir(), "coord");
         String appXml = writeCoordXml(appPath, start, end);
 
-        CoordinatorJobBean coordJob = new CoordinatorJobBean();
-        
coordJob.setId(Services.get().get(UUIDService.class).generateId(ApplicationType.COORDINATOR));
-        coordJob.setAppName("COORD-TEST");
-        coordJob.setAppPath(appPath.toString());
-        coordJob.setStatus(status);
-        coordJob.setTimeZone("America/Los_Angeles");
-        coordJob.setCreatedTime(new Date());
-        coordJob.setLastModifiedTime(new Date());
-        coordJob.setUser(getTestUser());
-        coordJob.setGroup(getTestGroup());
-        if (pending) {
-            coordJob.setPending();
-        }
-        if (doneMatd) {
-            coordJob.setDoneMaterialization();
-        }
-        coordJob.setLastActionNumber(lastActionNum);
-
-        Configuration conf = getCoordConf(appPath);
-        coordJob.setConf(XmlUtils.prettyPrint(conf).toString());
-        coordJob.setJobXml(appXml);
-        coordJob.setFrequency("1");
-        coordJob.setTimeUnit(Timeunit.DAY);
-        coordJob.setExecution(Execution.FIFO);
-        coordJob.setConcurrency(1);
-        coordJob.setMatThrottling(1);
-        try {
-            coordJob.setStartTime(start);
-            coordJob.setEndTime(end);
-        }
-        catch (Exception e) {
-            e.printStackTrace();
-            fail("Could not set Date/time");
-        }
-        return coordJob;
+        return createCoordBean(appPath, appXml, status, start, end, pending, 
doneMatd, lastActionNum);
     }
 
     /**
@@ -427,6 +391,11 @@ public abstract class XDataTestCase exte
         Path appPath = new Path(getFsTestCaseDir(), "coord");
         String appXml = writeCoordXml(appPath, testFileName);
 
+        return createCoordBean(appPath, appXml, status, start, end, pending, 
doneMatd, lastActionNum);
+    }
+
+    private CoordinatorJobBean createCoordBean(Path appPath, String appXml, 
CoordinatorJob.Status status, Date start,
+            Date end, boolean pending, boolean doneMatd, int lastActionNum) 
throws Exception {
         CoordinatorJobBean coordJob = new CoordinatorJobBean();
         
coordJob.setId(Services.get().get(UUIDService.class).generateId(ApplicationType.COORDINATOR));
         coordJob.setAppName("COORD-TEST");

Modified: oozie/trunk/release-log.txt
URL: 
http://svn.apache.org/viewvc/oozie/trunk/release-log.txt?rev=1503784&r1=1503783&r2=1503784&view=diff
==============================================================================
--- oozie/trunk/release-log.txt (original)
+++ oozie/trunk/release-log.txt Tue Jul 16 16:26:55 2013
@@ -5,6 +5,7 @@ OOZIE-1440 Build fails in certain enviro
 
 -- Oozie 4.0.0 release
 
+OOZIE-1450 Duplicate Coord_Action events on Waiting -> Timeout, and Coord 
Materialize not removing actions on Failure (mona)
 OOZIE-1451 CoordActionInputCheckX does a redundant eagerLoadState (rohini)
 OOZIE-1446 SLACalcStatus not updating the last modified time correctly and 
duplicate DURATION_* event (virag,mona via mona)
 OOZIE-1249 SLA Documentation (mona,virag,rohini via rohini)


Reply via email to