azkaban-memoizeit

Fixing job edit feature when clicking on the span. Fixing concurrency

4/10/2013 12:21:04 AM

Details

diff --git a/src/java/azkaban/execapp/ExecutorServlet.java b/src/java/azkaban/execapp/ExecutorServlet.java
index 00f19a2..282c14c 100644
--- a/src/java/azkaban/execapp/ExecutorServlet.java
+++ b/src/java/azkaban/execapp/ExecutorServlet.java
@@ -201,7 +201,7 @@ public class ExecutorServlet extends HttpServlet implements ConnectorParams {
 				continue;
 			}
 			
-			if (flow.getUpdateTime() > updateTime) {
+			if (flow.getUpdateTime() >= updateTime) {
 				updateList.add(flow.toUpdateObject(updateTime));
 			}
 		}
diff --git a/src/java/azkaban/execapp/FlowRunner.java b/src/java/azkaban/execapp/FlowRunner.java
index 35b4afd..5d8b39d 100644
--- a/src/java/azkaban/execapp/FlowRunner.java
+++ b/src/java/azkaban/execapp/FlowRunner.java
@@ -338,15 +338,17 @@ public class FlowRunner extends EventHandler implements Runnable {
 		logger.info("Finishing up flow. Awaiting Termination");
 		executorService.shutdown();
 		
-		switch(flow.getStatus()) {
-		case FAILED_FINISHING:
-			logger.info("Setting flow status to Failed.");
-			flow.setStatus(Status.FAILED);
-		case FAILED:
-		case KILLED:
-			break;
-		default:
-			flow.setStatus(Status.SUCCEEDED);
+		synchronized(mainSyncObj) {
+			switch(flow.getStatus()) {
+			case FAILED_FINISHING:
+				logger.info("Setting flow status to Failed.");
+				flow.setStatus(Status.FAILED);
+			case FAILED:
+			case KILLED:
+				break;
+			default:
+				flow.setStatus(Status.SUCCEEDED);
+			}
 		}
 	}
 	
@@ -697,7 +699,7 @@ public class FlowRunner extends EventHandler implements Runnable {
 							ExecutionOptions options = flow.getExecutionOptions();
 							// The KILLED status occurs when cancel is invoked. We want to keep this
 							// status even in failure conditions.
-							if (flow.getStatus() != Status.KILLED) {
+							if (flow.getStatus() != Status.KILLED && flow.getStatus() != Status.FAILED) {
 								flow.setStatus(Status.FAILED_FINISHING);
 								if (options.getFailureAction() == FailureAction.CANCEL_ALL && !flowCancelled) {
 									logger.info("Flow failed. Failure option is Cancel All. Stopping execution.");
diff --git a/src/java/azkaban/execapp/FlowRunnerManager.java b/src/java/azkaban/execapp/FlowRunnerManager.java
index 79192c0..d4c4d6e 100644
--- a/src/java/azkaban/execapp/FlowRunnerManager.java
+++ b/src/java/azkaban/execapp/FlowRunnerManager.java
@@ -304,6 +304,7 @@ public class FlowRunnerManager implements EventListener {
 			}
 			
 			for (Integer id: executionToKill) {
+				logger.info("Cleaning execution " + id + " from recently finished flows list.");
 				recentlyFinishedFlows.remove(id);
 			}
 		}
@@ -502,8 +503,9 @@ public class FlowRunnerManager implements EventListener {
 		if (event.getType() == Event.Type.FLOW_FINISHED) {
 			FlowRunner flowRunner = (FlowRunner)event.getRunner();
 			ExecutableFlow flow = flowRunner.getExecutableFlow();
-			recentlyFinishedFlows.put(flow.getExecutionId(), flow);
 
+			recentlyFinishedFlows.put(flow.getExecutionId(), flow);
+			logger.info("Flow " + flow.getFlowId() + " is finished. Adding it to recently finished flows list.");
 			runningFlows.remove(flow.getExecutionId());
 		}
 	}
diff --git a/src/java/azkaban/executor/ExecutableFlow.java b/src/java/azkaban/executor/ExecutableFlow.java
index ef34069..408ed6d 100644
--- a/src/java/azkaban/executor/ExecutableFlow.java
+++ b/src/java/azkaban/executor/ExecutableFlow.java
@@ -356,6 +356,8 @@ public class ExecutableFlow {
 		}
 		
 		this.flowStatus = Status.fromInteger((Integer)updateData.get("status"));
+		
+		System.out.println("Updating status to " + flowStatus);
 		this.startTime = JSONUtils.getLongFromObject(updateData.get("startTime"));
 		this.endTime = JSONUtils.getLongFromObject(updateData.get("endTime"));
 		this.updateTime = JSONUtils.getLongFromObject(updateData.get("updateTime"));
diff --git a/src/java/azkaban/executor/ExecutorManager.java b/src/java/azkaban/executor/ExecutorManager.java
index 6be5ee0..5f7e532 100644
--- a/src/java/azkaban/executor/ExecutorManager.java
+++ b/src/java/azkaban/executor/ExecutorManager.java
@@ -796,7 +796,6 @@ public class ExecutorManager {
 		ref.setNextCheckTime(0);
 		ref.setNumErrors(0);
 		Status oldStatus = flow.getStatus();
-		
 		flow.applyUpdateObject(updateData);
 		Status newStatus = flow.getStatus();
 		
diff --git a/src/web/js/azkaban.jobedit.view.js b/src/web/js/azkaban.jobedit.view.js
index d43bde8..d8ee5e0 100644
--- a/src/web/js/azkaban.jobedit.view.js
+++ b/src/web/js/azkaban.jobedit.view.js
@@ -153,10 +153,12 @@ azkaban.JobEditView = Backbone.View.extend({
 		$(tdName).append(nameData);
 		$(tdName).addClass("name");
 		$(tdName).addClass("editable");
+		nameData.myparent = tdName;
 
 		$(tdValue).append(valueData);
 	    $(tdValue).addClass("editable");
-
+		valueData.myparent = tdValue;
+		
 		$(tr).addClass("editRow");
 	  	$(tr).append(tdName);
 	  	$(tr).append(tdValue);
@@ -169,8 +171,8 @@ azkaban.JobEditView = Backbone.View.extend({
 		var curTarget = evt.currentTarget;
 	
 		if (this.editingTarget != curTarget) {
-			this.closeEditingTarget();
-			
+			this.closeEditingTarget(evt);
+		
 			var text = $(curTarget).children(".spanValue").text();
 			$(curTarget).empty();
 						
@@ -178,9 +180,17 @@ azkaban.JobEditView = Backbone.View.extend({
 			$(input).attr("type", "text");
 			$(input).css("width", "100%");
 			$(input).val(text);
+			
 			$(curTarget).addClass("editing");
 			$(curTarget).append(input);
 			$(input).focus();
+			var obj = this;
+			$(input).keypress(function(evt) {
+		    	if(evt.which == 13) {
+			        obj.closeEditingTarget(evt);
+			    }
+			});
+			
 			this.editingTarget = curTarget;
 		}
 	},
@@ -191,7 +201,7 @@ azkaban.JobEditView = Backbone.View.extend({
 		$(row).remove();
 	},
 	closeEditingTarget: function(evt) {
-		if (this.editingTarget != null && this.editingTarget != evt.target && this.editingTarget != evt.target.parentElement ) {
+		if (this.editingTarget != null && this.editingTarget != evt.target && this.editingTarget != evt.target.myparent ) {
 	  		var input = $(this.editingTarget).children("input")[0];
 	  		var text = $(input).val();
 	  		$(input).remove();
@@ -208,6 +218,7 @@ azkaban.JobEditView = Backbone.View.extend({
 
 		    $(this.editingTarget).removeClass("editing");
 		    $(this.editingTarget).append(valueData);
+		    valueData.myparent=this.editingTarget;
 		    this.editingTarget = null;
 	  	}
 	}