azkaban-memoizeit

Details

diff --git a/src/java/azkaban/execapp/FlowRunner.java b/src/java/azkaban/execapp/FlowRunner.java
index 9d81674..65ba670 100644
--- a/src/java/azkaban/execapp/FlowRunner.java
+++ b/src/java/azkaban/execapp/FlowRunner.java
@@ -296,6 +296,7 @@ public class FlowRunner extends EventHandler implements Runnable {
 								Props outputProps = collectOutputProps(node);
 								node.setStatus(Status.QUEUED);
 								JobRunner runner = createJobRunner(node, outputProps);
+								logger.info("Submitting job " + node.getJobId() + " to run.");
 								try {
 									executorService.submit(runner);
 									jobRunners.put(node.getJobId(), runner);
@@ -305,10 +306,12 @@ public class FlowRunner extends EventHandler implements Runnable {
 								
 							} // If killed, then auto complete and KILL
 							else if (node.getStatus() == Status.KILLED) {
+								logger.info("Killing " + node.getJobId() + " due to prior errors.");
 								node.setStartTime(currentTime);
 								node.setEndTime(currentTime);
 							} // If disabled, then we auto skip
 							else if (node.getStatus() == Status.DISABLED) {
+								logger.info("Skipping disabled job " + node.getJobId() + ".");
 								node.setStartTime(currentTime);
 								node.setEndTime(currentTime);
 								node.setStatus(Status.SKIPPED);
diff --git a/src/java/azkaban/executor/ExecutorManager.java b/src/java/azkaban/executor/ExecutorManager.java
index b3ab60d..90ea1bc 100644
--- a/src/java/azkaban/executor/ExecutorManager.java
+++ b/src/java/azkaban/executor/ExecutorManager.java
@@ -371,10 +371,12 @@ public class ExecutorManager {
 
 			ExecutionOptions options = exflow.getExecutionOptions();
 			
-			// Disable jobs
-			for(String disabledId : options.getDisabledJobs()) {
-				ExecutableNode node = exflow.getExecutableNode(disabledId);
-				node.setStatus(Status.DISABLED);
+			if (options.getDisabledJobs() != null) {
+				// Disable jobs
+				for(String disabledId : options.getDisabledJobs()) {
+					ExecutableNode node = exflow.getExecutableNode(disabledId);
+					node.setStatus(Status.DISABLED);
+				}
 			}
 			
 			String message = "";
diff --git a/src/java/azkaban/scheduler/Schedule.java b/src/java/azkaban/scheduler/Schedule.java
index 2fd6074..3e84c86 100644
--- a/src/java/azkaban/scheduler/Schedule.java
+++ b/src/java/azkaban/scheduler/Schedule.java
@@ -344,6 +344,14 @@ public class Schedule{
 			ExecutionOptions execOptions = ExecutionOptions.createFromObject(schedObj.get("executionOptions"));
 			this.executionOptions = execOptions;
 		}
+		else if (schedObj.containsKey("flowOptions")){
+			ExecutionOptions execOptions = ExecutionOptions.createFromObject(schedObj.get("flowOptions"));
+			this.executionOptions = execOptions;
+		}
+		else {
+			this.executionOptions = new ExecutionOptions();
+		}
+
 		if (schedObj.containsKey("slaOptions")) {
 			SlaOptions slaOptions = SlaOptions.fromObject(schedObj.get("slaOptions"));
 			this.slaOptions = slaOptions;
diff --git a/src/java/azkaban/webapp/servlet/JMXHttpServlet.java b/src/java/azkaban/webapp/servlet/JMXHttpServlet.java
index 78aec2f..75982d1 100644
--- a/src/java/azkaban/webapp/servlet/JMXHttpServlet.java
+++ b/src/java/azkaban/webapp/servlet/JMXHttpServlet.java
@@ -162,13 +162,18 @@ public class JMXHttpServlet extends LoginAbstractAzkabanServlet implements Conne
 		Map<String, Object> executorMBeans = new HashMap<String,Object>();
 		Set<String> primaryServerHosts = executorManager.getPrimaryServerHosts();
 		for (String hostPort: executorManager.getAllActiveExecutorServerHosts()) {
-			Map<String, Object> mbeans = executorManager.callExecutorJMX(hostPort, JMX_GET_MBEANS, null);
-
-			if (primaryServerHosts.contains(hostPort)) {
-				executorMBeans.put(hostPort, mbeans.get("mbeans"));
+			try {
+				Map<String, Object> mbeans = executorManager.callExecutorJMX(hostPort, JMX_GET_MBEANS, null);
+	
+				if (primaryServerHosts.contains(hostPort)) {
+					executorMBeans.put(hostPort, mbeans.get("mbeans"));
+				}
+				else {
+					executorMBeans.put(hostPort, mbeans.get("mbeans"));
+				}
 			}
-			else {
-				executorMBeans.put(hostPort, mbeans.get("mbeans"));
+			catch (IOException e) {
+				logger.error("Cannot contact executor " + hostPort, e);
 			}
 		}
 		
diff --git a/src/web/css/azkaban.css b/src/web/css/azkaban.css
index a138e89..8fca496 100644
--- a/src/web/css/azkaban.css
+++ b/src/web/css/azkaban.css
@@ -2368,7 +2368,7 @@ span.sublabel {
 }
 
 #flow-status table td.PAUSED {
-	color: #FF6600;
+	color: #C82123;
 }
 
 #flow-status table td.FAILED_FINISHING {
@@ -2464,6 +2464,10 @@ td .status.FAILED {
 	background-color: #C82123;
 }
 
+td .status.PAUSED {
+	background-color: #C82123;
+}
+
 td .status.READY {
 	background-color: #CCC;
 }
diff --git a/src/web/js/azkaban.exflow.view.js b/src/web/js/azkaban.exflow.view.js
index cdbb892..bde19da 100644
--- a/src/web/js/azkaban.exflow.view.js
+++ b/src/web/js/azkaban.exflow.view.js
@@ -519,57 +519,33 @@ azkaban.FlowLogView = Backbone.View.extend({
 		var requestURL = contextURL + "/executor"; 
 		var model = this.model;
 		console.log("fetchLogs offset is " + offset)
-//		$.get(
-//			requestURL,
-//			{"execid": execId, "ajax":"fetchExecFlowLogs", "offset": offset, "length": 50000},
-//			function(data) {
-//	          console.log("fetchLogs");
-//	          if (data.error) {
-//	          	console.log(data.error);
-//	          }
-//	          else {
-//	          	var log = $("#logSection").text();
-//	          	if (!log) {
-//	          		log = data.data;
-//	          	}
-//	          	else {
-//	          		log += data.data;
-//	          	}
-//	          	
-//	          	var newOffset = data.offset + data.length;
-//	          	
-//	          	$("#logSection").text(log);
-//	          	model.set({"offset": newOffset, "log": log});
-//	          	$(".logViewer").scrollTop(9999);
-//	          }
-//	      }
-//	    );
+
 		$.ajax({async:false, 
 			url:requestURL,
 			data:{"execid": execId, "ajax":"fetchExecFlowLogs", "offset": offset, "length": 50000},
 			success:
 				function(data) {
-		          console.log("fetchLogs");
-		          if (data.error) {
-		          	console.log(data.error);
-		          }
-		          else {
-		          	var log = $("#logSection").text();
-		          	if (!log) {
-		          		log = data.data;
-		          	}
-		          	else {
-		          		log += data.data;
-		          	}
-		          	
-		          	var newOffset = data.offset + data.length;
-		          	
-		          	$("#logSection").text(log);
-		          	model.set({"offset": newOffset, "log": log});
-		          	$(".logViewer").scrollTop(9999);
-		          }
-		      	}
-			})
+					console.log("fetchLogs");
+					if (data.error) {
+						console.log(data.error);
+					}
+					else {
+						var log = $("#logSection").text();
+						if (!log) {
+							log = data.data;
+						}
+						else {
+							log += data.data;
+						}
+	
+						var newOffset = data.offset + data.length;
+	
+						$("#logSection").text(log);
+						model.set({"offset": newOffset, "log": log});
+						$(".logViewer").scrollTop(9999);
+					}
+				}
+		});
 	}
 });