You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by bu...@apache.org on 2019/10/29 20:49:19 UTC
svn commit: r1869129 - in
/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws:
handlers/experiments/ handlers/utilities/ xd/
Author: burn
Date: Tue Oct 29 20:49:19 2019
New Revision: 1869129
URL: http://svn.apache.org/viewvc?rev=1869129&view=rev
Log:
UIMA-6130 Drop the IExperiment interface; fix timing bug when displaying the 'restarting' page
Removed:
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/IExperiment.java
Modified:
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/handlers/experiments/HandlerExperimentsServlets.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/handlers/utilities/HandlersUtilities.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/Experiment.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/ExperimentsRegistryManager.java
uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/ExperimentsRegistryUtilities.java
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/handlers/experiments/HandlerExperimentsServlets.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/handlers/experiments/HandlerExperimentsServlets.java?rev=1869129&r1=1869128&r2=1869129&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/handlers/experiments/HandlerExperimentsServlets.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/handlers/experiments/HandlerExperimentsServlets.java Tue Oct 29 20:49:19 2019
@@ -47,7 +47,7 @@ import org.apache.uima.ducc.ws.utils.For
import org.apache.uima.ducc.ws.utils.FormatServletScroll;
import org.apache.uima.ducc.ws.utils.HandlersHelper;
import org.apache.uima.ducc.ws.utils.HandlersHelper.AuthorizationStatus;
-import org.apache.uima.ducc.ws.xd.IExperiment;
+import org.apache.uima.ducc.ws.xd.Experiment;
import org.apache.uima.ducc.ws.xd.ExperimentsRegistryManager;
import org.apache.uima.ducc.ws.xd.ExperimentsRegistryUtilities;
import org.apache.uima.ducc.ws.xd.Jed;
@@ -81,7 +81,7 @@ public class HandlerExperimentsServlets
super.init(duccWebServer);
}
- private String getStartDate(HttpServletRequest request, IExperiment experiment) {
+ private String getStartDate(HttpServletRequest request, Experiment experiment) {
String startDate = "";
if (experiment.getStartDate() != null) {
startDate = experiment.getStartDate();
@@ -91,7 +91,7 @@ public class HandlerExperimentsServlets
return startDate;
}
- private long getRunTime(HttpServletRequest request, IExperiment experiment) {
+ private long getRunTime(HttpServletRequest request, Experiment experiment) {
long runTime = 0;
ArrayList<Task> tasks = experiment.getTasks();
for (Task task : tasks) {
@@ -114,7 +114,7 @@ public class HandlerExperimentsServlets
return runTime;
}
- private String fmtDuration(IExperiment experiment, long runTime) {
+ private String fmtDuration(Experiment experiment, long runTime) {
StringBuffer db = new StringBuffer();
Status experimentStatus = experiment.getStatus();
String health = experimentStatus==Status.Running ? "class=\"health_green\"" : "class=\"health_black\"";
@@ -126,7 +126,7 @@ public class HandlerExperimentsServlets
return db.toString();
}
- private String getUser(HttpServletRequest request, IExperiment experiment) {
+ private String getUser(HttpServletRequest request, Experiment experiment) {
String user = "";
if (experiment.getUser() != null) {
user = experiment.getUser();
@@ -134,7 +134,7 @@ public class HandlerExperimentsServlets
return user;
}
- private String getState(HttpServletRequest request, IExperiment experiment) {
+ private String getState(HttpServletRequest request, Experiment experiment) {
String health;
Status experimentStatus = experiment.getStatus();
switch (experimentStatus) {
@@ -154,7 +154,7 @@ public class HandlerExperimentsServlets
return state;
}
- private String getDirectoryLink(HttpServletRequest request, IExperiment experiment) {
+ private String getDirectoryLink(HttpServletRequest request, Experiment experiment) {
String directory = experiment.getDirectory();
String href = "href='experiment.details.html?dir=" + directory + "'";
String directoryLink = "<a" + " " + href + " " + ">" + directory + "</a>";
@@ -175,7 +175,7 @@ public class HandlerExperimentsServlets
ArrayList<String> users = HandlersUtilities.getExperimentsUsers(request);
// List experiments in "experiment" order: active, newest start-date, directory
- for (IExperiment experiment : experimentsRegistryManager.getMapByStatus().keySet()) {
+ for (Experiment experiment : experimentsRegistryManager.getMapByStatus().keySet()) {
boolean fullTable = fmt.numRows() >= maxRecords;
@@ -240,10 +240,14 @@ public class HandlerExperimentsServlets
}
// TODO - Might be nice to mark the top-level tasks as "Restarting"
- private String decorateState(IExperiment experiment, Task task, boolean isRestartable, boolean isCanceled) {
+ private String decorateState(Experiment experiment, Task task, boolean isRestartable, boolean isCanceled) {
String mName = "decorateState";
String state = "";
- if (task.status != null) {
+ if (task.status == null) {
+ if (task.rerun) { // If status has been cleared the task may be about to be rerun
+ state = "<span class=\"health_green\">Rerun";
+ }
+ } else {
state = task.status;
// If experiment has been canceled change any "Running" tasks to "Canceled"
Jed.Status status = Jed.Status.getEnum(state);
@@ -367,7 +371,7 @@ public class HandlerExperimentsServlets
return sbuff.toString();
}
- private void edTaskDucc(FormatServlet fmt, IExperiment experiment, Task task,
+ private void edTaskDucc(FormatServlet fmt, Experiment experiment, Task task,
HttpServletRequest request, long duccId, long now, boolean isRestartable, boolean isCanceled) {
DuccData duccData = DuccData.getInstance();
@@ -428,12 +432,18 @@ public class HandlerExperimentsServlets
WsLog.enter(cName, mName);
boolean handled = false;
+ boolean restart = false;
long now = System.currentTimeMillis();
FormatServlet fmt = tableStyle.equals("scroll") ? new FormatServletScroll() : new FormatServletClassic();
String dir = request.getParameter("dir");
- IExperiment experiment = experimentsRegistryManager.getExperiment(dir);
+ Experiment experiment = experimentsRegistryManager.getExperiment(dir);
if (experiment != null) {
+ // If restart requested update the tasks to be rerun
+ restart = request.getParameter("restart") != null;
+ if (restart) {
+ experiment.updateStatus();
+ }
// Check if the experiment can be restarted, i.e.
// launched by DUCC as a JED AP, stopped, and owned by the logged-in user
boolean isRestartable = experiment.getJedDuccId() != null
@@ -452,10 +462,12 @@ public class HandlerExperimentsServlets
task.rerun = !task.rerun;
markSubtasks(tasks, toggleId, task.rerun);
}
- // Find the latest duccId to display for a task ... omit if not started or has been reset for a rerun
+ // Find the latest duccId to display for a task ... omit if not started or is being rerun
+ // i.e. display it if has been run and is not marked to be rerun or is marked but not yet restarted
for (Task task : tasks) {
long latestDuccId = 0;
- if (task.status != null && !task.rerun) {
+ // Omit if: task.status==null || (task.rerun && !isRestartable)
+ if (task.status != null && (!task.rerun || isRestartable)) {
Jed.Type jedType = Jed.Type.getEnum(task.type);
if (jedType == Jed.Type.Ducc_Job || jedType == Jed.Type.Java) {
long[] duccIds = task.duccId;
@@ -485,12 +497,11 @@ public class HandlerExperimentsServlets
// Restart the experiment AFTER the page has been generated
// Don't trigger on the restart state of the experiment as do't want to launch on every page refresh
// If restart fails clear the restarting state
- boolean restart = request.getParameter("restart") != null;
if (restart) {
boolean ok = ExperimentsRegistryUtilities.launchJed(experiment);
if (!ok) {
- WsLog.warn(cName, mName, "Failed to relaunch JED - reset state");
- experiment.updateStatus(null);
+ WsLog.warn(cName, mName, "Failed to relaunch JED - reset the is-rerunning state");
+ experiment.setRerunJedId(null);
}
}
@@ -530,7 +541,7 @@ public class HandlerExperimentsServlets
boolean restart = false;
- IExperiment experiment = experimentsRegistryManager.getExperiment(directory);
+ Experiment experiment = experimentsRegistryManager.getExperiment(directory);
if (experiment != null) {
// Display Terminate/Restart button if DUCC-launched && the owner logged in
@@ -538,8 +549,8 @@ public class HandlerExperimentsServlets
if (experiment.getJedDuccId() != null &&
HandlersHelper.getAuthorizationStatus(request, experiment.getUser()) == AuthorizationStatus.LoggedInOwner) {
restart = request.getParameter("restart") != null;
- if (restart) { // Update the state of the tasks for the restart ... DuccId not known yet
- experiment.updateStatus("?");
+ if (restart) { // Mark as "restarting" ... correct ID will be set later
+ experiment.setRerunJedId("");
}
Status status = experiment.getStatus();
// TODO - If still restarting should check if the restartJedId AP is actually running
@@ -587,7 +598,7 @@ public class HandlerExperimentsServlets
StringBuffer sb = new StringBuffer();
String directory = request.getParameter("dir");
- IExperiment experiment = experimentsRegistryManager.getExperiment(directory);
+ Experiment experiment = experimentsRegistryManager.getExperiment(directory);
String resourceOwnerUserId = experiment.getUser();
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/handlers/utilities/HandlersUtilities.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/handlers/utilities/HandlersUtilities.java?rev=1869129&r1=1869128&r2=1869129&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/handlers/utilities/HandlersUtilities.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/handlers/utilities/HandlersUtilities.java Tue Oct 29 20:49:19 2019
@@ -38,7 +38,7 @@ import org.apache.uima.ducc.ws.server.Du
import org.apache.uima.ducc.ws.server.DuccCookies.DateStyle;
import org.apache.uima.ducc.ws.server.DuccLocalConstants;
import org.apache.uima.ducc.ws.server.DuccLocalCookies;
-import org.apache.uima.ducc.ws.xd.IExperiment;
+import org.apache.uima.ducc.ws.xd.Experiment;
public class HandlersUtilities {
@@ -101,7 +101,7 @@ public class HandlersUtilities {
}
public static final boolean isListable(HttpServletRequest request, ArrayList<String> users,
- boolean fullTable, IExperiment handle) {
+ boolean fullTable, Experiment handle) {
boolean list = false;
DuccCookies.FilterUsersStyle filterUsersStyle = DuccCookies.getFilterUsersStyle(request);
if (!users.isEmpty()) {
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/Experiment.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/Experiment.java?rev=1869129&r1=1869128&r2=1869129&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/Experiment.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/Experiment.java Tue Oct 29 20:49:19 2019
@@ -35,7 +35,7 @@ import org.apache.uima.ducc.ws.log.WsLog
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
-public class Experiment implements IExperiment {
+public class Experiment implements Comparable<Experiment> {
private static DuccLogger logger = DuccLogger.getLogger(Experiment.class);
@@ -47,9 +47,9 @@ public class Experiment implements IExpe
private long fileDate = 0;
- private DuccId jedDuccId;
+ private DuccId jedDuccId; // ID of JED task that last launched this experiment
- private String restartJedId = null; // ID of re-launched JED
+ private String rerunJedId = null; // ID of re-launched JED
public Experiment(String user, String directory, long fileDate, ArrayList<Task> tasks, IDuccWork work) {
@@ -63,40 +63,33 @@ public class Experiment implements IExpe
}
}
- @Override
public String getUser() {
return user;
}
- @Override
public String getDirectory() {
return directory;
}
- @Override
public long getFileDate() {
return fileDate;
}
- @Override
public ArrayList<Task> getTasks() {
return tasks;
}
- @Override
public DuccId getJedDuccId() {
return jedDuccId;
}
// Update the duccId for the JED AP if missing or is older
- @Override
public void updateJedId(DuccId duccId) {
if (jedDuccId == null || jedDuccId.getFriendly() < duccId.getFriendly()) {
jedDuccId = duccId;
}
}
- @Override
public boolean isActive() {
boolean retVal = false;
switch (getStatus()) {
@@ -112,10 +105,9 @@ public class Experiment implements IExpe
// TODO - the experiment status could be determined in the constructor but the restarting state can change
// The restarting state is NOT saved in the Experiment.state file
- @Override
public Jed.Status getStatus() {
Jed.Status retVal = Jed.Status.Unknown;
- if (restartJedId != null) {
+ if (rerunJedId != null) {
return Jed.Status.Restarting;
}
if (tasks != null) {
@@ -165,40 +157,43 @@ public class Experiment implements IExpe
}
/*
- * Set/clear the restarting status of the experiment
- * When restarting is initially requested the ID is not available,
- * it is provided when launchJed succeeds.
+ * Set the status of the tasks to be rerun
*/
- @Override
- public void updateStatus(String restartJedId) {
- String mName = "updateStatus";
- WsLog.info(logger, mName, "Restart JED ID = " + restartJedId);
- this.restartJedId = restartJedId;
- if (restartJedId != null) {
- for (Task task : tasks) {
- if (task.rerun) {
- task.status = null;
- if (Jed.Type.isLeaf(task.type)) { // Times are not accumulated for primitive tasks
- task.startTime = null;
- task.runTime = 0;
- }
+ public void updateStatus() {
+ for (Task task : tasks) {
+ if (task.rerun) {
+ task.status = null;
+ if (Jed.Type.isLeaf(task.type)) { // Times are not accumulated for primitive tasks
+ task.startTime = null;
+ task.runTime = 0;
}
}
}
+ setRerunJedId(""); // Mark as "restarting" ... correct ID will be set later
+ }
+
+ public void setRerunJedId(String rerunJedId) {
+ String mName = "setRerunJedId";
+ if (rerunJedId != null && this.rerunJedId != null && this.rerunJedId.length() > 0) {
+ WsLog.warn(logger, mName, "JED ID was " + this.rerunJedId + " but is now " + rerunJedId);
+ }
+ this.rerunJedId = rerunJedId;
}
/*
- * Write the state as a temporary file,
+ * Write the state as a temporary file (starting with the version number)
* as the user copy it to the output directory,
* delete the temp file.
*/
- @Override
public boolean writeStateFile(String umask) {
+ int version = 1;
File tempFile = null;
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create();
try {
tempFile = File.createTempFile("experiment", jedDuccId.toString());
FileWriter out = new FileWriter(tempFile);
+ out.write(String.valueOf(version));
+ out.write('\n');
String text = gson.toJson(tasks);
out.write(text);
out.close();
@@ -238,7 +233,6 @@ public class Experiment implements IExpe
return retVal;
}
- @Override
public String getStartDate() {
String retVal = "";
long experimentStartMillis = Long.MAX_VALUE;
@@ -259,7 +253,6 @@ public class Experiment implements IExpe
private long staleTime = 1000 * 60 * 6;
- @Override
public boolean isStale() {
// If the log lock file has been removed then the driver has stopped.
// If the lock file is still present the driver may have been killed, so check the age of the state file.
@@ -291,7 +284,7 @@ public class Experiment implements IExpe
* Sort active experiments first, then by start date (newest first) then by directory
*/
@Override
- public int compareTo(IExperiment that) {
+ public int compareTo(Experiment that) {
// Booleans sort false before true so must reverse and compare that with this
int retVal = new Boolean(that.isActive()).compareTo(new Boolean(this.isActive())); // active first
if (retVal == 0) {
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/ExperimentsRegistryManager.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/ExperimentsRegistryManager.java?rev=1869129&r1=1869128&r2=1869129&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/ExperimentsRegistryManager.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/ExperimentsRegistryManager.java Tue Oct 29 20:49:19 2019
@@ -56,13 +56,13 @@ public class ExperimentsRegistryManager
private Set<String> seenDirs = new HashSet<String>(); // Set of directories seen when booting or during an OR publication
- private Map<String, IExperiment> experimentsByDir = new ConcurrentHashMap<String,IExperiment>();
+ private Map<String, Experiment> experimentsByDir = new ConcurrentHashMap<String,Experiment>();
public static ExperimentsRegistryManager getInstance() {
return instance;
}
- public IExperiment getExperiment(String directory) {
+ public Experiment getExperiment(String directory) {
return experimentsByDir.get(directory);
}
@@ -161,7 +161,7 @@ public class ExperimentsRegistryManager
// Check if state file is newer than any existing one
// If newer refresh it, otherwise just update the JED duccId in case it is a newer AP
- IExperiment existingExperiment = experimentsByDir.get(directory);
+ Experiment existingExperiment = experimentsByDir.get(directory);
if (existingExperiment != null) {
// Synchronize the check for a newer state file with the rewrite of the file in Experiment.writeStateFile
// to ensure that the rewritten file does does not look newer that the in-memory Experiment
@@ -193,8 +193,8 @@ public class ExperimentsRegistryManager
Type typeOfTaskList = new TypeToken<ArrayList<Task>>(){}.getType();
try {
ArrayList<Task> taskArray = gson.fromJson(sr, typeOfTaskList);
- IExperiment experiment = new Experiment(user, directory, fileTime, taskArray, work);
- IExperiment oldExperiment = experimentsByDir.put(directory, experiment);
+ Experiment experiment = new Experiment(user, directory, fileTime, taskArray, work);
+ Experiment oldExperiment = experimentsByDir.put(directory, experiment);
if (oldExperiment != null) {
experiment.updateJedId(oldExperiment.getJedDuccId()); // Ensure the new instance has the latest DuccId
}
@@ -204,9 +204,9 @@ public class ExperimentsRegistryManager
}
// Create map ordered by experiment: active, newest start date, directory
- public TreeMap<IExperiment, String> getMapByStatus() {
- TreeMap<IExperiment, String> mapInverse = new TreeMap<IExperiment, String>();
- for (Entry<String, IExperiment> entry : experimentsByDir.entrySet()) {
+ public TreeMap<Experiment, String> getMapByStatus() {
+ TreeMap<Experiment, String> mapInverse = new TreeMap<Experiment, String>();
+ for (Entry<String, Experiment> entry : experimentsByDir.entrySet()) {
mapInverse.put(entry.getValue(), entry.getKey());
}
return mapInverse;
@@ -215,8 +215,8 @@ public class ExperimentsRegistryManager
// Create map from file last update time to directory ordered oldest first
private TreeMap<Long, String> getMapByDate() {
TreeMap<Long, String> mapByDate = new TreeMap<Long, String>();
- for (Entry<String, IExperiment> entry : experimentsByDir.entrySet()) {
- IExperiment experiment = entry.getValue();
+ for (Entry<String, Experiment> entry : experimentsByDir.entrySet()) {
+ Experiment experiment = entry.getValue();
mapByDate.put(experiment.getFileDate(), entry.getKey());
}
return mapByDate;
@@ -234,7 +234,7 @@ public class ExperimentsRegistryManager
WsLog.info(cName, mName, "Pruning " + excess + " old experiments");
TreeMap<Long, String> mapByDate = getMapByDate();
for (String directory : mapByDate.values()) {
- IExperiment experiment = experimentsByDir.get(directory);
+ Experiment experiment = experimentsByDir.get(directory);
if (!experiment.isActive()) {
WsLog.info(cName, mName, "Pruned " + directory + " filetime " + experiment.getFileDate());
experimentsByDir.remove(directory);
Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/ExperimentsRegistryUtilities.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/ExperimentsRegistryUtilities.java?rev=1869129&r1=1869128&r2=1869129&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/ExperimentsRegistryUtilities.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/xd/ExperimentsRegistryUtilities.java Tue Oct 29 20:49:19 2019
@@ -83,7 +83,7 @@ public class ExperimentsRegistryUtilitie
}
}
- public static boolean launchJed(IExperiment experiment) {
+ public static boolean launchJed(Experiment experiment) {
String mName = "launchJed";
IHistoryPersistenceManager hpm = HistoryFactory.getInstance(ExperimentsRegistryUtilities.class.getName());
@@ -128,7 +128,6 @@ public class ExperimentsRegistryUtilitie
for (String arg : cmd.getArguments()) {
args.append(arg).append(' ');
}
- args.append("--DRIVER.rerunTasks=~"); // Override any initial rerun list
StringBuilder envs = new StringBuilder();
if (cmd instanceof ACommandLine) {
for (Entry<String, String> ent : ((ACommandLine) cmd).getEnvironment().entrySet()) {
@@ -162,18 +161,15 @@ public class ExperimentsRegistryUtilitie
String sysout = DuccAsUser.execute(experiment.getUser(), null, submitCmd);
WsLog.info(cName, mName, sysout);
- // If launch failed clear the Experiment's "Restarting" state
// Should report: "Managed Reservation ### submitted."
// If successful save the ID of JED
- // If fails reset the status
+ // If it fails return false and the status will be reset by the caller
boolean launched = sysout.startsWith("Managed Reservation");
if (launched) {
String[] toks = sysout.split("\\s+");
if (toks.length >= 3) {
- experiment.updateStatus(toks[2]);
+ experiment.setRerunJedId(toks[2]);
}
- } else {
- experiment.updateStatus(null);
}
return launched;