Перенос.
This commit is contained in:
58
src/GlobalData/Tasks/Supervisor/Remote/MVSRunSupervisor.java
Normal file
58
src/GlobalData/Tasks/Supervisor/Remote/MVSRunSupervisor.java
Normal file
@@ -0,0 +1,58 @@
|
||||
package GlobalData.Tasks.Supervisor.Remote;
|
||||
import Common.Current;
|
||||
import Common.Utils.Utils;
|
||||
import GlobalData.RemoteFile.RemoteFile;
|
||||
import GlobalData.Tasks.QueueSystem.MVS;
|
||||
import GlobalData.Tasks.TaskState;
|
||||
public class MVSRunSupervisor extends ServerRunSupervisor {
|
||||
MVS mvs = new MVS();
|
||||
int mvs_time;
|
||||
@Override
|
||||
protected RemoteFile getRemoteOutput() {
|
||||
return new RemoteFile(getRemoteProject().full_name + "/" + task.PID, "output");
|
||||
}
|
||||
@Override
|
||||
protected RemoteFile getRemoteErrors() {
|
||||
return new RemoteFile(getRemoteProject().full_name + "/" + task.PID, "errors");
|
||||
}
|
||||
@Override
|
||||
protected String getLaunchScriptText() {
|
||||
return task.getFullCommand();
|
||||
}
|
||||
@Override
|
||||
protected int getTaskCheckPeriod() {
|
||||
return 5;
|
||||
}
|
||||
@Override
|
||||
public int getMaxtime() {
|
||||
return mvs_time * 60;
|
||||
}
|
||||
@Override
|
||||
protected void StartTask() throws Exception {
|
||||
String env = String.join(" ", Current.getRunConfiguration().getEnvList());
|
||||
mvs_time = (task.maxtime / 60); //в минутах
|
||||
if (task.maxtime % 60 > 0) mvs_time += 1;
|
||||
String res = "maxtime=" + Utils.DQuotes(mvs_time) + " ./run";
|
||||
if (!env.isEmpty())
|
||||
res = env + " " + res;
|
||||
mvs.enqueueTask(pass.ShellCommand(
|
||||
"cd " + Utils.DQuotes(getRemoteProject().full_name),
|
||||
res), task);
|
||||
}
|
||||
@Override
|
||||
protected boolean isTaskActive() {
|
||||
return super.isTaskActive() || task.state.equals(TaskState.Queued);
|
||||
}
|
||||
@Override
|
||||
protected void CheckTask() throws Exception {
|
||||
mvs.checkTask(pass.ShellCommand(mvs.getCheckTaskCommand(task)), task);
|
||||
}
|
||||
@Override
|
||||
protected void AbortTask() throws Exception {
|
||||
pass.ShellCommand(mvs.getCancelTaskCommand(task));
|
||||
}
|
||||
@Override
|
||||
protected void CalculatePerformanceTime() throws Exception {
|
||||
task.Time = performanceTime;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package GlobalData.Tasks.Supervisor.Remote;
|
||||
import Common.Utils.Utils;
|
||||
import GlobalData.Makefile.Makefile;
|
||||
import GlobalData.RemoteFile.RemoteFile;
|
||||
import GlobalData.Tasks.CompilationTask.CompilationTask;
|
||||
import GlobalData.Tasks.TaskState;
|
||||
|
||||
import java.io.File;
|
||||
public class RemoteCompilationSupervisor extends RemoteTaskSupervisor<CompilationTask> {
|
||||
@Override
|
||||
protected void PrepareWorkspace() throws Exception {
|
||||
//0. если нет папки с его именем создаем.
|
||||
pass.tryMKDir(getRemoteProject());
|
||||
pass.SynchronizeProjectSubDirsR(project, project.Home, getRemoteProject(), false);
|
||||
pass.tryRM(getBinary());
|
||||
if (!task.binary_name.isEmpty()) {
|
||||
RemoteFile old_binary = new RemoteFile(getRemoteProject().full_name, task.binary_name);
|
||||
pass.tryRM(old_binary);
|
||||
}
|
||||
//отправить мейкфайл.
|
||||
Makefile makefile = task.getMakefile();
|
||||
File makefile_text = Utils.CreateTempFile("makefile", makefile.Generate(project));
|
||||
pass.putSingleFile(makefile_text, new RemoteFile(getRemoteProject().full_name, "Makefile"));
|
||||
//очистить все что связано с gcov
|
||||
//файлы gcda, gcno, gcov
|
||||
pass.deleteFilesByExtensions(getRemoteProject(), "gcda", "gcno", "gcov");
|
||||
//очистить служебные файлы.
|
||||
super.PrepareWorkspace();
|
||||
}
|
||||
@Override
|
||||
protected void StartTask() throws Exception {
|
||||
//UI.Info("starting task");
|
||||
task.PID = pass.ShellCommand(
|
||||
"cd " + Utils.DQuotes(getRemoteProject().full_name),
|
||||
getStartCommand());
|
||||
task.state = TaskState.Running;
|
||||
}
|
||||
@Override
|
||||
protected void ValidateTaskResults() throws Exception {
|
||||
if (pass.Exists(getRemoteProject().full_name, getBinary().name)) {
|
||||
RemoteFile renamed_binary = new RemoteFile(getRemoteProject().full_name, Utils.getDateName("spf_" + getBinary().name));
|
||||
pass.sftpChannel.rename(getBinary().full_name, renamed_binary.full_name);
|
||||
task.binary_name = renamed_binary.name;
|
||||
task.state = TaskState.Done;
|
||||
} else task.state = TaskState.DoneWithErrors;
|
||||
task.AnalyzeResultsTexts(project);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package GlobalData.Tasks.Supervisor.Remote;
|
||||
import Common.Utils.Utils;
|
||||
import GlobalData.RemoteFile.RemoteFile;
|
||||
import GlobalData.Tasks.Supervisor.TaskSupervisor;
|
||||
import GlobalData.Tasks.Task;
|
||||
import GlobalData.Tasks.TaskState;
|
||||
import ProjectData.Project.db_project_info;
|
||||
import Visual_DVM_2021.Passes.SSH.ConnectionPass;
|
||||
public abstract class RemoteTaskSupervisor<T extends Task> extends TaskSupervisor<T, ConnectionPass> {
|
||||
protected RemoteFile getRemoteProjectsPath() {
|
||||
return new RemoteFile(pass.user.getRemoteProjectsPath(), true);
|
||||
}
|
||||
protected RemoteFile getRemoteProject() {
|
||||
return new RemoteFile(getRemoteProjectsPath().full_name, project.getUniqKey(), true);
|
||||
}
|
||||
protected RemoteFile getBinary() {
|
||||
return new RemoteFile(getRemoteProject().full_name, "0");
|
||||
}
|
||||
protected RemoteFile getRemoteTime() {
|
||||
return new RemoteFile(getRemoteProject().full_name, db_project_info.time_file);
|
||||
}
|
||||
protected RemoteFile getRemoteOutput() {
|
||||
return new RemoteFile(getRemoteProject().full_name, db_project_info.out_file);
|
||||
}
|
||||
protected RemoteFile getRemoteErrors() {
|
||||
return new RemoteFile(getRemoteProject().full_name, db_project_info.err_file);
|
||||
}
|
||||
public RemoteFile getDONE_file() {
|
||||
return new RemoteFile(getRemoteProject().full_name, db_project_info.DONE);
|
||||
}
|
||||
public RemoteFile getTIMEOUT_file() {
|
||||
return new RemoteFile(getRemoteProject().full_name, db_project_info.TIMEOUT);
|
||||
}
|
||||
@Override
|
||||
protected void PrepareWorkspace() throws Exception {
|
||||
super.PrepareWorkspace(); //локальная подготовка
|
||||
pass.tryRM(getDONE_file());
|
||||
pass.tryRM(getTIMEOUT_file());
|
||||
pass.tryRM(getRemoteOutput());
|
||||
pass.tryRM(getRemoteErrors());
|
||||
pass.tryRM(getRemoteTime());
|
||||
}
|
||||
@Override
|
||||
protected void CheckTask() throws Exception {
|
||||
if (pass.Exists(getRemoteProject().full_name, db_project_info.DONE))
|
||||
task.state = TaskState.Finished;
|
||||
else if (pass.Exists(getRemoteProject().full_name, db_project_info.TIMEOUT))
|
||||
task.state = TaskState.AbortedByTimeout;
|
||||
}
|
||||
@Override
|
||||
protected void AchieveResults() throws Exception {
|
||||
pass.tryGetSingleFile(getRemoteOutput(), task.getOutputFile(), 10240);
|
||||
pass.tryGetSingleFile(getRemoteErrors(), task.getErrorsFile(), 10240);
|
||||
}
|
||||
@Override
|
||||
protected void AbortTask() throws Exception {
|
||||
pass.ShellCommand("kill -2 " + task.PID);
|
||||
}
|
||||
@Override
|
||||
protected void CalculatePerformanceTime() throws Exception {
|
||||
if (pass.tryGetSingleFile(getRemoteTime(), task.getTimeFile(), 0))
|
||||
task.RefreshTime();
|
||||
}
|
||||
protected String getStartCommand() {
|
||||
String res =
|
||||
String.join(" ",
|
||||
Utils.DQuotes(pass.getStarter()),
|
||||
Utils.DQuotes(pass.getLauncher()),
|
||||
String.valueOf(task.maxtime),
|
||||
Utils.DQuotes(getCoupDeGrace()),
|
||||
task.getFullCommand()
|
||||
);
|
||||
System.out.println(res);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package GlobalData.Tasks.Supervisor.Remote;
|
||||
import Common.Current;
|
||||
import Common.Utils.Utils;
|
||||
import GlobalData.RemoteFile.RemoteFile;
|
||||
import GlobalData.Tasks.RunTask.RunTask;
|
||||
import GlobalData.Tasks.TaskState;
|
||||
import com.jcraft.jsch.ChannelSftp;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Vector;
|
||||
public class ServerRunSupervisor extends RemoteTaskSupervisor<RunTask> {
|
||||
@Override
|
||||
protected void StartTask() throws Exception {
|
||||
String res = "./run";
|
||||
String env = String.join(" ", Current.getRunConfiguration().getEnvList());
|
||||
if (!env.isEmpty()) res = env + " " + res;
|
||||
task.PID = pass.ShellCommand(
|
||||
"cd " + Utils.DQuotes(getRemoteProject().full_name),
|
||||
"ulimit -s unlimited",
|
||||
res);
|
||||
task.state = TaskState.Running;
|
||||
}
|
||||
@Override
|
||||
protected void ValidateTaskResults() throws Exception {
|
||||
task.AnalyzeResultsTexts(project);
|
||||
}
|
||||
@Override
|
||||
protected void PrepareWorkspace() throws Exception {
|
||||
super.PrepareWorkspace();
|
||||
//-------------------------
|
||||
//удалить старую статистику если оная есть.
|
||||
if (!task.last_sts_name.isEmpty()) {
|
||||
pass.tryRM(new RemoteFile(getRemoteProject().full_name, task.last_sts_name));
|
||||
task.UpdateLastStsName("");
|
||||
}
|
||||
//-------------------------
|
||||
String launchScriptText = getLaunchScriptText();
|
||||
RemoteFile launchScript = new RemoteFile(getRemoteProject().full_name, "run");
|
||||
pass.sftpChannel.put(
|
||||
new ByteArrayInputStream(
|
||||
launchScriptText.getBytes(StandardCharsets.UTF_8)), launchScript.full_name);
|
||||
pass.sftpChannel.chmod(0777, launchScript.full_name);
|
||||
//-
|
||||
//отправить usr.par.
|
||||
if (task.hasDVMPar()) {
|
||||
File par_text = Utils.CreateTempFile("usr", String.join("\n", task.getRunConfiguration().getParList()));
|
||||
pass.putSingleFile(par_text, new RemoteFile(getRemoteProject().full_name, "usr.par"));
|
||||
}
|
||||
}
|
||||
protected String getLaunchScriptText() {
|
||||
return getStartCommand();
|
||||
}
|
||||
@Override
|
||||
protected String getCoupDeGrace() {
|
||||
return "killall -SIGKILL " + task.getCompilationTask().binary_name;
|
||||
}
|
||||
@Override
|
||||
protected void AchieveResults() throws Exception {
|
||||
super.AchieveResults();
|
||||
task.parseCleanTime();
|
||||
//теперь ищем статистику.
|
||||
//статистика
|
||||
Vector<ChannelSftp.LsEntry> files = pass.sftpChannel.ls(getRemoteProject().full_name);
|
||||
for (ChannelSftp.LsEntry file : files) {
|
||||
if (file.getFilename().endsWith("sts.gz+")) {
|
||||
task.UpdateLastStsName(file.getFilename());
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!task.last_sts_name.isEmpty()) {
|
||||
RemoteFile remote_sts = new RemoteFile(getRemoteProject().full_name, task.last_sts_name);
|
||||
task.hasDvmSts = pass.tryGetSingleFile(remote_sts, task.getLocalStsFile(), 10240);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
//ищем GCOV
|
||||
if (task.getRunConfiguration().needsGCOV()) {
|
||||
pass.ShellCommand("cd " + Utils.DQuotes(getRemoteProject().full_name),
|
||||
"gcov *.gcda -p"
|
||||
);
|
||||
project.CreateGCOVDirs();
|
||||
Vector<RemoteFile> gcov_results = pass.getFilesByExtensions(getRemoteProject(), "gcov");
|
||||
for (RemoteFile gcov_file : gcov_results) {
|
||||
File local_gcov = Paths.get(project.getGCOVDirectory().getAbsolutePath(),
|
||||
gcov_file.name.replace("#", "\\")).toFile();
|
||||
pass.getSingleFile(gcov_file.full_name, local_gcov.getAbsolutePath());
|
||||
}
|
||||
*/
|
||||
Reference in New Issue
Block a user