You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sw...@apache.org on 2014/01/23 19:01:15 UTC
[2/2] git commit: AMBARI-4401. Schedule_request with failing batch
forever stays in state SCHEDULED. (swagle)
AMBARI-4401. Schedule_request with failing batch forever stays in state SCHEDULED. (swagle)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/cd25d7b6
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/cd25d7b6
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/cd25d7b6
Branch: refs/heads/trunk
Commit: cd25d7b6b79b0ecd5821226980c47c7fd5ccc8f8
Parents: 11de6a5
Author: Siddharth Wagle <sw...@hortonworks.com>
Authored: Thu Jan 23 09:56:07 2014 -0800
Committer: Siddharth Wagle <sw...@hortonworks.com>
Committed: Thu Jan 23 10:00:07 2014 -0800
----------------------------------------------------------------------
.../scheduler/AbstractLinearExecutionJob.java | 28 ++++++++++----
.../scheduler/ExecutionScheduleManagerTest.java | 40 ++++++++++++++++++++
.../state/scheduler/BatchRequestJobTest.java | 4 ++
3 files changed, 65 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/cd25d7b6/ambari-server/src/main/java/org/apache/ambari/server/scheduler/AbstractLinearExecutionJob.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/AbstractLinearExecutionJob.java b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/AbstractLinearExecutionJob.java
index 5dbe6e1..d4602a2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/AbstractLinearExecutionJob.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/AbstractLinearExecutionJob.java
@@ -73,6 +73,7 @@ public abstract class AbstractLinearExecutionJob implements ExecutionJob {
public void execute(JobExecutionContext context) throws JobExecutionException {
JobKey jobKey = context.getJobDetail().getKey();
LOG.debug("Executing linear job: " + jobKey);
+ JobDataMap jobDataMap = context.getMergedJobDataMap();
if (!executionScheduleManager.continueOnMisfire(context)) {
throw new JobExecutionException("Canceled execution based on misfire"
@@ -80,29 +81,43 @@ public abstract class AbstractLinearExecutionJob implements ExecutionJob {
+ ", scheduleTime = " + context.getScheduledFireTime());
}
- Map<String, Object> properties = context.getMergedJobDataMap()
- .getWrappedMap();
+ Map<String, Object> properties = jobDataMap.getWrappedMap();
+ boolean finalize = false;
// Perform work and exit if failure reported
try {
doWork(properties);
} catch (AmbariException e) {
- LOG.error("Exception caught on execution of job " + jobKey + ". Exiting linear chain...", e);
+ LOG.error("Exception caught on execution of job " + jobKey +
+ ". Exiting linear chain...", e);
+
+ finalize = true;
throw new JobExecutionException(e);
+
} catch (RuntimeException e) {
LOG.error("Unexpected exception caught on execution of job " + jobKey + ". " +
"Exiting linear chain...", e);
+
+ finalize = true;
throw e;
+
+ } finally {
+ // Finalize before exiting chain
+ if (finalize) {
+ try {
+ finalizeExecution(properties);
+ } catch (AmbariException e) {
+ LOG.warn("Unable to finalize execution for job: " + jobKey);
+ }
+ }
}
LOG.debug("Finished linear job: " + jobKey);
- JobDataMap jobDataMap = context.getMergedJobDataMap();
-
String nextJobName = jobDataMap.getString(NEXT_EXECUTION_JOB_NAME_KEY);
String nextJobGroup = jobDataMap.getString(NEXT_EXECUTION_JOB_GROUP_KEY);
- // If no more jobs left, update status and return
+ // If no more jobs left, finalize and return
if (nextJobName == null || nextJobName.isEmpty()) {
LOG.debug("End of linear job chain. Returning with success.");
try {
@@ -125,5 +140,4 @@ public abstract class AbstractLinearExecutionJob implements ExecutionJob {
executionScheduleManager.scheduleJob(trigger);
}
-
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/cd25d7b6/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
index 2f22d25..80c07c8 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionScheduleManagerTest.java
@@ -27,6 +27,7 @@ import com.google.inject.persist.PersistService;
import com.google.inject.persist.Transactional;
import com.google.inject.util.Modules;
import junit.framework.Assert;
+import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.actionmanager.ActionDBAccessor;
import org.apache.ambari.server.actionmanager.HostRoleCommand;
import org.apache.ambari.server.actionmanager.HostRoleStatus;
@@ -46,8 +47,10 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.quartz.CronTrigger;
+import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
@@ -578,4 +581,41 @@ public class ExecutionScheduleManagerTest {
executionSchedulerMock, scheduleManager, batchMock, batchRequestMock,
triggerMock, jobDetailMock, actionDBAccessorMock);
}
+
+ @Test
+ public void testFinalizeBeforeExit() throws Exception {
+ ExecutionScheduleManager scheduleManagerMock = createMock(ExecutionScheduleManager.class);
+ AbstractLinearExecutionJob executionJob =
+ createMockBuilder(AbstractLinearExecutionJob.class)
+ .addMockedMethods("finalizeExecution", "doWork")
+ .withConstructor(scheduleManagerMock)
+ .createMock();
+ JobExecutionContext context = createMock(JobExecutionContext.class);
+ JobDetail jobDetail = createMock(JobDetail.class);
+ JobDataMap jobDataMap = createMock(JobDataMap.class);
+
+ expect(context.getJobDetail()).andReturn(jobDetail).anyTimes();
+ expect(context.getMergedJobDataMap()).andReturn(jobDataMap).anyTimes();
+ expect(jobDetail.getKey()).andReturn(new JobKey("TestJob"));
+ expect(jobDataMap.getWrappedMap()).andReturn(new HashMap<String,Object>());
+ expect(scheduleManagerMock.continueOnMisfire(context)).andReturn(true);
+
+ executionJob.doWork((Map<String, Object>) anyObject());
+ expectLastCall().andThrow(new AmbariException("Test Exception")).anyTimes();
+
+ executionJob.finalizeExecution((Map<String, Object>) anyObject());
+ expectLastCall().once();
+
+ replay(scheduleManagerMock, executionJob, context, jobDataMap, jobDetail);
+
+ try {
+ executionJob.execute(context);
+ } catch (Exception ae) {
+ assertThat(ae, instanceOf(JobExecutionException.class));
+ JobExecutionException je = (JobExecutionException) ae;
+ Assert.assertEquals("Test Exception", je.getUnderlyingException().getMessage());
+ }
+
+ verify(scheduleManagerMock, executionJob, context, jobDataMap, jobDetail);
+ }
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/cd25d7b6/ambari-server/src/test/java/org/apache/ambari/server/state/scheduler/BatchRequestJobTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/scheduler/BatchRequestJobTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/scheduler/BatchRequestJobTest.java
index 9a45227..7ed183f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/scheduler/BatchRequestJobTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/scheduler/BatchRequestJobTest.java
@@ -18,12 +18,16 @@
package org.apache.ambari.server.state.scheduler;
+import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.actionmanager.HostRoleStatus;
+import org.apache.ambari.server.scheduler.AbstractLinearExecutionJob;
import org.apache.ambari.server.scheduler.ExecutionScheduleManager;
import org.easymock.Capture;
import org.junit.Assert;
import org.junit.Test;
+import org.quartz.JobExecutionContext;
+import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;