Перенос.

This commit is contained in:
2023-09-17 22:13:42 +03:00
parent dd2e0ca7e0
commit 629d8b8477
1239 changed files with 61161 additions and 1 deletions

View 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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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());
}
*/