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/02/05 03:33:45 UTC

git commit: AMBARI-4527. Rolling Restart not working due to ntp changing server clock. (swagle)

Updated Branches:
  refs/heads/trunk 61618f73c -> 76c85a735


AMBARI-4527. Rolling Restart not working due to ntp changing server clock. (swagle)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/76c85a73
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/76c85a73
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/76c85a73

Branch: refs/heads/trunk
Commit: 76c85a73501e46f3d1a1315301fd2b78f7989de6
Parents: 61618f7
Author: Siddharth Wagle <sw...@hortonworks.com>
Authored: Tue Feb 4 18:33:29 2014 -0800
Committer: Siddharth Wagle <sw...@hortonworks.com>
Committed: Tue Feb 4 18:33:29 2014 -0800

----------------------------------------------------------------------
 .../scheduler/ExecutionScheduleManager.java     | 15 ++++++++---
 .../server/scheduler/ExecutionScheduler.java    |  6 +++++
 .../scheduler/ExecutionSchedulerImpl.java       | 20 ++++++++++++++-
 .../scheduler/ExecutionSchedulerTest.java       | 27 +++++++++++++++++++-
 4 files changed, 62 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/76c85a73/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
index d6d0439..ef8dc9d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduleManager.java
@@ -137,8 +137,7 @@ public class ExecutionScheduleManager {
   public void start() {
     LOG.info("Starting scheduler");
     try {
-      executionScheduler.startScheduler(configuration
-        .getExecutionSchedulerStartDelay());
+      executionScheduler.startScheduler(configuration.getExecutionSchedulerStartDelay());
       schedulerAvailable = true;
 
     } catch (AmbariException e) {
@@ -215,6 +214,16 @@ public class ExecutionScheduleManager {
       throw new AmbariException("Scheduler unavailable.");
     }
 
+    // Check if scheduler is running, if not start immediately before scheduling jobs
+    try {
+      if (!executionScheduler.isSchedulerStarted()) {
+        executionScheduler.startScheduler(null);
+      }
+    } catch (SchedulerException e) {
+      LOG.error("Unable to determine scheduler state.", e);
+      throw new AmbariException("Scheduler unavailable.");
+    }
+
     // Create and persist jobs based on batches
     JobDetail firstJobDetail = persistBatch(requestExecution);
 
@@ -253,8 +262,6 @@ public class ExecutionScheduleManager {
           .endAt(endDate)
           .build();
 
-
-
       try {
         executionScheduler.scheduleJob(trigger);
         LOG.debug("Scheduled trigger next fire time: " + trigger.getNextFireTime());

http://git-wip-us.apache.org/repos/asf/ambari/blob/76c85a73/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduler.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduler.java b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduler.java
index f75eb94..b25da81 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduler.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionScheduler.java
@@ -79,4 +79,10 @@ public interface ExecutionScheduler {
    */
   public List<? extends Trigger> getTriggersForJob(JobKey jobKey)
     throws SchedulerException;
+
+  /**
+   * Check whether the scheduler is already running.
+   * @return
+   */
+  public boolean isSchedulerStarted() throws SchedulerException;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/76c85a73/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionSchedulerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionSchedulerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionSchedulerImpl.java
index 488564f..324ee27 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionSchedulerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/scheduler/ExecutionSchedulerImpl.java
@@ -162,7 +162,20 @@ public class ExecutionSchedulerImpl implements ExecutionScheduler {
       throw new AmbariException(msg);
     }
     try {
-      scheduler.startDelayed(delay != null ? delay : 0);
+      if (!scheduler.isStarted()) {
+        // To avoid issue created due to change in server clock in between the
+        // scheduler initialization and scheduler start,
+        // start immediately if no delay provided.
+        if (delay != null) {
+          scheduler.startDelayed(delay);
+        } else {
+          scheduler.start();
+        }
+
+      } else {
+        LOG.info("Scheduler " + scheduler.getSchedulerInstanceId() +
+          " already started. Skipping start.");
+      }
     } catch (SchedulerException e) {
       LOG.error("Failed to start scheduler", e);
       throw new AmbariException(e.getMessage());
@@ -207,4 +220,9 @@ public class ExecutionSchedulerImpl implements ExecutionScheduler {
     return scheduler.getTriggersOfJob(jobKey);
   }
 
+  @Override
+  public boolean isSchedulerStarted() throws SchedulerException {
+    return scheduler.isStarted();
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/76c85a73/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionSchedulerTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionSchedulerTest.java b/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionSchedulerTest.java
index 89c8d26..366171b 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionSchedulerTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/scheduler/ExecutionSchedulerTest.java
@@ -39,7 +39,6 @@ import static org.powermock.api.easymock.PowerMock.expectNew;
 import static org.powermock.api.easymock.PowerMock.expectPrivate;
 
 @RunWith(PowerMockRunner.class)
-@PrepareForTest({ ExecutionSchedulerImpl.class })
 @PowerMockIgnore("javax.management.*")
 public class ExecutionSchedulerTest {
 
@@ -65,6 +64,7 @@ public class ExecutionSchedulerTest {
   }
 
   @Test
+  @PrepareForTest({ ExecutionSchedulerImpl.class })
   public void testSchedulerInitialize() throws Exception {
 
     ExecutionSchedulerImpl executionScheduler =
@@ -87,6 +87,7 @@ public class ExecutionSchedulerTest {
   }
 
   @Test
+  @PrepareForTest({ ExecutionSchedulerImpl.class })
   public void testSchedulerStartStop() throws Exception {
     StdSchedulerFactory factory = createNiceMock(StdSchedulerFactory.class);
     Scheduler scheduler = createNiceMock(Scheduler.class);
@@ -144,4 +145,28 @@ public class ExecutionSchedulerTest {
     Assert.assertEquals("org.quartz.impl.jdbcjobstore.oracle.OracleDelegate", subProps[0]);
     Assert.assertEquals("select 0 from dual", subProps[1]);
   }
+
+  @Test
+  @PrepareForTest({ ExecutionSchedulerImpl.class })
+  public void testSchedulerStartDelay() throws Exception {
+    StdSchedulerFactory factory = createNiceMock(StdSchedulerFactory.class);
+    Scheduler scheduler = createNiceMock(Scheduler.class);
+
+    expect(factory.getScheduler()).andReturn(scheduler).anyTimes();
+    expectNew(StdSchedulerFactory.class).andReturn(factory);
+    expect(scheduler.isStarted()).andReturn(false).anyTimes();
+    expectPrivate(scheduler, "startDelayed", new Integer(180)).once();
+    expectPrivate(scheduler, "start").once();
+
+    PowerMock.replay(factory, StdSchedulerFactory.class, scheduler);
+
+    ExecutionSchedulerImpl executionScheduler = new ExecutionSchedulerImpl(configuration);
+
+    executionScheduler.startScheduler(180);
+    executionScheduler.startScheduler(null);
+
+    PowerMock.verify(factory, StdSchedulerFactory.class, scheduler);
+
+    Assert.assertTrue(executionScheduler.isInitialized());
+  }
 }