You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oozie.apache.org by mo...@apache.org on 2013/05/28 20:44:17 UTC

svn commit: r1487035 - in /oozie/trunk: ./ client/src/main/java/org/apache/oozie/client/event/ core/src/main/java/org/apache/oozie/executor/jpa/sla/ core/src/main/java/org/apache/oozie/service/ core/src/main/java/org/apache/oozie/sla/ core/src/test/jav...

Author: mona
Date: Tue May 28 18:44:17 2013
New Revision: 1487035

URL: http://svn.apache.org/r1487035
Log:
OOZIE-1361 Remove SLACalculatorBean and add columns to SummaryBean indicating events processed and sla processed (mona)

Modified:
    oozie/trunk/client/src/main/java/org/apache/oozie/client/event/SLAEvent.java
    oozie/trunk/core/src/main/java/org/apache/oozie/executor/jpa/sla/SLACalculatorGetJPAExecutor.java
    oozie/trunk/core/src/main/java/org/apache/oozie/service/JPAService.java
    oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalcStatus.java
    oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorBean.java
    oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorMemory.java
    oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLASummaryBean.java
    oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLACalculationJPAExecutor.java
    oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAEventGeneration.java
    oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAJobEventListener.java
    oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAService.java
    oozie/trunk/core/src/test/java/org/apache/oozie/test/XTestCase.java
    oozie/trunk/release-log.txt
    oozie/trunk/tools/src/main/java/org/apache/oozie/tools/OozieDBCLI.java

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=1487035&r1=1487034&r2=1487035&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 May 28 18:44:17 2013
@@ -27,7 +27,7 @@ import org.apache.oozie.AppType;
 public abstract class SLAEvent extends Event {
 
     public static enum EventStatus {
-        START_MET, START_MISS, END_MET, END_MISS, DURATION_MET, DURATION_MISS
+        START_MET, START_MISS, DURATION_MET, DURATION_MISS, END_MET, END_MISS
     }
 
     public static enum SLAStatus {

Modified: oozie/trunk/core/src/main/java/org/apache/oozie/executor/jpa/sla/SLACalculatorGetJPAExecutor.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/main/java/org/apache/oozie/executor/jpa/sla/SLACalculatorGetJPAExecutor.java?rev=1487035&r1=1487034&r2=1487035&view=diff
==============================================================================
--- oozie/trunk/core/src/main/java/org/apache/oozie/executor/jpa/sla/SLACalculatorGetJPAExecutor.java (original)
+++ oozie/trunk/core/src/main/java/org/apache/oozie/executor/jpa/sla/SLACalculatorGetJPAExecutor.java Tue May 28 18:44:17 2013
@@ -1,59 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.oozie.executor.jpa.sla;
-
-import javax.persistence.EntityManager;
-import javax.persistence.Query;
-
-import org.apache.oozie.ErrorCode;
-import org.apache.oozie.executor.jpa.JPAExecutor;
-import org.apache.oozie.executor.jpa.JPAExecutorException;
-import org.apache.oozie.sla.SLACalculatorBean;
-
-/**
- * Load the list of SLACalculatorBean and return the list.
- */
-public class SLACalculatorGetJPAExecutor implements JPAExecutor<SLACalculatorBean> {
-
-    private String id = null;
-
-    public SLACalculatorGetJPAExecutor(String id) {
-        this.id = id;
-    }
-
-    @Override
-    public String getName() {
-        return "SLACalculatorGetJPAExecutor";
-    }
-
-    @Override
-    public SLACalculatorBean execute(EntityManager em) throws JPAExecutorException {
-        SLACalculatorBean scBean;
-        Query q;
-        try {
-            q = em.createNamedQuery("GET_SLA_CALC");
-            q.setParameter("id", id);
-            scBean = (SLACalculatorBean) q.getSingleResult();
-        }
-        catch (Exception e) {
-            throw new JPAExecutorException(ErrorCode.E0603, e.getMessage(), e);
-        }
-        return scBean;
-    }
-
-}

Modified: oozie/trunk/core/src/main/java/org/apache/oozie/service/JPAService.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/main/java/org/apache/oozie/service/JPAService.java?rev=1487035&r1=1487034&r2=1487035&view=diff
==============================================================================
--- oozie/trunk/core/src/main/java/org/apache/oozie/service/JPAService.java (original)
+++ oozie/trunk/core/src/main/java/org/apache/oozie/service/JPAService.java Tue May 28 18:44:17 2013
@@ -44,7 +44,6 @@ import org.apache.oozie.client.rest.Json
 import org.apache.oozie.client.rest.sla.JsonSLARegistrationEvent;
 import org.apache.oozie.executor.jpa.JPAExecutor;
 import org.apache.oozie.executor.jpa.JPAExecutorException;
-import org.apache.oozie.sla.SLACalculatorBean;
 import org.apache.oozie.sla.SLARegistrationBean;
 import org.apache.oozie.sla.SLASummaryBean;
 import org.apache.oozie.util.IOUtils;
@@ -56,6 +55,7 @@ import org.apache.openjpa.persistence.Op
 /**
  * Service that manages JPA and executes {@link JPAExecutor}.
  */
+@SuppressWarnings("deprecation")
 public class JPAService implements Service, Instrumentable {
     private static final String INSTRUMENTATION_GROUP = "jpa";
 
@@ -175,7 +175,6 @@ public class JPAService implements Servi
         entityManager.find(BundleActionBean.class, 1);
         entityManager.find(SLARegistrationBean.class, 1);
         entityManager.find(JsonSLARegistrationEvent.class, 1);
-        entityManager.find(SLACalculatorBean.class, 1);
         entityManager.find(SLASummaryBean.class, 1);
 
         LOG.info(XLog.STD, "All entities initialized");

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=1487035&r1=1487034&r2=1487035&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 May 28 18:44:17 2013
@@ -29,32 +29,23 @@ import org.apache.oozie.client.event.SLA
 public class SLACalcStatus extends SLAEvent {
 
     private SLARegistrationBean regBean;
-    private SLACalculatorBean calcBean;
     private String jobStatus;
     private SLAStatus slaStatus;
     private EventStatus eventStatus;
     private Date actualStart;
     private Date actualEnd;
     private long actualDuration;
-
-    public SLACalcStatus(SLARegistrationBean reg, String jobStatus, EventStatus eventStatus) {
-        setSLARegistrationBean(reg);
-        calcBean = new SLACalculatorBean();
-        setJobId(reg.getJobId());
-        setJobStatus(jobStatus);
-        setEventStatus(eventStatus);
-    }
-
-    public SLACalcStatus(SLARegistrationBean reg, SLACalculatorBean calcBean) {
-        setSLARegistrationBean(reg);
-        setSLACalculatorBean(calcBean);
-    }
+    private Date lastModifiedTime;
+    private byte slaProcessed;
+    private byte eventProcessed;
 
     public SLACalcStatus(SLARegistrationBean reg) {
-        this(reg, null, null);
+        this();
+        setSLARegistrationBean(reg);
     }
 
     public SLACalcStatus(SLASummaryBean summary) {
+        this();
         SLARegistrationBean reg = new SLARegistrationBean();
         reg.setUser(summary.getUser());
         reg.setAppName(summary.getAppName());
@@ -68,29 +59,38 @@ public class SLACalcStatus extends SLAEv
         setActualDuration(summary.getActualDuration());
         setSLAStatus(summary.getSLAStatus());
         setSLARegistrationBean(reg);
-        calcBean = new SLACalculatorBean();
         setJobId(reg.getJobId());
         setJobStatus(summary.getJobStatus());
         setEventStatus(summary.getEventStatus());
+        setLastModifiedTime(summary.getLastModifiedTime());
+        setSlaProcessed(summary.getSlaProcessed());
+        setEventProcessed((byte) summary.getEventStatus().ordinal());
     }
 
     /**
      * copy constructor
-     * @return
+     * @return SLACalcStatus
      */
     public SLACalcStatus(SLACalcStatus a) {
-        this.setSLARegistrationBean(a.getSLARegistrationBean());
-        this.setSLACalculatorBean(a.getSLACalculatorBean());
-        this.setJobStatus(a.getJobStatus());
-        this.setSLAStatus(a.getSLAStatus());
-        this.setEventStatus(a.getEventStatus());
-        this.setActualStart(a.getActualStart());
-        this.setActualEnd(a.getActualEnd());
-        this.setActualDuration(a.getActualDuration());
+        this();
+        setSLARegistrationBean(a.getSLARegistrationBean());
+        setJobStatus(a.getJobStatus());
+        setSLAStatus(a.getSLAStatus());
+        setEventStatus(a.getEventStatus());
+        setActualStart(a.getActualStart());
+        setActualEnd(a.getActualEnd());
+        setActualDuration(a.getActualDuration());
+        setLastModifiedTime(a.getLastModifiedTime());
+        setSlaProcessed(a.getSlaProcessed());
+        setEventProcessed(a.getEventProcessed());
     }
 
     public SLACalcStatus() {
         setMsgType(MessageType.SLA);
+        setSlaProcessed((byte) 0);
+        setEventProcessed((byte) 0);
+        setActualDuration(-1);
+        setLastModifiedTime(new Date());
     }
 
     public SLARegistrationBean getSLARegistrationBean() {
@@ -101,14 +101,6 @@ public class SLACalcStatus extends SLAEv
         this.regBean = slaBean;
     }
 
-    public SLACalculatorBean getSLACalculatorBean() {
-        return calcBean;
-    }
-
-    public void setSLACalculatorBean(SLACalculatorBean calcBean) {
-        this.calcBean = calcBean;
-    }
-
     @Override
     public String getJobId() {
         return regBean.getJobId();
@@ -116,7 +108,6 @@ public class SLACalcStatus extends SLAEv
 
     public void setJobId(String id) {
         regBean.setJobId(id);
-        calcBean.setJobId(id);
     }
 
     @Override
@@ -173,28 +164,44 @@ public class SLACalcStatus extends SLAEv
         this.eventStatus = es;
     }
 
-    public boolean isStartProcessed() {
-        return calcBean.isStartProcessed();
+    public Date getLastModifiedTime() {
+        return lastModifiedTime;
     }
 
-    public void setStartProcessed(boolean startProcessed) {
-        calcBean.setStartProcessed(startProcessed);
+    public void setLastModifiedTime(Date lastModifiedTime) {
+        this.lastModifiedTime = lastModifiedTime;
     }
 
-    public boolean isEndProcessed() {
-        return calcBean.isEndProcessed();
+    /**
+     * Get whether sla has been processed
+     * and actual times stored for this job
+     *
+     * @return 0 = sla not processed
+     * 1 = sla processed but actual times not stored
+     * 2 = sla processed as well as actual times stored
+     */
+    public byte getSlaProcessed() {
+        return slaProcessed;
     }
 
-    public void setEndProcessed(boolean endProcessed) {
-        calcBean.setEndProcessed(endProcessed);
+    public void setSlaProcessed(int slaProcessed) {
+        this.slaProcessed = (byte) slaProcessed;
     }
 
-    public boolean isDurationProcessed() {
-        return calcBean.isDurationProcessed();
+    /**
+     * Get which type of sla event has been processed needed when calculator
+     * periodically loops to update all jobs' sla
+     *
+     * @return byte 1st bit set (from LSB) = start processed
+     * 2nd bit set = duration processed
+     * 3rd bit set = end processed
+     */
+    public byte getEventProcessed() {
+        return eventProcessed;
     }
 
-    public void setDurationProcessed(boolean durationProcessed) {
-        calcBean.setDurationProcessed(durationProcessed);
+    public void setEventProcessed(int eventProcessed) {
+        this.eventProcessed = (byte) eventProcessed;
     }
 
     @Override

Modified: oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorBean.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorBean.java?rev=1487035&r1=1487034&r2=1487035&view=diff
==============================================================================
--- oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorBean.java (original)
+++ oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLACalculatorBean.java Tue May 28 18:44:17 2013
@@ -1,100 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.oozie.sla;
-
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-
-import org.apache.oozie.client.rest.JsonBean;
-import org.json.simple.JSONObject;
-
-@Entity
-@Table(name = "SLA_CALCULATOR")
-@NamedQueries({ @NamedQuery(name = "GET_SLA_CALC", query = "select OBJECT(w) from SLACalculatorBean w where w.jobId = :id") })
-public class SLACalculatorBean implements JsonBean {
-
-    @Id
-    @Basic
-    @Column(name = "job_id")
-    private String jobId;
-
-    @Basic
-    @Column(name = "start_processed")
-    private boolean startProcessed = false;
-
-    @Basic
-    @Column(name = "end_processed")
-    private boolean endProcessed = false;
-
-    @Basic
-    @Column(name = "duration_processed")
-    private boolean durationProcessed = false;
-
-    public SLACalculatorBean() {
-    }
-
-    public String getJobId() {
-        return jobId;
-    }
-
-    public void setJobId(String jobId) {
-        this.jobId = jobId;
-    }
-
-    public boolean isStartProcessed() {
-        return startProcessed;
-    }
-
-    public void setStartProcessed(boolean startProcessed) {
-        this.startProcessed = startProcessed;
-    }
-
-    public boolean isEndProcessed() {
-        return endProcessed;
-    }
-
-    public void setEndProcessed(boolean endProcessed) {
-        this.endProcessed = endProcessed;
-    }
-
-    public boolean isDurationProcessed() {
-        return durationProcessed;
-    }
-
-    public void setDurationProcessed(boolean durationProcessed) {
-        this.durationProcessed = durationProcessed;
-    }
-
-    @Override
-    public JSONObject toJSONObject() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public JSONObject toJSONObject(String timeZoneId) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}

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=1487035&r1=1487034&r2=1487035&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 May 28 18:44:17 2013
@@ -104,49 +104,52 @@ public class SLACalculatorMemory impleme
         List<JsonBean> updateList = new ArrayList<JsonBean>();
         synchronized (slaCalc) {
             boolean change = false;
+            byte eventProc = slaCalc.getEventProcessed();
             SLARegistrationBean reg = slaCalc.getSLARegistrationBean();
             // calculation w.r.t current time and status
-            if (reg.getExpectedStart() == null) {
-                slaCalc.setStartProcessed(true); //disable further processing
-            }
-            if (!slaCalc.isStartProcessed()) {
-                if (reg.getExpectedStart().getTime() < Calendar.getInstance(TimeZone.getTimeZone("UTC"))
-                        .getTimeInMillis()) {
-                    slaCalc.setEventStatus(EventStatus.START_MISS);
-                    slaCalc.setStartProcessed(true);
-                    change = true;
-                    eventHandler.queueEvent(new SLACalcStatus(slaCalc));
+            if ((eventProc & 1) == 0) { // first bit (start-processed) unset
+                if (reg.getExpectedStart() != null) {
+                    if (reg.getExpectedStart().getTime() < Calendar.getInstance(TimeZone.getTimeZone("UTC"))
+                            .getTimeInMillis()) {
+                        slaCalc.setEventStatus(EventStatus.START_MISS);
+                        change = true;
+                        eventHandler.queueEvent(new SLACalcStatus(slaCalc));
+                        eventProc++;
+                    }
+                }
+                else {
+                    eventProc++; //disable further processing for optional start sla condition
                 }
             }
-            if (!slaCalc.isDurationProcessed()) {
+            byte eventProcCopy = eventProc;
+            if (((eventProcCopy >> 1) & 1) == 0) { // check if second bit (duration-processed) is unset
                 if (slaCalc.getActualStart() != null) {
                     if (reg.getExpectedDuration() < Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis()
                             - slaCalc.getActualStart().getTime()) {
                         slaCalc.setEventStatus(EventStatus.DURATION_MISS);
-                        slaCalc.setDurationProcessed(true);
                         change = true;
                         eventHandler.queueEvent(new SLACalcStatus(slaCalc));
+                        eventProc += 2;
                     }
                 }
             }
-            if (!slaCalc.isEndProcessed()) {
+            if (eventProc < 5) {
                 if (reg.getExpectedEnd().getTime() < Calendar.getInstance(TimeZone.getTimeZone("UTC"))
                         .getTimeInMillis()) {
                     slaCalc.setEventStatus(EventStatus.END_MISS);
                     slaCalc.setSLAStatus(SLAStatus.MISS);
-                    slaCalc.setEndProcessed(true);
+                    slaCalc.setSlaProcessed(1);
                     change = true;
                     eventHandler.queueEvent(new SLACalcStatus(slaCalc));
+                    eventProc += 4;
                 }
             }
             if (change) {
-                // TODO:Future enhancement - priority queue implementation for
-                // calculation, update lastmodified to after every run, so
-                // service can prioritize on checking LRU style
-                updateList.add(slaCalc.getSLACalculatorBean());
+                slaCalc.setEventProcessed(eventProc);
+                slaCalc.setLastModifiedTime(new Date());
                 updateList.add(new SLASummaryBean(slaCalc));
                 jpa.execute(new SLACalculationInsertUpdateJPAExecutor(null, updateList));
-                if (slaCalc.isEndProcessed()) {
+                if (slaCalc.getEventProcessed() == 7 && slaCalc.getSlaProcessed() != 2) {
                     historySet.add(jobId);
                     slaMap.remove(jobId);
                     XLog.getLog(SLAService.class).trace("Removed Job [{0}] from map after End-processed", jobId);
@@ -156,8 +159,8 @@ public class SLACalculatorMemory impleme
     }
 
     /**
-     * Periodically run by the SLAService worker threads to update SLA status
-     * by iterating through all the jobs in the map
+     * Periodically run by the SLAService worker threads to update SLA status by
+     * iterating through all the jobs in the map
      */
     @Override
     public void updateAllSlaStatus() {
@@ -185,7 +188,6 @@ public class SLACalculatorMemory impleme
                 slaCalc.setSLAStatus(SLAStatus.NOT_STARTED);
                 slaMap.put(jobId, slaCalc);
                 insertList.add(reg);
-                insertList.add(slaCalc.getSLACalculatorBean());
                 insertList.add(new SLASummaryBean(slaCalc));
                 jpa.execute(new SLACalculationInsertUpdateJPAExecutor(insertList, null));
                 XLog.getLog(SLAService.class).trace("SLA Registration Event - Job:" + jobId);
@@ -216,23 +218,30 @@ public class SLACalculatorMemory impleme
         boolean ret = false;
         if (slaCalc != null) {
             synchronized (slaCalc) {
+                byte eventProc = slaCalc.getEventProcessed();
                 slaCalc.setJobStatus(jobStatus);
                 switch (jobEventStatus) {
                     case STARTED:
                         slaInfo = processJobStartSLA(slaCalc, startTime);
+                        eventProc += 1;
                         break;
                     case SUCCESS:
                         slaInfo = processJobEndSuccessSLA(slaCalc, startTime, endTime);
+                        slaInfo.setSlaProcessed(2);
+                        eventProc += 6;
                         break;
                     case FAILURE:
                         slaInfo = processJobEndFailureSLA(slaCalc, startTime, endTime);
+                        slaInfo.setSlaProcessed(2);
+                        eventProc += 6;
                         break;
                     default:
                         XLog.getLog(SLAService.class).debug("Unknown Job Status [{0}]", jobEventStatus);
                         return false;
                 }
-                updateList.add(slaCalc.getSLACalculatorBean());
-                if (slaCalc.isEndProcessed()) {
+                slaCalc.setEventProcessed(eventProc);
+                slaInfo.setLastModifiedTime(new Date());
+                if (slaInfo.getSlaProcessed() == 2) {
                     slaMap.remove(jobId);
                 }
                 ret = true;
@@ -246,9 +255,11 @@ public class SLACalculatorMemory impleme
             if (endTime != null) {
                 slaInfo.setActualDuration(endTime.getTime() - startTime.getTime());
             }
+            slaInfo.setSlaProcessed(2);
             historySet.remove(jobId);
             ret = true;
         }
+        slaInfo.setLastModifiedTime(new Date());
         updateList.add(slaInfo);
         if (jpa != null) {
             jpa.execute(new SLACalculationInsertUpdateJPAExecutor(null, updateList));
@@ -270,14 +281,14 @@ public class SLACalculatorMemory impleme
         slaCalc.setSLAStatus(SLAStatus.IN_PROCESS);
         SLARegistrationBean reg = slaCalc.getSLARegistrationBean();
         Date expecStart = reg.getExpectedStart();
-        if (!slaCalc.isStartProcessed() && expecStart != null) {
+        byte eventProc = slaCalc.getEventProcessed();
+        if (((eventProc & 1) == 0) && expecStart != null) {
             if (actualStart.getTime() > expecStart.getTime()) {
                 slaCalc.setEventStatus(EventStatus.START_MISS);
             }
             else {
                 slaCalc.setEventStatus(EventStatus.START_MET);
             }
-            slaCalc.setStartProcessed(true);
             eventHandler.queueEvent(new SLACalcStatus(slaCalc));
         }
         return new SLASummaryBean(slaCalc);
@@ -305,7 +316,6 @@ public class SLACalculatorMemory impleme
         else {
             slaCalc.setEventStatus(EventStatus.DURATION_MET);
         }
-        slaCalc.setDurationProcessed(true);
         eventHandler.queueEvent(new SLACalcStatus(slaCalc));
 
         Date expectedEnd = reg.getExpectedEnd();
@@ -317,7 +327,6 @@ public class SLACalculatorMemory impleme
             slaCalc.setEventStatus(EventStatus.END_MET);
             slaCalc.setSLAStatus(SLAStatus.MET);
         }
-        slaCalc.setEndProcessed(true);
         eventHandler.queueEvent(new SLACalcStatus(slaCalc));
         return new SLASummaryBean(slaCalc);
     }
@@ -346,10 +355,8 @@ public class SLACalculatorMemory impleme
         else {
             slaCalc.setEventStatus(EventStatus.DURATION_MET);
         }
-        slaCalc.setDurationProcessed(true);
         slaCalc.setEventStatus(EventStatus.END_MISS);
         slaCalc.setSLAStatus(SLAStatus.MISS);
-        slaCalc.setEndProcessed(true);
         eventHandler.queueEvent(new SLACalcStatus(slaCalc));
         summ = new SLASummaryBean(slaCalc);
         return summ;

Modified: oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLASummaryBean.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLASummaryBean.java?rev=1487035&r1=1487034&r2=1487035&view=diff
==============================================================================
--- oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLASummaryBean.java (original)
+++ oozie/trunk/core/src/main/java/org/apache/oozie/sla/SLASummaryBean.java Tue May 28 18:44:17 2013
@@ -31,12 +31,16 @@ import javax.persistence.Table;
 import org.apache.oozie.client.event.SLAEvent;
 import org.apache.oozie.client.rest.JsonBean;
 import org.apache.oozie.util.DateUtils;
+import org.apache.openjpa.persistence.jdbc.Index;
 import org.json.simple.JSONObject;
 
 @Entity
 @Table(name = "SLA_SUMMARY")
 @NamedQueries({
  @NamedQuery(name = "GET_SLA_SUMMARY", query = "select OBJECT(w) from SLASummaryBean w where w.jobId = :id") })
+/**
+ * Class to store all the SLA related details (summary) per job
+ */
 public class SLASummaryBean implements JsonBean {
 
     @Id
@@ -49,14 +53,17 @@ public class SLASummaryBean implements J
     private String user;
 
     @Basic
+    @Index
     @Column(name = "app_name")
     private String appName;
 
     @Basic
+    @Index
     @Column(name = "parent_id")
     private String parentId;
 
     @Basic
+    @Index
     @Column(name = "nominal_time")
     private Timestamp nominalTimeTS = null;
 
@@ -82,7 +89,7 @@ public class SLASummaryBean implements J
 
     @Basic
     @Column(name = "actual_duration")
-    private long actualDuration;
+    private long actualDuration = -1;
 
     @Basic
     @Column(name = "job_status")
@@ -96,6 +103,16 @@ public class SLASummaryBean implements J
     @Column(name = "sla_status")
     private String slaStatus;
 
+    @Basic
+    @Index
+    @Column(name = "sla_processed")
+    private byte slaProcessed = 0;
+
+    @Basic
+    @Index
+    @Column(name = "last_modified")
+    private Timestamp lastModifiedTS = null;
+
     public SLASummaryBean() {
     }
 
@@ -109,6 +126,8 @@ public class SLASummaryBean implements J
         setJobStatus(slaCalc.getJobStatus());
         setSLAStatus(slaCalc.getSLAStatus());
         setEventStatus(slaCalc.getEventStatus());
+        setSlaProcessed(slaCalc.getSlaProcessed());
+        setLastModifiedTime(slaCalc.getLastModifiedTime());
         setUser(reg.getUser());
         setParentId(reg.getParentId());
     }
@@ -226,6 +245,22 @@ public class SLASummaryBean implements J
         this.appName = appName;
     }
 
+    public byte getSlaProcessed() {
+        return slaProcessed;
+    }
+
+    public void setSlaProcessed(int slaProcessed) {
+        this.slaProcessed = (byte) slaProcessed;
+    }
+
+    public Date getLastModifiedTime() {
+        return DateUtils.toDate(lastModifiedTS);
+    }
+
+    public void setLastModifiedTime(Date lastModified) {
+        this.lastModifiedTS = DateUtils.convertDateToTimestamp(lastModified);
+    }
+
     @Override
     public JSONObject toJSONObject() {
         // TODO Auto-generated method stub

Modified: oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLACalculationJPAExecutor.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLACalculationJPAExecutor.java?rev=1487035&r1=1487034&r2=1487035&view=diff
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLACalculationJPAExecutor.java (original)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLACalculationJPAExecutor.java Tue May 28 18:44:17 2013
@@ -29,7 +29,6 @@ import org.apache.oozie.client.rest.Json
 import org.apache.oozie.command.SkipCommitFaultInjection;
 import org.apache.oozie.executor.jpa.JPAExecutorException;
 import org.apache.oozie.executor.jpa.sla.SLACalculationInsertUpdateJPAExecutor;
-import org.apache.oozie.executor.jpa.sla.SLACalculatorGetJPAExecutor;
 import org.apache.oozie.executor.jpa.sla.SLASummaryGetJPAExecutor;
 import org.apache.oozie.service.JPAService;
 import org.apache.oozie.service.Services;
@@ -39,7 +38,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 /**
- * Testcase to check db operations on tables SLA_CALCULATOR and SLA_SUMMARY
+ * Testcase to check db operations on SLA_SUMMARY table
  */
 public class TestSLACalculationJPAExecutor extends XDataTestCase {
     Services services;
@@ -73,7 +72,6 @@ public class TestSLACalculationJPAExecut
         assertNotNull(jpaService);
 
         String wfId = "workflow-1";
-        SLACalculatorBean bean1 = _createSLACalcBean(wfId, false, false);
 
         cal.setTime(new Date());
         cal.add(Calendar.DAY_OF_MONTH, -2);
@@ -84,33 +82,27 @@ public class TestSLACalculationJPAExecut
         cal.add(Calendar.DAY_OF_MONTH, 2);
         Date actEnd = cal.getTime();
         SLASummaryBean bean2 = _createSLASummaryBean(wfId, "RUNNING", EventStatus.START_MISS, expStart, expEnd, 1000,
-                actStart, actEnd, 2000);
+                actStart, actEnd, 2000, (byte) 1, actEnd);
 
         List<JsonBean> list = new ArrayList<JsonBean>();
-        list.add(bean1);
         list.add(bean2);
         SLACalculationInsertUpdateJPAExecutor writeCmd = new SLACalculationInsertUpdateJPAExecutor();
         writeCmd.setInsertList(list);
         jpaService.execute(writeCmd);
 
-        SLACalculatorGetJPAExecutor readCmd1 = new SLACalculatorGetJPAExecutor(wfId);
-        SLACalculatorBean scBean = jpaService.execute(readCmd1);
-        assertNotNull(scBean);
-        assertEquals(wfId, scBean.getJobId());
-        assertFalse(scBean.isStartProcessed());
-        assertFalse(scBean.isEndProcessed());
-
         SLASummaryGetJPAExecutor readCmd2 = new SLASummaryGetJPAExecutor(wfId);
-        SLASummaryBean ssBean = jpaService.execute(readCmd2);
-        assertEquals(wfId, ssBean.getJobId());
-        assertEquals("RUNNING", ssBean.getJobStatus());
-        assertEquals(EventStatus.START_MISS, ssBean.getEventStatus());
-        assertEquals(expStart, ssBean.getExpectedStart());
-        assertEquals(expEnd, ssBean.getExpectedEnd());
-        assertEquals(1000, ssBean.getExpectedDuration());
-        assertEquals(actStart, ssBean.getActualStart());
-        assertEquals(actEnd, ssBean.getActualEnd());
-        assertEquals(2000, ssBean.getActualDuration());
+        SLASummaryBean sBean = jpaService.execute(readCmd2);
+        assertEquals(wfId, sBean.getJobId());
+        assertEquals("RUNNING", sBean.getJobStatus());
+        assertEquals(EventStatus.START_MISS, sBean.getEventStatus());
+        assertEquals(expStart, sBean.getExpectedStart());
+        assertEquals(expEnd, sBean.getExpectedEnd());
+        assertEquals(1000, sBean.getExpectedDuration());
+        assertEquals(actStart, sBean.getActualStart());
+        assertEquals(actEnd, sBean.getActualEnd());
+        assertEquals(2000, sBean.getActualDuration());
+        assertEquals(1, sBean.getSlaProcessed());
+        assertEquals(actEnd, sBean.getLastModifiedTime());
 
     }
 
@@ -126,8 +118,6 @@ public class TestSLACalculationJPAExecut
 
         String wfId = "workflow-1";
         // initial insert
-        SLACalculatorBean bean1 = _createSLACalcBean(wfId, false, false);
-
         cal.setTime(new Date());
         cal.add(Calendar.DAY_OF_MONTH, -2);
         Date expStart = cal.getTime();
@@ -135,9 +125,8 @@ public class TestSLACalculationJPAExecut
         Date expEnd = cal.getTime();
         Date actStart = new Date();
         SLASummaryBean bean2 = _createSLASummaryBean(wfId, "RUNNING", EventStatus.START_MISS, expStart, expEnd, 1000,
-                actStart, null, 2000);
+                actStart, null, 2000, (byte) 0, actStart);
         List<JsonBean> list = new ArrayList<JsonBean>();
-        list.add(bean1);
         list.add(bean2);
         SLACalculationInsertUpdateJPAExecutor writeCmd = new SLACalculationInsertUpdateJPAExecutor();
         writeCmd.setInsertList(list);
@@ -145,34 +134,27 @@ public class TestSLACalculationJPAExecut
 
         // update existing record
         Date newDate = new Date();
-        bean1 = _createSLACalcBean(wfId, true, true);
         bean2 = _createSLASummaryBean(wfId, "RUNNING", EventStatus.DURATION_MISS, expStart, expEnd, 1000, actStart,
-                newDate, 2000);
+                newDate, 2000, (byte) 1, newDate);
         list = new ArrayList<JsonBean>();
-        list.add(bean1);
         list.add(bean2);
         writeCmd.setUpdateList(list);
         writeCmd.setInsertList(null);
         jpaService.execute(writeCmd);
 
-        SLACalculatorGetJPAExecutor readCmd1 = new SLACalculatorGetJPAExecutor(wfId);
-        SLACalculatorBean scBean = jpaService.execute(readCmd1);
-        assertNotNull(scBean);
-        assertEquals(wfId, scBean.getJobId());
-        assertTrue(scBean.isStartProcessed());
-        assertTrue(scBean.isEndProcessed());
-
         SLASummaryGetJPAExecutor readCmd2 = new SLASummaryGetJPAExecutor(wfId);
-        SLASummaryBean sdBean = jpaService.execute(readCmd2);
+        SLASummaryBean sBean = jpaService.execute(readCmd2);
         // check updated + original fields
-        assertEquals(wfId, sdBean.getJobId());
-        assertEquals(EventStatus.DURATION_MISS, sdBean.getEventStatus());
-        assertEquals(expStart, sdBean.getExpectedStart());
-        assertEquals(expEnd, sdBean.getExpectedEnd());
-        assertEquals(1000, sdBean.getExpectedDuration());
-        assertEquals(actStart, sdBean.getActualStart());
-        assertEquals(newDate, sdBean.getActualEnd());
-        assertEquals(2000, sdBean.getActualDuration());
+        assertEquals(wfId, sBean.getJobId());
+        assertEquals(EventStatus.DURATION_MISS, sBean.getEventStatus());
+        assertEquals(expStart, sBean.getExpectedStart());
+        assertEquals(expEnd, sBean.getExpectedEnd());
+        assertEquals(1000, sBean.getExpectedDuration());
+        assertEquals(actStart, sBean.getActualStart());
+        assertEquals(newDate, sBean.getActualEnd());
+        assertEquals(2000, sBean.getActualDuration());
+        assertEquals(1, sBean.getSlaProcessed());
+        assertEquals(newDate, sBean.getLastModifiedTime());
 
     }
 
@@ -189,31 +171,26 @@ public class TestSLACalculationJPAExecut
         String wfId1 = "workflow-1";
         String wfId2 = "workflow-2";
         // initial insert
-        SLACalculatorBean bean1 = _createSLACalcBean(wfId1, false, false);
-        SLASummaryBean bean2 = _createSLASummaryBean(wfId1, "RUNNING", EventStatus.START_MISS, new Date(), new Date(),
-                1000, null, null, 2000);
+        SLASummaryBean bean1 = _createSLASummaryBean(wfId1, "RUNNING", EventStatus.START_MISS, new Date(), new Date(),
+                1000, null, null, 2000, 0, null);
         List<JsonBean> list = new ArrayList<JsonBean>();
         list.add(bean1);
-        list.add(bean2);
         SLACalculationInsertUpdateJPAExecutor writeCmd = new SLACalculationInsertUpdateJPAExecutor(list, null);
         jpaService.execute(writeCmd);
 
         // update existing record and insert another
         Date newDate = new Date();
-        bean1 = _createSLACalcBean(wfId1, true, true);
-        bean2 = new SLASummaryBean();
-        bean2.setJobId(wfId1);
-        bean2.setActualEnd(newDate);
+        bean1 = new SLASummaryBean();
+        bean1.setJobId(wfId1);
+        bean1.setActualEnd(newDate);
+        bean1.setSlaProcessed(1);
         List<JsonBean> updateList = new ArrayList<JsonBean>();
         updateList.add(bean1);
-        updateList.add(bean2);
 
-        SLACalculatorBean bean3 = _createSLACalcBean(wfId2, false, false);
-        SLASummaryBean bean4 = _createSLASummaryBean(wfId2, "RUNNING", EventStatus.END_MISS, new Date(), new Date(),
-                1000, null, null, 2000);
+        SLASummaryBean bean2 = _createSLASummaryBean(wfId2, "RUNNING", EventStatus.END_MISS, new Date(), new Date(),
+                1000, null, null, 2000, 0, null);
         List<JsonBean> insertList = new ArrayList<JsonBean>();
-        insertList.add(bean3);
-        insertList.add(bean4);
+        insertList.add(bean2);
         writeCmd = new SLACalculationInsertUpdateJPAExecutor(insertList, updateList);
 
         // set fault injection to true, so transaction is roll backed
@@ -228,35 +205,25 @@ public class TestSLACalculationJPAExecut
         FaultInjection.deactivate("org.apache.oozie.command.SkipCommitFaultInjection");
 
         // Check whether transactions are rolled back or not
-        SLACalculatorGetJPAExecutor readCmd1 = new SLACalculatorGetJPAExecutor(wfId1);
-        SLACalculatorBean scBean = jpaService.execute(readCmd1);
-        // isStartProcessed should NOT be toggled to true
-        assertFalse(scBean.isStartProcessed());
-        SLASummaryGetJPAExecutor readCmd2 = new SLASummaryGetJPAExecutor(wfId1);
-        SLASummaryBean sdBean = jpaService.execute(readCmd2);
+        SLASummaryGetJPAExecutor readCmd = new SLASummaryGetJPAExecutor(wfId1);
+        SLASummaryBean sBean = jpaService.execute(readCmd);
+        // isSlaProcessed should NOT be changed to 1
+        assertFalse(sBean.getSlaProcessed() == 1);
         // actualEnd should be null as before
-        assertNull(sdBean.getActualEnd());
+        assertNull(sBean.getActualEnd());
 
-        readCmd1 = new SLACalculatorGetJPAExecutor(wfId2);
+        SLASummaryGetJPAExecutor readCmd1 = new SLASummaryGetJPAExecutor(wfId2);
         try {
-            scBean = jpaService.execute(readCmd1);
-            fail("Expected exception but didnt get any");
+            sBean = jpaService.execute(readCmd1);
+            fail("Expected not found exception but didnt get any");
         }
         catch (JPAExecutorException jpaee) {
             assertEquals(ErrorCode.E0603, jpaee.getErrorCode());
         }
     }
 
-    private SLACalculatorBean _createSLACalcBean(String jobId, boolean startProc, boolean endProc) {
-        SLACalculatorBean bean = new SLACalculatorBean();
-        bean.setJobId(jobId);
-        bean.setStartProcessed(startProc);
-        bean.setEndProcessed(endProc);
-        return bean;
-    }
-
     private SLASummaryBean _createSLASummaryBean(String jobId, String status, EventStatus slaType, Date eStart,
-            Date eEnd, long eDur, Date aStart, Date aEnd, long aDur) {
+            Date eEnd, long eDur, Date aStart, Date aEnd, long aDur, int slaProc, Date lastMod) {
         SLASummaryBean bean = new SLASummaryBean();
         bean.setJobId(jobId);
         bean.setJobStatus(status);
@@ -267,6 +234,9 @@ public class TestSLACalculationJPAExecut
         bean.setActualStart(aStart);
         bean.setActualEnd(aEnd);
         bean.setActualDuration(aDur);
+        bean.setSlaProcessed((byte) slaProc);
+        bean.setLastModifiedTime(lastMod);
         return bean;
     }
+
 }

Modified: oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAEventGeneration.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAEventGeneration.java?rev=1487035&r1=1487034&r2=1487035&view=diff
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAEventGeneration.java (original)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAEventGeneration.java Tue May 28 18:44:17 2013
@@ -177,7 +177,7 @@ public class TestSLAEventGeneration exte
         // test that sla processes the Job Event from Start command
         new StartXCommand(jobId).call();
         slaEvent = slas.getSLACalculator().get(jobId);
-        slaEvent.setStartProcessed(false); //resetting flag for testing sla event
+        slaEvent.setEventProcessed(0); //resetting to receive sla events
         ehs.new EventWorker().run();
         Thread.sleep(300); //time for event listeners to run
         slaEvent = (SLACalcStatus) ehs.getEventQueue().poll();
@@ -237,7 +237,7 @@ public class TestSLAEventGeneration exte
         String expectedEnd = DateUtils.formatDateOozieTZ(cal.getTime());
         String appName = "test-coord-sla";
 
-        // testing creation of new sla registration via Submit+Materialize
+        // testing creation of new sla registration via Submit + Materialize
         // command
         CoordSubmitXCommand sc = new CoordSubmitXCommand(conf, "UNIT_TESTING");
         String jobId = sc.call();
@@ -266,7 +266,7 @@ public class TestSLAEventGeneration exte
         jpa.execute(writeCmd);
         new CoordActionStartXCommand(actionId, getTestUser(), appName, "authtoken", jobId).call();
         slaEvent = slas.getSLACalculator().get(actionId);
-        slaEvent.setStartProcessed(false); //resetting flag for testing sla event
+        slaEvent.setEventProcessed(0); //resetting for testing sla event
         ehs.new EventWorker().run();
         Thread.sleep(300); //time for event listeners to run
         slaEvent = (SLACalcStatus) ehs.getEventQueue().poll();

Modified: oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAJobEventListener.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAJobEventListener.java?rev=1487035&r1=1487034&r2=1487035&view=diff
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAJobEventListener.java (original)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/sla/TestSLAJobEventListener.java Tue May 28 18:44:17 2013
@@ -30,7 +30,6 @@ import org.apache.oozie.event.Coordinato
 import org.apache.oozie.event.CoordinatorJobEvent;
 import org.apache.oozie.event.WorkflowActionEvent;
 import org.apache.oozie.event.WorkflowJobEvent;
-import org.apache.oozie.executor.jpa.sla.SLACalculatorGetJPAExecutor;
 import org.apache.oozie.executor.jpa.sla.SLASummaryGetJPAExecutor;
 import org.apache.oozie.service.EventHandlerService;
 import org.apache.oozie.service.JPAService;
@@ -89,8 +88,9 @@ public class TestSLAJobEventListener ext
         listener.onWorkflowJobEvent(wfe);
         SLACalcStatus serviceObj = slas.getSLACalculator().get("wf1");
         // check that start sla has been calculated
-        assertTrue(serviceObj.isStartProcessed());
         assertEquals(EventStatus.START_MISS, serviceObj.getEventStatus());
+        assertEquals(0, serviceObj.getSlaProcessed()); //Job switching to running is only partially
+                                                       //sla processed. so state = zero
 
         job = _createSLARegBean("wa1", AppType.WORKFLOW_ACTION);
         slas.addRegistrationEvent(job);
@@ -101,7 +101,6 @@ public class TestSLAJobEventListener ext
         listener.onWorkflowActionEvent(wae);
         serviceObj = slas.getSLACalculator().get("wa1");
         // check that start sla has been calculated
-        assertTrue(serviceObj.isStartProcessed());
         assertEquals(EventStatus.START_MISS, serviceObj.getEventStatus());
 
         job = _createSLARegBean("cj1", AppType.COORDINATOR_JOB);
@@ -114,10 +113,10 @@ public class TestSLAJobEventListener ext
         listener.onCoordinatorJobEvent(cje);
 
         // Since serviceObj is removed from memory after END stage
-        SLACalculatorBean calc = Services.get().get(JPAService.class).execute(new SLACalculatorGetJPAExecutor("cj1"));
         SLASummaryBean summary = Services.get().get(JPAService.class).execute(new SLASummaryGetJPAExecutor("cj1"));
         // check that end sla has been calculated
-        assertTrue(calc.isEndProcessed());
+        assertEquals(2, summary.getSlaProcessed()); //Job in terminal state has finished
+                                                    //sla processing. so state = 2
         assertEquals(EventStatus.END_MET, summary.getEventStatus());
 
         job = _createSLARegBean("ca1", AppType.COORDINATOR_ACTION);
@@ -127,10 +126,9 @@ public class TestSLAJobEventListener ext
         CoordinatorActionEvent cae = new CoordinatorActionEvent("ca1", "cj1", CoordinatorAction.Status.KILLED, "user1",
                 "coord-app-name1", null, actualEnd, null);
         listener.onCoordinatorActionEvent(cae);
-        calc = Services.get().get(JPAService.class).execute(new SLACalculatorGetJPAExecutor("ca1"));
         summary = Services.get().get(JPAService.class).execute(new SLASummaryGetJPAExecutor("ca1"));
         // check that start sla has been calculated
-        assertTrue(calc.isEndProcessed());
+        assertEquals(2, summary.getSlaProcessed());
         assertEquals(EventStatus.END_MISS, summary.getEventStatus());
 
     }

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=1487035&r1=1487034&r2=1487035&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 May 28 18:44:17 2013
@@ -102,14 +102,19 @@ public class TestSLAService extends XDat
         SLARegistrationBean sla2 = _createSLARegistration("job-3", AppType.COORDINATOR_JOB);
         sla2.setExpectedStart(new Date(System.currentTimeMillis() + 1 * 3600 * 1000)); //1 hour ahead only for testing
         sla2.setExpectedEnd(new Date(System.currentTimeMillis() - 2 * 3600 * 1000)); //2 hours back
+        sla2.setExpectedDuration(10); //to process duration too
         slas.addRegistrationEvent(sla2);
         assertEquals(3, slas.getSLACalculator().size());
-        slas.addStatusEvent(sla2.getJobId(), CoordinatorJob.Status.SUCCEEDED.name(), EventStatus.SUCCESS, new Date(),
+        Date startTime = new Date();
+        slas.addStatusEvent(sla2.getJobId(), CoordinatorJob.Status.RUNNING.name(), EventStatus.STARTED, startTime,
+                null);
+        slas.addStatusEvent(sla2.getJobId(), CoordinatorJob.Status.SUCCEEDED.name(), EventStatus.SUCCESS, startTime,
                 new Date());
         slas.runSLAWorker();
         ehs.new EventWorker().run();
         assertTrue(output.toString().contains(sla1.getJobId() + " Sla START - MET!!!"));
         assertTrue(output.toString().contains(sla2.getJobId() + " Sla END - MISS!!!"));
+        assertTrue(output.toString().contains(sla2.getJobId() + " Sla DURATION - MET!!!"));
         output.setLength(0);
 
         // test same job multiple events (start-miss, end-miss) through regular check
@@ -117,10 +122,8 @@ public class TestSLAService extends XDat
         sla2.setExpectedStart(new Date(System.currentTimeMillis() - 2 * 3600 * 1000)); //2 hours back
         sla2.setExpectedEnd(new Date(System.currentTimeMillis() - 1 * 3600 * 1000)); //1 hour back
         slas.addRegistrationEvent(sla2);
-        assertEquals(3, slas.getSLACalculator().size()); // remains same as before since
-                                                         // sla-END stage job is removed from map
+        assertEquals(3, slas.getSLACalculator().size()); // tests job slaProcessed == 7 removed from map
         slas.runSLAWorker();
-        assertEquals(2, ehs.getEventQueue().size());
         ehs.new EventWorker().run();
         System.out.println(output);
         assertTrue(output.toString().contains(sla2.getJobId() + " Sla START - MISS!!!"));
@@ -132,7 +135,7 @@ public class TestSLAService extends XDat
         sla1.setExpectedStart(new Date(System.currentTimeMillis() + 1 * 3600 * 1000)); //1 hour ahead
         sla1.setExpectedEnd(new Date(System.currentTimeMillis() + 2 * 3600 * 1000)); //2 hours ahead
         slas.addRegistrationEvent(sla1);
-        assertEquals(3, slas.getSLACalculator().size());
+        assertEquals(4, slas.getSLACalculator().size());
         slas.addStatusEvent(sla1.getJobId(), CoordinatorAction.Status.RUNNING.name(), EventStatus.STARTED, new Date(),
                 new Date());
         slas.addStatusEvent(sla1.getJobId(), CoordinatorAction.Status.SUCCEEDED.name(), EventStatus.SUCCESS,

Modified: oozie/trunk/core/src/test/java/org/apache/oozie/test/XTestCase.java
URL: http://svn.apache.org/viewvc/oozie/trunk/core/src/test/java/org/apache/oozie/test/XTestCase.java?rev=1487035&r1=1487034&r2=1487035&view=diff
==============================================================================
--- oozie/trunk/core/src/test/java/org/apache/oozie/test/XTestCase.java (original)
+++ oozie/trunk/core/src/test/java/org/apache/oozie/test/XTestCase.java Tue May 28 18:44:17 2013
@@ -65,7 +65,6 @@ import org.apache.oozie.service.Partitio
 import org.apache.oozie.service.ServiceException;
 import org.apache.oozie.service.Services;
 import org.apache.oozie.service.URIHandlerService;
-import org.apache.oozie.sla.SLACalculatorBean;
 import org.apache.oozie.sla.SLARegistrationBean;
 import org.apache.oozie.sla.SLASummaryBean;
 import org.apache.oozie.store.CoordinatorStore;
@@ -722,13 +721,6 @@ public abstract class XTestCase extends 
             entityManager.remove(w);
         }
 
-        q = entityManager.createQuery("select OBJECT(w) from SLACalculatorBean w");
-        List<SLACalculatorBean> scBeans = q.getResultList();
-        int scSize = scBeans.size();
-        for (SLACalculatorBean w : scBeans) {
-            entityManager.remove(w);
-        }
-
         q = entityManager.createQuery("select OBJECT(w) from SLASummaryBean w");
         List<SLASummaryBean> sdBeans = q.getResultList();
         int ssSize = sdBeans.size();
@@ -746,7 +738,6 @@ public abstract class XTestCase extends 
         log.info(baSize + " entries in BUNDLE_ACTIONS removed from DB!");
         log.info(slaSize + " entries in SLA_EVENTS removed from DB!");
         log.info(slaRegSize + " entries in SLA_REGISTRATION removed from DB!");
-        log.info(scSize + " entries in SLA_CALCULATOR removed from DB!");
         log.info(ssSize + " entries in SLA_SUMMARY removed from DB!");
 
     }

Modified: oozie/trunk/release-log.txt
URL: http://svn.apache.org/viewvc/oozie/trunk/release-log.txt?rev=1487035&r1=1487034&r2=1487035&view=diff
==============================================================================
--- oozie/trunk/release-log.txt (original)
+++ oozie/trunk/release-log.txt Tue May 28 18:44:17 2013
@@ -1,5 +1,6 @@
 -- Oozie 4.1.0 release (trunk - unreleased)
 
+OOZIE-1361 Remove SLACalculatorBean and add columns to SummaryBean indicating events processed and sla processed (mona)
 OOZIE-674 resolveInstanceRange doesn't work for EL extensions (shwethags via mona)
 OOZIE-1384 Make Uber Mode not the default (rkanter via virag)
 OOZIE-1386 NPE in XOozieClient if fs.default.name is not defined but fs.defaultFS is (wypoon via rkanter)

Modified: oozie/trunk/tools/src/main/java/org/apache/oozie/tools/OozieDBCLI.java
URL: http://svn.apache.org/viewvc/oozie/trunk/tools/src/main/java/org/apache/oozie/tools/OozieDBCLI.java?rev=1487035&r1=1487034&r2=1487035&view=diff
==============================================================================
--- oozie/trunk/tools/src/main/java/org/apache/oozie/tools/OozieDBCLI.java (original)
+++ oozie/trunk/tools/src/main/java/org/apache/oozie/tools/OozieDBCLI.java Tue May 28 18:44:17 2013
@@ -793,7 +793,6 @@ public class OozieDBCLI {
         args.add("org.apache.oozie.client.rest.JsonBundleJob");
         args.add("org.apache.oozie.BundleJobBean");
         args.add("org.apache.oozie.BundleActionBean");
-        args.add("org.apache.oozie.sla.SLACalculatorBean");
         args.add("org.apache.oozie.sla.SLASummaryBean");
         args.add("org.apache.oozie.util.db.ValidateConnectionBean");
         return args.toArray(new String[args.size()]);