Details
diff --git a/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java b/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java
index dd7dd57..9c3f092 100644
--- a/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java
+++ b/azkaban-common/src/main/java/azkaban/jobExecutor/utils/process/AzkabanProcess.java
@@ -34,8 +34,8 @@ import azkaban.utils.LogGobbler;
import com.google.common.base.Joiner;
/**
- * A less shitty version of java.lang.Process.
- *
+ * An improved version of java.lang.Process.
+ *
* Output is read by separate threads to avoid deadlock and logged to log4j
* loggers.
*/
@@ -72,6 +72,7 @@ public class AzkabanProcess {
ProcessBuilder builder = new ProcessBuilder(cmd);
builder.directory(new File(workingDir));
builder.environment().putAll(env);
+ builder.redirectErrorStream(true);
this.process = builder.start();
try {
this.processId = processId(process);
@@ -116,7 +117,7 @@ public class AzkabanProcess {
/**
* Await the completion of this process
- *
+ *
* @throws InterruptedException if the thread is interrupted while waiting.
*/
public void awaitCompletion() throws InterruptedException {
@@ -125,7 +126,7 @@ public class AzkabanProcess {
/**
* Await the start of this process
- *
+ *
* @throws InterruptedException if the thread is interrupted while waiting.
*/
public void awaitStartup() throws InterruptedException {
@@ -134,7 +135,7 @@ public class AzkabanProcess {
/**
* Get the process id for this process, if it has started.
- *
+ *
* @return The process id or -1 if it cannot be fetched
*/
public int getProcessId() {
@@ -144,7 +145,7 @@ public class AzkabanProcess {
/**
* Attempt to kill the process, waiting up to the given time for it to die
- *
+ *
* @param time The amount of time to wait
* @param unit The time unit
* @return true iff this soft kill kills the process in the given wait time.
@@ -183,7 +184,7 @@ public class AzkabanProcess {
/**
* Attempt to get the process id for this process
- *
+ *
* @param process The process to get the id from
* @return The id of the process
*/
diff --git a/azkaban-common/src/main/java/azkaban/utils/ThreadPoolExecutingListener.java b/azkaban-common/src/main/java/azkaban/utils/ThreadPoolExecutingListener.java
index 52e7074..a7c85a4 100644
--- a/azkaban-common/src/main/java/azkaban/utils/ThreadPoolExecutingListener.java
+++ b/azkaban-common/src/main/java/azkaban/utils/ThreadPoolExecutingListener.java
@@ -26,4 +26,4 @@ public interface ThreadPoolExecutingListener {
public void beforeExecute(Runnable r);
public void afterExecute(Runnable r);
-}
+}
\ No newline at end of file
diff --git a/azkaban-execserver/src/main/java/azkaban/execapp/FlowRunnerManager.java b/azkaban-execserver/src/main/java/azkaban/execapp/FlowRunnerManager.java
index 0edad7b..54d82e8 100644
--- a/azkaban-execserver/src/main/java/azkaban/execapp/FlowRunnerManager.java
+++ b/azkaban-execserver/src/main/java/azkaban/execapp/FlowRunnerManager.java
@@ -841,4 +841,4 @@ public class FlowRunnerManager implements EventListener,
submittedFlows.remove(r);
}
-}
+}
\ No newline at end of file
diff --git a/azkaban-execserver/src/main/java/azkaban/execapp/jmx/JmxFlowRunnerManager.java b/azkaban-execserver/src/main/java/azkaban/execapp/jmx/JmxFlowRunnerManager.java
index 02ab2be..3437065 100644
--- a/azkaban-execserver/src/main/java/azkaban/execapp/jmx/JmxFlowRunnerManager.java
+++ b/azkaban-execserver/src/main/java/azkaban/execapp/jmx/JmxFlowRunnerManager.java
@@ -79,4 +79,4 @@ public class JmxFlowRunnerManager implements JmxFlowRunnerManagerMBean {
public int getTotalNumExecutedFlows() {
return manager.getTotalNumExecutedFlows();
}
-}
+}
\ No newline at end of file
diff --git a/azkaban-execserver/src/main/java/azkaban/execapp/jmx/JmxFlowRunnerManagerMBean.java b/azkaban-execserver/src/main/java/azkaban/execapp/jmx/JmxFlowRunnerManagerMBean.java
index 71212a8..41f8f04 100644
--- a/azkaban-execserver/src/main/java/azkaban/execapp/jmx/JmxFlowRunnerManagerMBean.java
+++ b/azkaban-execserver/src/main/java/azkaban/execapp/jmx/JmxFlowRunnerManagerMBean.java
@@ -52,4 +52,4 @@ public interface JmxFlowRunnerManagerMBean {
@DisplayName("OPERATION: getTotalNumExecutedFlows")
public int getTotalNumExecutedFlows();
-}
+}
\ No newline at end of file
diff --git a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ExecutorServlet.java b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ExecutorServlet.java
index 21319d7..c5ae77c 100644
--- a/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ExecutorServlet.java
+++ b/azkaban-webserver/src/main/java/azkaban/webapp/servlet/ExecutorServlet.java
@@ -27,14 +27,12 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.apache.log4j.Logger;
-
import azkaban.executor.ExecutableFlow;
import azkaban.executor.ExecutableFlowBase;
import azkaban.executor.ExecutableNode;
import azkaban.executor.ExecutionOptions;
-import azkaban.executor.ExecutionOptions.FailureAction;
import azkaban.executor.ExecutorManagerAdapter;
+import azkaban.executor.ExecutionOptions.FailureAction;
import azkaban.executor.ExecutorManagerException;
import azkaban.executor.Status;
import azkaban.flow.Flow;
@@ -46,8 +44,8 @@ import azkaban.scheduler.ScheduleManagerException;
import azkaban.server.HttpRequestUtils;
import azkaban.server.session.Session;
import azkaban.user.Permission;
-import azkaban.user.Permission.Type;
import azkaban.user.User;
+import azkaban.user.Permission.Type;
import azkaban.utils.FileIOUtils.LogData;
import azkaban.webapp.AzkabanWebServer;
import azkaban.webapp.plugin.PluginRegistry;
@@ -55,9 +53,6 @@ import azkaban.webapp.plugin.ViewerPlugin;
public class ExecutorServlet extends LoginAbstractAzkabanServlet {
private static final long serialVersionUID = 1L;
-
- private static final Logger logger = Logger.getLogger(ExecutorServlet.class);
-
private ProjectManager projectManager;
private ExecutorManagerAdapter executorManager;
private ScheduleManager scheduleManager;
@@ -354,7 +349,7 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
/**
* Gets the logs through plain text stream to reduce memory overhead.
- *
+ *
* @param req
* @param resp
* @param user
@@ -394,7 +389,7 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
/**
* Gets the logs through ajax plain text stream to reduce memory overhead.
- *
+ *
* @param req
* @param resp
* @param user
@@ -714,7 +709,7 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
HttpServletResponse resp, HashMap<String, Object> ret, User user,
ExecutableFlow exFlow) throws ServletException {
Long lastUpdateTime = Long.parseLong(getParam(req, "lastUpdateTime"));
- logger.info("Fetching " + exFlow.getExecutionId());
+ System.out.println("Fetching " + exFlow.getExecutionId());
Project project =
getProjectAjaxByPermission(ret, exFlow.getProjectId(), user, Type.READ);
@@ -734,7 +729,7 @@ public class ExecutorServlet extends LoginAbstractAzkabanServlet {
private void ajaxFetchExecutableFlow(HttpServletRequest req,
HttpServletResponse resp, HashMap<String, Object> ret, User user,
ExecutableFlow exFlow) throws ServletException {
- logger.info("Fetching " + exFlow.getExecutionId());
+ System.out.println("Fetching " + exFlow.getExecutionId());
Project project =
getProjectAjaxByPermission(ret, exFlow.getProjectId(), user, Type.READ);
diff --git a/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/executionspage.vm b/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/executionspage.vm
index 288b5e6..49d1085 100644
--- a/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/executionspage.vm
+++ b/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/executionspage.vm
@@ -22,12 +22,19 @@
#parse("azkaban/webapp/servlet/velocity/javascript.vm")
<script type="text/javascript" src="${context}/js/azkaban/view/executions.js"></script>
+ <script type="text/javascript" src="${context}/js/jquery/jquery.tablesorter.js"></script>
<script type="text/javascript">
var contextURL = "${context}";
var currentTime = ${currentTime};
var timezone = "${timezone}";
var errorMessage = null;
var successMessage = null;
+
+
+ $(document).ready(function () {
+ var jobTable = $("#executingJobs");
+ jobTable.tablesorter();
+ });
</script>
</head>
<body>
@@ -59,6 +66,7 @@
<table id="executingJobs" class="table table-striped table-bordered table-hover table-condensed executions-table">
<thead>
<tr>
+ <th>#</th>
<th class="execid">Execution Id</th>
<th>Flow</th>
<th>Project</th>
@@ -75,6 +83,9 @@
#if ($runningFlows)
#foreach ($flow in $runningFlows)
<tr>
+ <td class="tb-name">
+ $velocityCount
+ </td>
<td class="tb-name">
<a href="${context}/executor?execid=${flow.executionId}">${flow.executionId}</a>
</td>
@@ -106,6 +117,7 @@
<table id="recentlyFinished" class="table table-striped table-bordered table-hover table-condensed executions-table">
<thead>
<tr>
+ <th>#</th>
<th class="execid">Execution Id</th>
<th>Flow</th>
<th>Project</th>
@@ -122,6 +134,9 @@
#if ($recentlyFinished.isEmpty())
#foreach ($flow in $recentlyFinished)
<tr>
+ <td class="tb-name">
+ $velocityCount
+ </td>
<td class="tb-name execId">
<a href="${context}/executor?execid=${flow.executionId}">${flow.executionId}</a>
</td>
diff --git a/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/historypage.vm b/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/historypage.vm
index 16d4c87..548460c 100644
--- a/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/historypage.vm
+++ b/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/historypage.vm
@@ -26,10 +26,16 @@
<script type="text/javascript" src="${context}/js/moment.min.js"></script>
<script type="text/javascript" src="${context}/js/bootstrap-datetimepicker.min.js"></script>
<script type="text/javascript" src="${context}/js/azkaban/view/history.js"></script>
+ <script type="text/javascript" src="${context}/js/jquery/jquery.tablesorter.js"></script>
<script type="text/javascript">
var contextURL = "${context}";
var currentTime = ${currentTime};
var timezone = "${timezone}";
+
+ $(document).ready(function () {
+ var jobTable = $("#executingJobs");
+ jobTable.tablesorter();
+ });
</script>
</head>
<body>
@@ -76,6 +82,7 @@
<table id="executingJobs" class="table table-striped table-bordered table-hover table-condensed executions-table">
<thead>
<tr>
+ <th>#</th>
<th class="execid">Execution Id</th>
<th>Flow</th>
<th>Project</th>
@@ -91,6 +98,9 @@
#if (!$flowHistory.isEmpty())
#foreach ($flow in $flowHistory)
<tr>
+ <td class="tb-name">
+ $velocityCount
+ </td>
<td class="tb-name execId">
<a href="${context}/executor?execid=${flow.executionId}">${flow.executionId}</a>
</td>
diff --git a/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/scheduledflowpage.vm b/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/scheduledflowpage.vm
index 6e7c61b..6657fb1 100644
--- a/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/scheduledflowpage.vm
+++ b/azkaban-webserver/src/main/resources/azkaban/webapp/servlet/velocity/scheduledflowpage.vm
@@ -29,12 +29,18 @@
<script type="text/javascript" src="${context}/js/azkaban/view/schedule-sla.js"></script>
<script type="text/javascript" src="${context}/js/azkaban/view/scheduled.js"></script>
<script type="text/javascript" src="${context}/js/azkaban/util/schedule.js"></script>
+ <script type="text/javascript" src="${context}/js/jquery/jquery.tablesorter.js"></script>
<script type="text/javascript">
var contextURL = "${context}";
var currentTime = ${currentTime};
var timezone = "${timezone}";
var errorMessage = null;
var successMessage = null;
+
+ $(document).ready(function () {
+ var flowTable = $("#scheduledFlowsTbl");
+ flowTable.tablesorter();
+ });
</script>
</head>
<body>
@@ -66,6 +72,7 @@
<thead>
<tr>
<!--th class="execid">Execution Id</th-->
+ <th>#</th>
<th>ID</th>
<th>Flow</th>
<th>Project</th>
@@ -81,6 +88,9 @@
#if(!$schedules.isEmpty())
#foreach($sched in $schedules)
<tr>
+ <td class="tb-name">
+ $velocityCount
+ </td>
<td>${sched.scheduleId}</td>
<td class="tb-name">
<a href="${context}/manager?project=${sched.projectName}&flow=${sched.flowName}">${sched.flowName}</a>