You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by mp...@apache.org on 2014/01/16 22:46:03 UTC

git commit: AMBARI-4322. Add relationship from Request to Request Schedule. (mpapirkovskyy)

Updated Branches:
  refs/heads/trunk ca4147f89 -> e056203a2


AMBARI-4322. Add relationship from Request to Request Schedule. (mpapirkovskyy)


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

Branch: refs/heads/trunk
Commit: e056203a263e20f39fa46fc1aaaf2a86a5328072
Parents: ca4147f
Author: Myroslav Papirkovskyy <mp...@hortonworks.com>
Authored: Thu Jan 16 23:43:45 2014 +0200
Committer: mpapirkovskyy <mp...@hortonworks.com>
Committed: Thu Jan 16 23:45:53 2014 +0200

----------------------------------------------------------------------
 .../server/actionmanager/ActionDBAccessor.java  |  6 ++
 .../actionmanager/ActionDBAccessorImpl.java     | 29 +++++++
 .../ambari/server/actionmanager/Request.java    | 11 +++
 .../resources/RequestResourceDefinition.java    | 32 +++++++-
 .../server/controller/ControllerModule.java     | 36 +++++----
 .../internal/RequestResourceProvider.java       |  5 +-
 .../server/orm/JPATableGenerationStrategy.java  |  2 +
 .../server/orm/entities/RequestEntity.java      | 24 ++++++
 .../orm/entities/RequestScheduleEntity.java     | 12 +++
 .../scheduler/AbstractLinearExecutionJob.java   |  6 +-
 .../scheduler/ExecutionScheduleManager.java     | 12 ++-
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |  3 +-
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql |  7 +-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |  5 +-
 .../Ambari-DDL-Postgres-REMOTE-CREATE.sql       | 79 ++++++++++----------
 .../src/main/resources/properties.json          |  2 +
 .../scheduler/ExecutionScheduleManagerTest.java | 31 +++++---
 17 files changed, 222 insertions(+), 80 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java
index ac36bc6..c29f6f1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessor.java
@@ -69,6 +69,12 @@ public interface ActionDBAccessor {
   void endRequest(long requestId);
 
   /**
+   * Updates request with link to source schedule
+   */
+  @Transactional
+  void setSourceScheduleForRequest(long requestId, long scheduleId);
+
+  /**
    * For the given host, update all the tasks based on the command report
    */
   public void updateHostRoleState(String hostname, long requestId,

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
index a75848c..bc7ea8f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/ActionDBAccessorImpl.java
@@ -63,6 +63,8 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
   HostRoleCommandFactory hostRoleCommandFactory;
   @Inject
   Clusters clusters;
+  @Inject
+  RequestScheduleDAO requestScheduleDAO;
 
 
 
@@ -257,6 +259,33 @@ public class ActionDBAccessorImpl implements ActionDBAccessor {
 
   @Override
   @Transactional
+  public void setSourceScheduleForRequest(long requestId, long scheduleId) {
+    RequestEntity requestEntity = requestDAO.findByPK(requestId);
+    if (requestEntity != null) {
+      RequestScheduleEntity scheduleEntity = requestScheduleDAO.findById(scheduleId);
+      if (scheduleEntity != null) {
+        requestEntity.setRequestScheduleEntity(scheduleEntity);
+        //we may want to break entity graph here for perf purposes (when list size is too large)
+        scheduleEntity.getRequestEntities().add(requestEntity);
+
+        requestDAO.merge(requestEntity);
+        requestScheduleDAO.merge(scheduleEntity);
+
+      } else {
+        String message = String.format("Request Schedule with id=%s not found", scheduleId);
+        LOG.error(message);
+        throw new RuntimeException(message);
+      }
+
+    } else {
+      String message = String.format("Request with id=%s not found", scheduleId);
+      LOG.error(message);
+      throw new RuntimeException(message);
+    }
+  }
+
+  @Override
+  @Transactional
   public void updateHostRoleState(String hostname, long requestId,
                                   long stageId, String role, CommandReport report) {
     if (LOG.isDebugEnabled()) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Request.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Request.java b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Request.java
index 35f6864..e4de0cb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Request.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/actionmanager/Request.java
@@ -39,6 +39,7 @@ public class Request {
   private final long requestId;
   private final long clusterId;
   private final String clusterName;
+  private Long requestScheduleId;
   private String commandName;
   private String requestContext;
   private long createTime;
@@ -141,6 +142,7 @@ public class Request {
     this.targetHosts = entity.getTargetHosts();
     this.requestType = entity.getRequestType();
     this.commandName = entity.getCommandName();
+    this.requestScheduleId = entity.getRequestScheduleEntity().getScheduleId();
 
     for (StageEntity stageEntity : entity.getStages()) {
       Stage stage = stageFactory.createExisting(stageEntity);
@@ -174,6 +176,7 @@ public class Request {
     requestEntity.setTargetComponent(targetComponent);
     requestEntity.setTargetHosts(targetHosts);
     requestEntity.setRequestType(requestType);
+    requestEntity.setRequestScheduleId(requestScheduleId);
     //TODO set all fields
 
     return requestEntity;
@@ -264,6 +267,14 @@ public class Request {
     this.commandName = commandName;
   }
 
+  public Long getRequestScheduleId() {
+    return requestScheduleId;
+  }
+
+  public void setRequestScheduleId(Long requestScheduleId) {
+    this.requestScheduleId = requestScheduleId;
+  }
+
   public List<HostRoleCommand> getCommands() {
     List<HostRoleCommand> commands = new ArrayList<HostRoleCommand>();
     for (Stage stage : stages) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RequestResourceDefinition.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RequestResourceDefinition.java b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RequestResourceDefinition.java
index a870c5e..474bf56 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RequestResourceDefinition.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/RequestResourceDefinition.java
@@ -21,11 +21,11 @@ package org.apache.ambari.server.api.resources;
 
 import org.apache.ambari.server.api.services.Request;
 import org.apache.ambari.server.api.util.TreeNode;
+import org.apache.ambari.server.controller.internal.RepositoryResourceProvider;
+import org.apache.ambari.server.controller.internal.RequestResourceProvider;
 import org.apache.ambari.server.controller.spi.Resource;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 
 
 /**
@@ -57,7 +57,7 @@ public class RequestResourceDefinition extends BaseResourceDefinition {
 
   @Override
   public List<PostProcessor> getPostProcessors() {
-    return Collections.<PostProcessor>singletonList(new RequestHrefPostProcessor());
+    return Arrays.asList(new RequestHrefPostProcessor(), new RequestSourceScheduleHrefPostProcessor());
   }
 
   private class RequestHrefPostProcessor implements PostProcessor {
@@ -83,4 +83,28 @@ public class RequestResourceDefinition extends BaseResourceDefinition {
       resultNode.setProperty("href", sb.toString());
     }
   }
+
+  private class RequestSourceScheduleHrefPostProcessor implements PostProcessor {
+
+    @Override
+    public void process(Request request, TreeNode<Resource> resultNode, String href) {
+      StringBuilder sb = new StringBuilder();
+      String[] toks = href.split("/");
+
+      for (int i = 0; i < toks.length; ++i) {
+        String s = toks[i];
+        sb.append(s).append('/');
+        if ("clusters".equals(s)) {
+          sb.append(toks[i + 1]).append('/');
+          break;
+        }
+      }
+
+      Object scheduleId = resultNode.getObject().getPropertyValue(RequestResourceProvider.REQUEST_SOURCE_SCHEDULE_ID);
+      if (scheduleId != null) {
+        sb.append("request_schedules/").append(scheduleId);
+        resultNode.getObject().setProperty(RequestResourceProvider.REQUEST_SOURCE_SCHEDULE_HREF, sb.toString());
+      }
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
index 5bff07e..7aa39a8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
@@ -71,6 +71,8 @@ import com.google.inject.assistedinject.FactoryModuleBuilder;
 import com.google.inject.name.Names;
 import com.google.inject.persist.jpa.JpaPersistModule;
 
+import static org.eclipse.persistence.config.PersistenceUnitProperties.*;
+
 /**
  * Used for injection purposes.
  */
@@ -149,40 +151,44 @@ public class ControllerModule extends AbstractModule {
 
     switch (persistenceType) {
       case IN_MEMORY:
-        properties.put("javax.persistence.jdbc.url", Configuration.JDBC_IN_MEMORY_URL);
-        properties.put("javax.persistence.jdbc.driver", Configuration.JDBC_IN_MEMROY_DRIVER);
-        properties.put("eclipselink.ddl-generation", "drop-and-create-tables");
-        properties.put("eclipselink.orm.throw.exceptions", "true");
+        properties.setProperty(JDBC_URL, Configuration.JDBC_IN_MEMORY_URL);
+        properties.setProperty(JDBC_DRIVER, Configuration.JDBC_IN_MEMROY_DRIVER);
+        properties.setProperty(DDL_GENERATION, DROP_AND_CREATE);
+        properties.setProperty(THROW_EXCEPTIONS, "true");
         jpaPersistModule.properties(properties);
         return jpaPersistModule;
       case REMOTE:
-        properties.put("javax.persistence.jdbc.url", configuration.getDatabaseUrl());
-        properties.put("javax.persistence.jdbc.driver", configuration.getDatabaseDriver());
+        properties.setProperty(JDBC_URL, configuration.getDatabaseUrl());
+        properties.setProperty(JDBC_DRIVER, configuration.getDatabaseDriver());
         break;
       case LOCAL:
-        properties.put("javax.persistence.jdbc.url", configuration.getLocalDatabaseUrl());
-        properties.put("javax.persistence.jdbc.driver", Configuration.JDBC_LOCAL_DRIVER);
+        properties.setProperty(JDBC_URL, configuration.getLocalDatabaseUrl());
+        properties.setProperty(JDBC_DRIVER, Configuration.JDBC_LOCAL_DRIVER);
         break;
     }
 
-    properties.setProperty("javax.persistence.jdbc.user", configuration.getDatabaseUser());
-    properties.setProperty("javax.persistence.jdbc.password", configuration.getDatabasePassword());
+    properties.setProperty(JDBC_USER, configuration.getDatabaseUser());
+    properties.setProperty(JDBC_PASSWORD, configuration.getDatabasePassword());
 
     switch (configuration.getJPATableGenerationStrategy()) {
       case CREATE:
-        properties.setProperty("eclipselink.ddl-generation", "create-tables");
+        properties.setProperty(DDL_GENERATION, CREATE_ONLY);
         dbInitNeeded = true;
         break;
       case DROP_AND_CREATE:
-        properties.setProperty("eclipselink.ddl-generation", "drop-and-create-tables");
+        properties.setProperty(DDL_GENERATION, DROP_AND_CREATE);
         dbInitNeeded = true;
         break;
+      case CREATE_OR_EXTEND:
+        properties.setProperty(DDL_GENERATION, CREATE_OR_EXTEND);
+        break;
       default:
         break;
     }
-    properties.setProperty("eclipselink.ddl-generation.output-mode", "both");
-    properties.setProperty("eclipselink.create-ddl-jdbc-file-name", "DDL-create.jdbc");
-    properties.setProperty("eclipselink.drop-ddl-jdbc-file-name", "DDL-drop.jdbc");
+
+    properties.setProperty(DDL_GENERATION_MODE, DDL_BOTH_GENERATION);
+    properties.setProperty(CREATE_JDBC_DDL_FILE, "DDL-create.jdbc");
+    properties.setProperty(DROP_JDBC_DDL_FILE, "DDL-drop.jdbc");
 
     jpaPersistModule.properties(properties);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
index fef258b..d96e841 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
@@ -48,7 +48,7 @@ import java.util.Set;
 /**
  * Resource provider for request resources.
  */
-class RequestResourceProvider extends AbstractControllerResourceProvider {
+public class RequestResourceProvider extends AbstractControllerResourceProvider {
 
   // ----- Property ID constants ---------------------------------------------
   // Requests
@@ -56,6 +56,8 @@ class RequestResourceProvider extends AbstractControllerResourceProvider {
   protected static final String REQUEST_ID_PROPERTY_ID = "Requests/id";
   protected static final String REQUEST_STATUS_PROPERTY_ID = "Requests/request_status";
   protected static final String REQUEST_CONTEXT_ID = "Requests/request_context";
+  public static final String REQUEST_SOURCE_SCHEDULE_HREF = "Requests/source_schedule_href";
+  public static final String REQUEST_SOURCE_SCHEDULE_ID = "Requests/source_schedule_id";
   protected static final String REQUEST_TYPE_ID = "Requests/type";
   protected static final String REQUEST_INPUTS_ID = "Requests/inputs";
   protected static final String REQUEST_TARGET_SERVICE_ID = "Requests/target_service";
@@ -288,6 +290,7 @@ class RequestResourceProvider extends AbstractControllerResourceProvider {
     setResourceProperty(resource, REQUEST_CREATE_TIME_ID, request.getCreateTime(), requestedPropertyIds);
     setResourceProperty(resource, REQUEST_START_TIME_ID, request.getStartTime(), requestedPropertyIds);
     setResourceProperty(resource, REQUEST_END_TIME_ID, request.getEndTime(), requestedPropertyIds);
+    setResourceProperty(resource, REQUEST_SOURCE_SCHEDULE_ID, request.getRequestScheduleId(), requestedPropertyIds);
 
     List<HostRoleCommand> commands = request.getCommands();
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/java/org/apache/ambari/server/orm/JPATableGenerationStrategy.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/JPATableGenerationStrategy.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/JPATableGenerationStrategy.java
index 4e88fb2..9316c10 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/JPATableGenerationStrategy.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/JPATableGenerationStrategy.java
@@ -21,6 +21,8 @@ package org.apache.ambari.server.orm;
 public enum JPATableGenerationStrategy {
   //create tables which don't exist
   CREATE("create"),
+  //creates tables which not exist, add missing columns
+  CREATE_OR_EXTEND("createOrExtend"),
   //drop and create all tables
   DROP_AND_CREATE("dropAndCreate"),
   //don't create tables

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RequestEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RequestEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RequestEntity.java
index c8d7fb7..1fe763b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RequestEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RequestEntity.java
@@ -35,6 +35,10 @@ public class RequestEntity {
   @Basic
   private Long clusterId;
 
+  @Column(name = "request_schedule_id", updatable = false, insertable = false, nullable = true)
+  @Basic
+  private Long requestScheduleId;
+
   @Column(name = "request_context")
   @Basic
   private String requestContext;
@@ -85,6 +89,10 @@ public class RequestEntity {
   @JoinColumn(name = "cluster_id", referencedColumnName = "cluster_id")
   private ClusterEntity cluster;
 
+  @ManyToOne(cascade = {CascadeType.MERGE})
+  @JoinColumn(name = "request_schedule_id", referencedColumnName = "schedule_id")
+  private RequestScheduleEntity requestScheduleEntity;
+
   public Long getRequestId() {
     return requestId;
   }
@@ -205,6 +213,22 @@ public class RequestEntity {
     this.status = status;
   }
 
+  public RequestScheduleEntity getRequestScheduleEntity() {
+    return requestScheduleEntity;
+  }
+
+  public void setRequestScheduleEntity(RequestScheduleEntity requestScheduleEntity) {
+    this.requestScheduleEntity = requestScheduleEntity;
+  }
+
+  public Long getRequestScheduleId() {
+    return requestScheduleId;
+  }
+
+  public void setRequestScheduleId(Long scheduleId) {
+    this.requestScheduleId = scheduleId;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RequestScheduleEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RequestScheduleEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RequestScheduleEntity.java
index 67731f2..60df7b4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RequestScheduleEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/RequestScheduleEntity.java
@@ -31,6 +31,7 @@ import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.persistence.TableGenerator;
 import java.util.Collection;
+import java.util.List;
 
 @Table(name = "requestschedule")
 @Entity
@@ -116,6 +117,9 @@ public class RequestScheduleEntity {
   private Collection<RequestScheduleBatchRequestEntity>
     requestScheduleBatchRequestEntities;
 
+  @OneToMany(mappedBy = "requestScheduleEntity")
+  private List<RequestEntity> requestEntities;
+
   public long getScheduleId() {
     return scheduleId;
   }
@@ -285,6 +289,14 @@ public class RequestScheduleEntity {
     this.requestScheduleBatchRequestEntities = requestScheduleBatchRequestEntities;
   }
 
+  public List<RequestEntity> getRequestEntities() {
+    return requestEntities;
+  }
+
+  public void setRequestEntities(List<RequestEntity> requestEntities) {
+    this.requestEntities = requestEntities;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/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 73d81bc..5dbe6e1 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
@@ -87,8 +87,12 @@ public abstract class AbstractLinearExecutionJob implements ExecutionJob {
     try {
       doWork(properties);
     } catch (AmbariException e) {
-      LOG.error("Exception caught on job execution. Exiting linear chain...", e);
+      LOG.error("Exception caught on execution of job " + jobKey + ". Exiting linear chain...", e);
       throw new JobExecutionException(e);
+    } catch (RuntimeException e) {
+      LOG.error("Unexpected exception caught on execution of job " + jobKey + ". " +
+          "Exiting linear chain...", e);
+      throw e;
     }
 
     LOG.debug("Finished linear job: " + jobKey);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/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 268b4b4..a3bae50 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
@@ -26,6 +26,7 @@ import com.sun.jersey.api.client.*;
 import com.sun.jersey.api.client.filter.ClientFilter;
 import com.sun.jersey.api.client.filter.CsrfProtectionFilter;
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.actionmanager.ActionDBAccessor;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.security.authorization.internal.InternalTokenClientFilter;
@@ -67,6 +68,7 @@ public class ExecutionScheduleManager {
     (ExecutionScheduleManager.class);
 
   private final InternalTokenStorage tokenStorage;
+  private ActionDBAccessor actionDBAccessor;
   private final Gson gson;
   private final Clusters clusters;
   ExecutionScheduler executionScheduler;
@@ -93,11 +95,13 @@ public class ExecutionScheduleManager {
                                   ExecutionScheduler executionScheduler,
                                   InternalTokenStorage tokenStorage,
                                   Clusters clusters,
+                                  ActionDBAccessor actionDBAccessor,
                                   Gson gson) {
     this.configuration = configuration;
     this.executionScheduler = executionScheduler;
     this.tokenStorage = tokenStorage;
     this.clusters = clusters;
+    this.actionDBAccessor = actionDBAccessor;
     this.gson = gson;
 
     buildApiClient();
@@ -432,8 +436,8 @@ public class ExecutionScheduleManager {
    * @return request id
    * @throws AmbariException
    */
-  public Long executeBatchRequest(Long executionId,
-                                  Long batchId,
+  public Long executeBatchRequest(long executionId,
+                                  long batchId,
                                   String clusterName) throws AmbariException {
 
     String type = null;
@@ -452,6 +456,10 @@ public class ExecutionScheduleManager {
 
       updateBatchRequest(executionId, batchId, clusterName, batchRequestResponse, false);
 
+      if (batchRequestResponse.getRequestId() != null) {
+        actionDBAccessor.setSourceScheduleForRequest(batchRequestResponse.getRequestId(), executionId);
+      }
+
       return batchRequestResponse.getRequestId();
     } catch (Exception e) {
       throw new AmbariException("Exception occurred while performing request", e);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
index 812bba0..561ac73 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -42,7 +42,7 @@ CREATE TABLE execution_command (task_id BIGINT NOT NULL, command LONGBLOB, PRIMA
 CREATE TABLE host_role_command (task_id BIGINT NOT NULL, attempt_count SMALLINT NOT NULL, event LONGTEXT NOT NULL, exitcode INTEGER NOT NULL, host_name VARCHAR(255) NOT NULL, last_attempt_time BIGINT NOT NULL, request_id BIGINT NOT NULL, role VARCHAR(255), role_command VARCHAR(255), stage_id BIGINT NOT NULL, start_time BIGINT NOT NULL, end_time BIGINT, status VARCHAR(255), std_error LONGBLOB, std_out LONGBLOB, structured_out LONGBLOB, PRIMARY KEY (task_id));
 CREATE TABLE role_success_criteria (role VARCHAR(255) NOT NULL, request_id BIGINT NOT NULL, stage_id BIGINT NOT NULL, success_factor DOUBLE NOT NULL, PRIMARY KEY (role, request_id, stage_id));
 CREATE TABLE stage (stage_id BIGINT NOT NULL, request_id BIGINT NOT NULL, cluster_id BIGINT, log_info VARCHAR(255) NOT NULL, request_context VARCHAR(255), cluster_host_info LONGBLOB, PRIMARY KEY (stage_id, request_id));
-CREATE TABLE request (request_id BIGINT NOT NULL, cluster_id BIGINT, command_name VARCHAR(255), create_time BIGINT NOT NULL, end_time BIGINT NOT NULL, inputs LONGTEXT, request_context VARCHAR(255), request_type VARCHAR(255), start_time BIGINT NOT NULL, status VARCHAR(255), target_component VARCHAR(255), target_hosts LONGTEXT, target_service VARCHAR(255), PRIMARY KEY (request_id));
+CREATE TABLE request (request_id BIGINT NOT NULL, cluster_id BIGINT, request_schedule_id BIGINT, command_name VARCHAR(255), create_time BIGINT NOT NULL, end_time BIGINT NOT NULL, inputs LONGTEXT, request_context VARCHAR(255), request_type VARCHAR(255), start_time BIGINT NOT NULL, status VARCHAR(255), target_component VARCHAR(255), target_hosts LONGTEXT, target_service VARCHAR(255), PRIMARY KEY (request_id));
 CREATE TABLE key_value_store (`key` VARCHAR(255), `value` LONGTEXT, PRIMARY KEY (`key`));
 CREATE TABLE clusterconfigmapping (type_name VARCHAR(255) NOT NULL, create_timestamp BIGINT NOT NULL, cluster_id BIGINT NOT NULL, selected INTEGER NOT NULL DEFAULT 0, version_tag VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL DEFAULT '_db', PRIMARY KEY (type_name, create_timestamp, cluster_id));
 CREATE TABLE hostconfigmapping (create_timestamp BIGINT NOT NULL, host_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, type_name VARCHAR(255) NOT NULL, selected INTEGER NOT NULL DEFAULT 0, service_name VARCHAR(255), version_tag VARCHAR(255) NOT NULL, user_name VARCHAR(255) NOT NULL DEFAULT '_db', PRIMARY KEY (create_timestamp, host_name, cluster_id, type_name));
@@ -75,6 +75,7 @@ ALTER TABLE role_success_criteria ADD CONSTRAINT FK_role_success_criteria_stage_
 ALTER TABLE stage ADD CONSTRAINT FK_stage_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
 ALTER TABLE stage ADD CONSTRAINT FK_stage_request_id FOREIGN KEY (request_id) REFERENCES request (request_id);
 ALTER TABLE request ADD CONSTRAINT FK_request_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
+ALTER TABLE request ADD CONSTRAINT FK_request_schedule_id FOREIGN KEY (request_schedule_id) REFERENCES requestschedule (schedule_id);
 ALTER TABLE clusterconfigmapping ADD CONSTRAINT FK_clusterconfigmapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
 ALTER TABLE hostconfigmapping ADD CONSTRAINT FK_hostconfigmapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
 ALTER TABLE hostconfigmapping ADD CONSTRAINT FK_hostconfigmapping_host_name FOREIGN KEY (host_name) REFERENCES hosts (host_name);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
index 4be3a42..5aa356a 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@ -32,7 +32,7 @@ CREATE TABLE execution_command (task_id NUMBER(19) NOT NULL, command BLOB NULL,
 CREATE TABLE host_role_command (task_id NUMBER(19) NOT NULL, attempt_count NUMBER(5) NOT NULL, event CLOB NULL, exitcode NUMBER(10) NOT NULL, host_name VARCHAR2(255) NOT NULL, last_attempt_time NUMBER(19) NOT NULL, request_id NUMBER(19) NOT NULL, role VARCHAR2(255) NULL, role_command VARCHAR2(255) NULL, stage_id NUMBER(19) NOT NULL, start_time NUMBER(19) NOT NULL, end_time NUMBER(19), status VARCHAR2(255) NULL, std_error BLOB NULL, std_out BLOB NULL, structured_out BLOB NULL, PRIMARY KEY (task_id));
 CREATE TABLE role_success_criteria (role VARCHAR2(255) NOT NULL, request_id NUMBER(19) NOT NULL, stage_id NUMBER(19) NOT NULL, success_factor NUMBER(19,4) NOT NULL, PRIMARY KEY (role, request_id, stage_id));
 CREATE TABLE stage (stage_id NUMBER(19) NOT NULL, request_id NUMBER(19) NOT NULL, cluster_id NUMBER(19) NULL, log_info VARCHAR2(255) NULL, request_context VARCHAR2(255) NULL, cluster_host_info BLOB NOT NULL, PRIMARY KEY (stage_id, request_id));
-CREATE TABLE request (request_id NUMBER(19) NOT NULL, cluster_id NUMBER(19), command_name VARCHAR(255), create_time NUMBER(19) NOT NULL, end_time NUMBER(19) NOT NULL, inputs CLOB, request_context VARCHAR(255), request_type VARCHAR(255), start_time NUMBER(19) NOT NULL, status VARCHAR(255), target_component VARCHAR(255), target_hosts CLOB, target_service VARCHAR(255), PRIMARY KEY (request_id));
+CREATE TABLE request (request_id NUMBER(19) NOT NULL, cluster_id NUMBER(19), request_schedule_id NUMBER(19), command_name VARCHAR(255), create_time NUMBER(19) NOT NULL, end_time NUMBER(19) NOT NULL, inputs CLOB, request_context VARCHAR(255), request_type VARCHAR(255), start_time NUMBER(19) NOT NULL, status VARCHAR(255), target_component VARCHAR(255), target_hosts CLOB, target_service VARCHAR(255), PRIMARY KEY (request_id));
 CREATE TABLE key_value_store ("key" VARCHAR2(255) NOT NULL, "value" CLOB NULL, PRIMARY KEY ("key"));
 CREATE TABLE clusterconfigmapping (type_name VARCHAR2(255) NOT NULL, create_timestamp NUMBER(19) NOT NULL, cluster_id NUMBER(19) NOT NULL, selected NUMBER(10) NOT NULL, version_tag VARCHAR2(255) NOT NULL, user_name VARCHAR(255) DEFAULT '_db', PRIMARY KEY (type_name, create_timestamp, cluster_id));
 CREATE TABLE hostconfigmapping (create_timestamp NUMBER(19) NOT NULL, host_name VARCHAR2(255) NOT NULL, cluster_id NUMBER(19) NOT NULL, type_name VARCHAR2(255) NOT NULL, selected NUMBER(10) NOT NULL, service_name VARCHAR2(255) NULL, version_tag VARCHAR2(255) NOT NULL, user_name VARCHAR(255) DEFAULT '_db', PRIMARY KEY (create_timestamp, host_name, cluster_id, type_name));
@@ -44,8 +44,8 @@ CREATE TABLE configgroup (group_id NUMBER(19), cluster_id NUMBER(19) NOT NULL, g
 CREATE TABLE confgroupclusterconfigmapping (config_group_id NUMBER(19) NOT NULL, cluster_id NUMBER(19) NOT NULL, config_type VARCHAR2(255) NOT NULL, version_tag VARCHAR2(255) NOT NULL, user_name VARCHAR2(255) DEFAULT '_db', create_timestamp NUMBER(19) NOT NULL, PRIMARY KEY(config_group_id, cluster_id, config_type));
 CREATE TABLE configgrouphostmapping (config_group_id NUMBER(19) NOT NULL, host_name VARCHAR2(255) NOT NULL, PRIMARY KEY(config_group_id, host_name));
 CREATE TABLE action (action_name VARCHAR2(255) NOT NULL, action_type VARCHAR2(255) NOT NULL, inputs VARCHAR2(1024), target_service VARCHAR2(255), target_component VARCHAR2(255), default_timeout NUMBER(10) NOT NULL, description VARCHAR2(1024), target_type VARCHAR2(255), PRIMARY KEY (action_name));
-CREATE TABLE ambari.requestschedule (schedule_id NUMBER(19), cluster_id NUMBER(19) NOT NULL, description VARCHAR2(255), status VARCHAR2(255), batch_separation_seconds smallint, batch_toleration_limit smallint, create_user VARCHAR2(255), create_timestamp NUMBER(19), update_user VARCHAR2(255), update_timestamp NUMBER(19), minutes VARCHAR2(10), hours VARCHAR2(10), days_of_month VARCHAR2(10), month VARCHAR2(10), day_of_week VARCHAR2(10), yearToSchedule VARCHAR2(10), startTime VARCHAR2(50), endTime VARCHAR2(50), last_execution_status VARCHAR2(255), PRIMARY KEY(schedule_id));
-CREATE TABLE ambari.requestschedulebatchrequest (schedule_id NUMBER(19), batch_id NUMBER(19), request_id NUMBER(19), request_type VARCHAR2(255), request_uri VARCHAR2(1024), request_body BLOB, request_status VARCHAR2(255), return_code smallint, return_message VARCHAR2(2000), PRIMARY KEY(schedule_id, batch_id));
+CREATE TABLE requestschedule (schedule_id NUMBER(19), cluster_id NUMBER(19) NOT NULL, description VARCHAR2(255), status VARCHAR2(255), batch_separation_seconds smallint, batch_toleration_limit smallint, create_user VARCHAR2(255), create_timestamp NUMBER(19), update_user VARCHAR2(255), update_timestamp NUMBER(19), minutes VARCHAR2(10), hours VARCHAR2(10), days_of_month VARCHAR2(10), month VARCHAR2(10), day_of_week VARCHAR2(10), yearToSchedule VARCHAR2(10), startTime VARCHAR2(50), endTime VARCHAR2(50), last_execution_status VARCHAR2(255), PRIMARY KEY(schedule_id));
+CREATE TABLE requestschedulebatchrequest (schedule_id NUMBER(19), batch_id NUMBER(19), request_id NUMBER(19), request_type VARCHAR2(255), request_uri VARCHAR2(1024), request_body BLOB, request_status VARCHAR2(255), return_code smallint, return_message VARCHAR2(2000), PRIMARY KEY(schedule_id, batch_id));
 
 ALTER TABLE users ADD CONSTRAINT UNQ_users_0 UNIQUE (user_name, ldap_user);
 ALTER TABLE clusterconfig ADD CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
@@ -65,6 +65,7 @@ ALTER TABLE role_success_criteria ADD CONSTRAINT role_success_criteria_stage_id
 ALTER TABLE stage ADD CONSTRAINT FK_stage_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
 ALTER TABLE stage ADD CONSTRAINT FK_stage_request_id FOREIGN KEY (request_id) REFERENCES request (request_id);
 ALTER TABLE request ADD CONSTRAINT FK_request_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
+ALTER TABLE request ADD CONSTRAINT FK_request_schedule_id FOREIGN KEY (request_schedule_id) REFERENCES requestschedule (schedule_id);
 ALTER TABLE clusterconfigmapping ADD CONSTRAINT clusterconfigmappingcluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
 ALTER TABLE ClusterHostMapping ADD CONSTRAINT ClusterHostMapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
 ALTER TABLE ClusterHostMapping ADD CONSTRAINT ClusterHostMapping_host_name FOREIGN KEY (host_name) REFERENCES hosts (host_name);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
index 5228121..63c5f4b 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -79,7 +79,7 @@ GRANT ALL PRIVILEGES ON TABLE ambari.role_success_criteria TO :username;
 CREATE TABLE ambari.stage (stage_id BIGINT NOT NULL, request_id BIGINT NOT NULL, cluster_id BIGINT NOT NULL, log_info VARCHAR(255) NOT NULL, request_context VARCHAR(255), cluster_host_info BYTEA NOT NULL, PRIMARY KEY (stage_id, request_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.stage TO :username;
 
-CREATE TABLE ambari.request (request_id BIGINT NOT NULL, cluster_id BIGINT, command_name VARCHAR(255), create_time BIGINT NOT NULL, end_time BIGINT NOT NULL, inputs VARCHAR(32000), request_context VARCHAR(255), request_type VARCHAR(255), start_time BIGINT NOT NULL, status VARCHAR(255), target_component VARCHAR(255), target_hosts TEXT, target_service VARCHAR(255), PRIMARY KEY (request_id));
+CREATE TABLE ambari.request (request_id BIGINT NOT NULL, cluster_id BIGINT, command_name VARCHAR(255), create_time BIGINT NOT NULL, end_time BIGINT NOT NULL, inputs VARCHAR(32000), request_context VARCHAR(255), request_type VARCHAR(255), request_schedule_id BIGINT, start_time BIGINT NOT NULL, status VARCHAR(255), target_component VARCHAR(255), target_hosts TEXT, target_service VARCHAR(255), PRIMARY KEY (request_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.request TO :username;
 
 CREATE TABLE ambari.ClusterHostMapping (cluster_id BIGINT NOT NULL, host_name VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, host_name));
@@ -138,6 +138,7 @@ ALTER TABLE ambari.role_success_criteria ADD CONSTRAINT FK_role_success_criteria
 ALTER TABLE ambari.stage ADD CONSTRAINT FK_stage_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
 ALTER TABLE ambari.stage ADD CONSTRAINT FK_stage_request_id FOREIGN KEY (request_id) REFERENCES ambari.request (request_id);
 ALTER TABLE ambari.request ADD CONSTRAINT FK_request_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
+ALTER TABLE ambari.request ADD CONSTRAINT FK_request_schedule_id FOREIGN KEY (request_schedule_id) REFERENCES ambari.requestschedule (schedule_id);
 ALTER TABLE ambari.ClusterHostMapping ADD CONSTRAINT FK_ClusterHostMapping_host_name FOREIGN KEY (host_name) REFERENCES ambari.hosts (host_name);
 ALTER TABLE ambari.ClusterHostMapping ADD CONSTRAINT FK_ClusterHostMapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
 ALTER TABLE ambari.user_roles ADD CONSTRAINT FK_user_roles_user_id FOREIGN KEY (user_id) REFERENCES ambari.users (user_id);
@@ -360,8 +361,6 @@ create index idx_qrtz_ft_jg on ambari.qrtz_fired_triggers(SCHED_NAME,JOB_GROUP);
 create index idx_qrtz_ft_t_g on ambari.qrtz_fired_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
 create index idx_qrtz_ft_tg on ambari.qrtz_fired_triggers(SCHED_NAME,TRIGGER_GROUP);
 
-commit;
-
 -- Insert data into the table
 INSERT INTO ambari.action (action_name, action_type, inputs, target_service, target_component, default_timeout, description, target_type)
   SELECT 'ambari_hdfs_rebalance', 'SYSTEM', 'threshold,[principal],[keytab]', 'HDFS', 'NAMENODE', 600, 'HDFS Rebalance', 'ANY';

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/resources/Ambari-DDL-Postgres-REMOTE-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-REMOTE-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-REMOTE-CREATE.sql
index 7c77d61..0586ba3 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-REMOTE-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-REMOTE-CREATE.sql
@@ -36,7 +36,7 @@ CREATE TABLE ambari.execution_command (command bytea, task_id BIGINT NOT NULL, P
 CREATE TABLE ambari.host_role_command (task_id BIGINT NOT NULL, attempt_count SMALLINT NOT NULL, event VARCHAR(32000) NOT NULL, exitcode INTEGER NOT NULL, host_name VARCHAR(255) NOT NULL, last_attempt_time BIGINT NOT NULL, request_id BIGINT NOT NULL, role VARCHAR(255), stage_id BIGINT NOT NULL, start_time BIGINT NOT NULL, end_time BIGINT, status VARCHAR(255), std_error BYTEA, std_out BYTEA, structured_out BYTEA, role_command VARCHAR(255), PRIMARY KEY (task_id));
 CREATE TABLE ambari.role_success_criteria (role VARCHAR(255) NOT NULL, request_id BIGINT NOT NULL, stage_id BIGINT NOT NULL, success_factor FLOAT NOT NULL, PRIMARY KEY (role, request_id, stage_id));
 CREATE TABLE ambari.stage (stage_id BIGINT NOT NULL, request_id BIGINT NOT NULL, cluster_id BIGINT NOT NULL, log_info VARCHAR(255) NOT NULL, request_context VARCHAR(255), PRIMARY KEY (stage_id, request_id));
-CREATE TABLE ambari.request (request_id BIGINT NOT NULL, cluster_id BIGINT, command_name VARCHAR(255), create_time BIGINT NOT NULL, end_time BIGINT NOT NULL, inputs VARCHAR(32000), request_context VARCHAR(255), request_type VARCHAR(255), start_time BIGINT NOT NULL, status VARCHAR(255), target_component VARCHAR(255), target_hosts TEXT, target_service VARCHAR(255), PRIMARY KEY (request_id));
+CREATE TABLE ambari.request (request_id BIGINT NOT NULL, cluster_id BIGINT, command_name VARCHAR(255), create_time BIGINT NOT NULL, end_time BIGINT NOT NULL, inputs VARCHAR(32000), request_context VARCHAR(255), request_type VARCHAR(255), request_schedule_id BIGINT, start_time BIGINT NOT NULL, status VARCHAR(255), target_component VARCHAR(255), target_hosts TEXT, target_service VARCHAR(255), PRIMARY KEY (request_id));
 CREATE TABLE ambari.ClusterHostMapping (cluster_id BIGINT NOT NULL, host_name VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, host_name));
 CREATE TABLE ambari.user_roles (role_name VARCHAR(255) NOT NULL, user_id INTEGER NOT NULL, PRIMARY KEY (role_name, user_id));
 CREATE TABLE ambari.key_value_store ("key" VARCHAR(255), "value" VARCHAR, PRIMARY KEY("key"));
@@ -67,6 +67,7 @@ ALTER TABLE ambari.role_success_criteria ADD CONSTRAINT FK_role_success_criteria
 ALTER TABLE ambari.stage ADD CONSTRAINT FK_stage_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
 ALTER TABLE ambari.stage ADD CONSTRAINT FK_stage_request_id FOREIGN KEY (request_id) REFERENCES request (request_id);
 ALTER TABLE ambari.request ADD CONSTRAINT FK_request_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
+ALTER TABLE ambari.request ADD CONSTRAINT FK_request_schedule_id FOREIGN KEY (request_schedule_id) REFERENCES ambari.requestschedule (schedule_id);
 ALTER TABLE ambari.ClusterHostMapping ADD CONSTRAINT FK_ClusterHostMapping_host_name FOREIGN KEY (host_name) REFERENCES ambari.hosts (host_name);
 ALTER TABLE ambari.ClusterHostMapping ADD CONSTRAINT FK_ClusterHostMapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
 ALTER TABLE ambari.user_roles ADD CONSTRAINT FK_user_roles_user_id FOREIGN KEY (user_id) REFERENCES ambari.users (user_id);
@@ -109,7 +110,7 @@ COMMIT;
 
 -- Quartz tables
 
-CREATE TABLE qrtz_job_details
+CREATE TABLE ambari.qrtz_job_details
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     JOB_NAME  VARCHAR(200) NOT NULL,
@@ -124,7 +125,7 @@ CREATE TABLE qrtz_job_details
     PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
 );
 
-CREATE TABLE qrtz_triggers
+CREATE TABLE ambari.qrtz_triggers
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     TRIGGER_NAME VARCHAR(200) NOT NULL,
@@ -144,10 +145,10 @@ CREATE TABLE qrtz_triggers
     JOB_DATA BYTEA NULL,
     PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
     FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
-	REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
+	REFERENCES ambari.QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
 );
 
-CREATE TABLE qrtz_simple_triggers
+CREATE TABLE ambari.qrtz_simple_triggers
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     TRIGGER_NAME VARCHAR(200) NOT NULL,
@@ -157,10 +158,10 @@ CREATE TABLE qrtz_simple_triggers
     TIMES_TRIGGERED BIGINT NOT NULL,
     PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
     FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
-	REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+	REFERENCES ambari.QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
 );
 
-CREATE TABLE qrtz_cron_triggers
+CREATE TABLE ambari.qrtz_cron_triggers
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     TRIGGER_NAME VARCHAR(200) NOT NULL,
@@ -169,10 +170,10 @@ CREATE TABLE qrtz_cron_triggers
     TIME_ZONE_ID VARCHAR(80),
     PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
     FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
-	REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+	REFERENCES ambari.QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
 );
 
-CREATE TABLE qrtz_simprop_triggers
+CREATE TABLE ambari.qrtz_simprop_triggers
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     TRIGGER_NAME VARCHAR(200) NOT NULL,
@@ -190,10 +191,10 @@ CREATE TABLE qrtz_simprop_triggers
     BOOL_PROP_2 BOOL NULL,
     PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
     FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
-    REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+    REFERENCES ambari.QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
 );
 
-CREATE TABLE qrtz_blob_triggers
+CREATE TABLE ambari.qrtz_blob_triggers
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     TRIGGER_NAME VARCHAR(200) NOT NULL,
@@ -201,10 +202,10 @@ CREATE TABLE qrtz_blob_triggers
     BLOB_DATA BYTEA NULL,
     PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
     FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
-        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
+        REFERENCES ambari.QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
 );
 
-CREATE TABLE qrtz_calendars
+CREATE TABLE ambari.qrtz_calendars
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     CALENDAR_NAME  VARCHAR(200) NOT NULL,
@@ -213,14 +214,14 @@ CREATE TABLE qrtz_calendars
 );
 
 
-CREATE TABLE qrtz_paused_trigger_grps
+CREATE TABLE ambari.qrtz_paused_trigger_grps
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     TRIGGER_GROUP  VARCHAR(200) NOT NULL,
     PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
 );
 
-CREATE TABLE qrtz_fired_triggers
+CREATE TABLE ambari.qrtz_fired_triggers
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     ENTRY_ID VARCHAR(95) NOT NULL,
@@ -238,7 +239,7 @@ CREATE TABLE qrtz_fired_triggers
     PRIMARY KEY (SCHED_NAME,ENTRY_ID)
 );
 
-CREATE TABLE qrtz_scheduler_state
+CREATE TABLE ambari.qrtz_scheduler_state
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     INSTANCE_NAME VARCHAR(200) NOT NULL,
@@ -247,35 +248,35 @@ CREATE TABLE qrtz_scheduler_state
     PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
 );
 
-CREATE TABLE qrtz_locks
+CREATE TABLE ambari.qrtz_locks
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     LOCK_NAME  VARCHAR(40) NOT NULL,
     PRIMARY KEY (SCHED_NAME,LOCK_NAME)
 );
 
-create index idx_qrtz_j_req_recovery on qrtz_job_details(SCHED_NAME,REQUESTS_RECOVERY);
-create index idx_qrtz_j_grp on qrtz_job_details(SCHED_NAME,JOB_GROUP);
-
-create index idx_qrtz_t_j on qrtz_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);
-create index idx_qrtz_t_jg on qrtz_triggers(SCHED_NAME,JOB_GROUP);
-create index idx_qrtz_t_c on qrtz_triggers(SCHED_NAME,CALENDAR_NAME);
-create index idx_qrtz_t_g on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP);
-create index idx_qrtz_t_state on qrtz_triggers(SCHED_NAME,TRIGGER_STATE);
-create index idx_qrtz_t_n_state on qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
-create index idx_qrtz_t_n_g_state on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
-create index idx_qrtz_t_next_fire_time on qrtz_triggers(SCHED_NAME,NEXT_FIRE_TIME);
-create index idx_qrtz_t_nft_st on qrtz_triggers(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
-create index idx_qrtz_t_nft_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
-create index idx_qrtz_t_nft_st_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
-create index idx_qrtz_t_nft_st_misfire_grp on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
-
-create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME);
-create index idx_qrtz_ft_inst_job_req_rcvry on qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
-create index idx_qrtz_ft_j_g on qrtz_fired_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);
-create index idx_qrtz_ft_jg on qrtz_fired_triggers(SCHED_NAME,JOB_GROUP);
-create index idx_qrtz_ft_t_g on qrtz_fired_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
-create index idx_qrtz_ft_tg on qrtz_fired_triggers(SCHED_NAME,TRIGGER_GROUP);
+create index idx_qrtz_j_req_recovery on ambari.qrtz_job_details(SCHED_NAME,REQUESTS_RECOVERY);
+create index idx_qrtz_j_grp on ambari.qrtz_job_details(SCHED_NAME,JOB_GROUP);
+
+create index idx_qrtz_t_j on ambari.qrtz_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);
+create index idx_qrtz_t_jg on ambari.qrtz_triggers(SCHED_NAME,JOB_GROUP);
+create index idx_qrtz_t_c on ambari.qrtz_triggers(SCHED_NAME,CALENDAR_NAME);
+create index idx_qrtz_t_g on ambari.qrtz_triggers(SCHED_NAME,TRIGGER_GROUP);
+create index idx_qrtz_t_state on ambari.qrtz_triggers(SCHED_NAME,TRIGGER_STATE);
+create index idx_qrtz_t_n_state on ambari.qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
+create index idx_qrtz_t_n_g_state on ambari.qrtz_triggers(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
+create index idx_qrtz_t_next_fire_time on ambari.qrtz_triggers(SCHED_NAME,NEXT_FIRE_TIME);
+create index idx_qrtz_t_nft_st on ambari.qrtz_triggers(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
+create index idx_qrtz_t_nft_misfire on ambari.qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
+create index idx_qrtz_t_nft_st_misfire on ambari.qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
+create index idx_qrtz_t_nft_st_misfire_grp on ambari.qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
+
+create index idx_qrtz_ft_trig_inst_name on ambari.qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME);
+create index idx_qrtz_ft_inst_job_req_rcvry on ambari.qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
+create index idx_qrtz_ft_j_g on ambari.qrtz_fired_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);
+create index idx_qrtz_ft_jg on ambari.qrtz_fired_triggers(SCHED_NAME,JOB_GROUP);
+create index idx_qrtz_ft_t_g on ambari.qrtz_fired_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
+create index idx_qrtz_ft_tg on ambari.qrtz_fired_triggers(SCHED_NAME,TRIGGER_GROUP);
 
 commit;
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/ambari-server/src/main/resources/properties.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/properties.json b/ambari-server/src/main/resources/properties.json
index 60e438e..ce7292c 100644
--- a/ambari-server/src/main/resources/properties.json
+++ b/ambari-server/src/main/resources/properties.json
@@ -97,6 +97,8 @@
         "Requests/cluster_name",
         "Requests/request_status",
         "Requests/request_context",
+        "Requests/source_schedule_id",
+        "Requests/source_schedule_href",
         "Requests/type",
         "Requests/inputs",
         "Requests/target_service",

http://git-wip-us.apache.org/repos/asf/ambari/blob/e056203a/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 8f3b800..24e70eb 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.actionmanager.ActionDBAccessor;
 import org.apache.ambari.server.actionmanager.HostRoleCommand;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
@@ -323,6 +324,7 @@ public class ExecutionScheduleManagerTest {
     Configuration configurationMock = createNiceMock(Configuration.class);
     ExecutionScheduler executionSchedulerMock = createMock(ExecutionScheduler.class);
     InternalTokenStorage tokenStorageMock = createMock(InternalTokenStorage.class);
+    ActionDBAccessor actionDBAccessorMock = createMock(ActionDBAccessor.class);
     Gson gson = new Gson();
     BatchRequest batchRequestMock = createMock(BatchRequest.class);
 
@@ -342,7 +344,8 @@ public class ExecutionScheduleManagerTest {
     batchRequestResponse.setReturnCode(202);
 
     ExecutionScheduleManager scheduleManager = createMockBuilder(ExecutionScheduleManager.class).
-      withConstructor(configurationMock, executionSchedulerMock, tokenStorageMock, clustersMock, gson).
+      withConstructor(configurationMock, executionSchedulerMock, tokenStorageMock, clustersMock,
+        actionDBAccessorMock, gson).
       addMockedMethods("performApiRequest", "updateBatchRequest").createNiceMock();
 
     //interesting easymock behavior, workaround to not to expect method called in constructor
@@ -363,14 +366,16 @@ public class ExecutionScheduleManagerTest {
     scheduleManager.updateBatchRequest(eq(executionId), eq(batchId), eq(clusterName), eq(batchRequestResponse), eq(false));
     expectLastCall().once();
 
+    actionDBAccessorMock.setSourceScheduleForRequest(eq(requestId), eq(executionId));
+    expectLastCall().once();
 
     replay(clusterMock, clustersMock, configurationMock, requestExecutionMock, executionSchedulerMock,
-      tokenStorageMock, batchRequestMock, scheduleManager);
+      tokenStorageMock, batchRequestMock, scheduleManager, actionDBAccessorMock);
 
     scheduleManager.executeBatchRequest(executionId, batchId, clusterName);
 
     verify(clusterMock, clustersMock, configurationMock, requestExecutionMock, executionSchedulerMock,
-      tokenStorageMock, batchRequestMock, scheduleManager);
+      tokenStorageMock, batchRequestMock, scheduleManager, actionDBAccessorMock);
 
   }
 
@@ -382,6 +387,7 @@ public class ExecutionScheduleManagerTest {
     Configuration configurationMock = createNiceMock(Configuration.class);
     ExecutionScheduler executionSchedulerMock = createMock(ExecutionScheduler.class);
     InternalTokenStorage tokenStorageMock = createMock(InternalTokenStorage.class);
+    ActionDBAccessor actionDBAccessorMock = createMock(ActionDBAccessor.class);
     Gson gson = new Gson();
     BatchRequest batchRequestMock = createMock(BatchRequest.class);
 
@@ -399,7 +405,8 @@ public class ExecutionScheduleManagerTest {
     batchRequestResponse.setReturnCode(202);
 
     ExecutionScheduleManager scheduleManager = createMockBuilder(ExecutionScheduleManager.class).
-      withConstructor(configurationMock, executionSchedulerMock, tokenStorageMock, clustersMock, gson).
+      withConstructor(configurationMock, executionSchedulerMock, tokenStorageMock, clustersMock,
+        actionDBAccessorMock, gson).
       addMockedMethods("performApiRequest").createNiceMock();
 
     //interesting easymock behavior, workaround to not to expect method called in constructor
@@ -429,6 +436,7 @@ public class ExecutionScheduleManagerTest {
     Configuration configurationMock = createNiceMock(Configuration.class);
     ExecutionScheduler executionSchedulerMock = createMock(ExecutionScheduler.class);
     InternalTokenStorage tokenStorageMock = createMock(InternalTokenStorage.class);
+    ActionDBAccessor actionDBAccessorMock = createMock(ActionDBAccessor.class);
     Gson gson = new Gson();
 
     long requestId = 5L;
@@ -442,7 +450,8 @@ public class ExecutionScheduleManagerTest {
     batchRequestResponse.setReturnCode(202);
 
     ExecutionScheduleManager scheduleManager = createMockBuilder(ExecutionScheduleManager.class).
-      withConstructor(configurationMock, executionSchedulerMock, tokenStorageMock, clustersMock, gson).
+      withConstructor(configurationMock, executionSchedulerMock, tokenStorageMock, clustersMock,
+        actionDBAccessorMock, gson).
       addMockedMethods("performApiGetRequest").createNiceMock();
 
     //interesting easymock behavior, workaround to not to expect method called in constructor
@@ -469,6 +478,7 @@ public class ExecutionScheduleManagerTest {
     Configuration configurationMock = createNiceMock(Configuration.class);
     ExecutionScheduler executionSchedulerMock = createMock(ExecutionScheduler.class);
     InternalTokenStorage tokenStorageMock = createMock(InternalTokenStorage.class);
+    ActionDBAccessor actionDBAccessorMock = createMock(ActionDBAccessor.class);
     Gson gson = new Gson();
     RequestExecution requestExecutionMock = createMock(RequestExecution.class);
     Batch batchMock = createMock(Batch.class);
@@ -482,11 +492,7 @@ public class ExecutionScheduleManagerTest {
     Map<Long, RequestExecution> executionMap = new HashMap<Long, RequestExecution>();
     executionMap.put(executionId, requestExecutionMock);
 
-    ExecutionScheduleManager scheduleManager = createMockBuilder(ExecutionScheduleManager.class).
-      withConstructor(configurationMock, executionSchedulerMock,
-        tokenStorageMock, clustersMock, gson).createMock();
 
-    expectLastCall().anyTimes();
 
     expect(clustersMock.getCluster(clusterName)).andReturn(clusterMock).anyTimes();
     expect(clusterMock.getAllRequestExecutions()).andReturn(executionMap).anyTimes();
@@ -494,7 +500,10 @@ public class ExecutionScheduleManagerTest {
     expect(batchMock.getBatchSettings()).andReturn(batchSettings).anyTimes();
 
     replay(clustersMock, clusterMock, configurationMock, requestExecutionMock,
-      executionSchedulerMock, scheduleManager, batchMock);
+      executionSchedulerMock, batchMock);
+
+    ExecutionScheduleManager scheduleManager = new ExecutionScheduleManager(configurationMock, executionSchedulerMock,
+      tokenStorageMock, clustersMock, actionDBAccessorMock, gson);
 
     HashMap<String, Integer> taskCounts = new HashMap<String, Integer>() {{
       put(BatchRequestJob.BATCH_REQUEST_FAILED_TASKS_KEY, 2);
@@ -507,7 +516,7 @@ public class ExecutionScheduleManagerTest {
     Assert.assertTrue(exceeded);
 
     verify(clustersMock, clusterMock, configurationMock, requestExecutionMock,
-      executionSchedulerMock, scheduleManager, batchMock);
+      executionSchedulerMock, batchMock);
   }
 
   @SuppressWarnings("unchecked")