diff --git a/azkaban-web-server/src/main/less/flow.less b/azkaban-web-server/src/main/less/flow.less
index 351bf8a..2b4a595 100644
--- a/azkaban-web-server/src/main/less/flow.less
+++ b/azkaban-web-server/src/main/less/flow.less
@@ -165,6 +165,10 @@ td {
&.FAILED_SUCCEEDED {
background-color: @flow-failed-succeeded-color;
}
+
+ &.QUEUED {
+ background-color: @flow-queued-color;
+ }
}
}
diff --git a/azkaban-web-server/src/web/js/azkaban/view/exflow.js b/azkaban-web-server/src/web/js/azkaban/view/exflow.js
index cae3c45..3ad9fa7 100644
--- a/azkaban-web-server/src/web/js/azkaban/view/exflow.js
+++ b/azkaban-web-server/src/web/js/azkaban/view/exflow.js
@@ -421,12 +421,45 @@ var updateStatus = function (updateTime) {
ajaxCall(requestURL, requestData, successHandler);
}
+function updatePastAttempts(data, update) {
+ if (!update.pastAttempts) {
+ return;
+ }
+
+ if (data.pastAttempts) {
+ for (var i = 0; i < update.pastAttempts.length; ++i) {
+ var updatedAttempt = update.pastAttempts[i];
+ var found = false;
+ for (var j = 0; j < data.pastAttempts.length; ++j) {
+ var attempt = data.pastAttempts[j];
+ if (attempt.attempt == updatedAttempt.attempt) {
+ attempt.startTime = updatedAttempt.startTime;
+ attempt.endTime = updatedAttempt.endTime;
+ attempt.status = updatedAttempt.status;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ data.pastAttempts.push(updatedAttempt);
+ }
+ }
+ }
+ else {
+ data.pastAttempts = update.pastAttempts;
+ }
+}
+
var updateGraph = function (data, update) {
var nodeMap = data.nodeMap;
data.startTime = update.startTime;
data.endTime = update.endTime;
data.updateTime = update.updateTime;
data.status = update.status;
+
+ updatePastAttempts(data, update);
+
update.changedNode = data;
if (update.nodes) {
diff --git a/azkaban-web-server/src/web/js/azkaban/view/flow-execution-list.js b/azkaban-web-server/src/web/js/azkaban/view/flow-execution-list.js
index ff6acff..3e26410 100644
--- a/azkaban-web-server/src/web/js/azkaban/view/flow-execution-list.js
+++ b/azkaban-web-server/src/web/js/azkaban/view/flow-execution-list.js
@@ -95,9 +95,11 @@ azkaban.ExecutionListView = Backbone.View.extend({
for (var i = 0; i < nodes.length; ++i) {
var node = nodes[i].changedNode ? nodes[i].changedNode : nodes[i];
- if (node.startTime < 0) {
+
+ if (node.status == 'READY') {
continue;
}
+
//var nodeId = node.id.replace(".", "\\\\.");
var row = node.joblistrow;
if (!row) {
@@ -110,8 +112,13 @@ azkaban.ExecutionListView = Backbone.View.extend({
$(statusDiv).attr("class", "status " + node.status);
var startTimeTd = $(row).find("> td.startTime");
- var startdate = new Date(node.startTime);
- $(startTimeTd).text(getDateFormat(startdate));
+ if (node.startTime == -1) {
+ $(startTimeTd).text("-");
+ }
+ else {
+ var startdate = new Date(node.startTime);
+ $(startTimeTd).text(getDateFormat(startdate));
+ }
var endTimeTd = $(row).find("> td.endTime");
if (node.endTime == -1) {
@@ -173,10 +180,6 @@ azkaban.ExecutionListView = Backbone.View.extend({
},
updateProgressBar: function (data, flowStartTime, flowLastTime) {
- if (data.startTime == -1) {
- return;
- }
-
var outerWidth = $(".flow-progress").css("width");
if (outerWidth) {
if (outerWidth.substring(outerWidth.length - 2, outerWidth.length)
@@ -243,10 +246,13 @@ azkaban.ExecutionListView = Backbone.View.extend({
var nodeLastTime = node.endTime == -1 ? (new Date()).getTime()
: node.endTime;
- var left = Math.max((node.startTime - parentStartTime) * factor,
+ var nodeStartTime = node.startTime == -1 ? (new Date()).getTime()
+ : node.startTime;
+ var left = Math.max((nodeStartTime - parentStartTime) * factor,
minOffset);
var margin = left - offsetLeft;
- var width = Math.max((nodeLastTime - node.startTime) * factor, 3);
+ var width = Math.max((nodeLastTime - nodeStartTime) * factor, 3);
+
width = Math.min(width, outerWidth);
progressBar.css("margin-left", left)