Перенос.
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
package GlobalData.Tasks.Supervisor.Local.Linux;
|
||||
import Common.Utils.Utils;
|
||||
import GlobalData.Makefile.Makefile;
|
||||
import GlobalData.Tasks.CompilationTask.CompilationTask;
|
||||
import GlobalData.Tasks.TaskState;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
public class LinuxLocalCompilationSupervisor extends LinuxLocalTaskSupervisor<CompilationTask> {
|
||||
@Override
|
||||
protected void PrepareWorkspace() throws Exception {
|
||||
//возможно тут сделать отличие. не удалять все, а тоже сверять по дате и именам..
|
||||
super.PrepareWorkspace();
|
||||
Utils.CheckAndCleanDirectory(getProjectCopy());
|
||||
//скопировать проект в папку. без бд.
|
||||
project.Clone(getProjectCopy(), false);
|
||||
//-удалить старый бинарник если есть? бессмысленно если папка и так полностью пересоздается при каждой компиляции.
|
||||
//по идее надо исправить на синхронизацию.
|
||||
//if (!task.binary_name.isEmpty()) {
|
||||
// File old_binary = Paths.get(getProjectCopy().getAbsolutePath(), task.binary_name).toFile();
|
||||
// FileUtils.forceDelete(old_binary);
|
||||
// }
|
||||
//создать мейкфайл.
|
||||
Makefile makefile = task.getMakefile();
|
||||
File makefile_text = Paths.get(getProjectCopy().getAbsolutePath(), "Makefile").toFile();
|
||||
FileUtils.write(makefile_text, makefile.Generate(project));
|
||||
}
|
||||
@Override
|
||||
protected void ValidateTaskResults() throws Exception {
|
||||
if (getBinary().exists()) {
|
||||
File renamed_binary = Paths.get(getProjectCopy().getAbsolutePath(),
|
||||
Utils.getDateName("spf")).toFile();
|
||||
task.binary_name = renamed_binary.getName();
|
||||
Files.move(getBinary().toPath(), renamed_binary.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
task.state = TaskState.Done;
|
||||
} else task.state = TaskState.DoneWithErrors;
|
||||
task.AnalyzeResultsTexts(project);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package GlobalData.Tasks.Supervisor.Local.Linux;
|
||||
import Common.Current;
|
||||
import GlobalData.Tasks.RunTask.RunTask;
|
||||
|
||||
import java.util.Map;
|
||||
public class LinuxLocalRunSupervisor extends LinuxLocalTaskSupervisor<RunTask> {
|
||||
@Override
|
||||
protected void PrepareWorkspace() throws Exception {
|
||||
super.PrepareWorkspace();
|
||||
PrepareRunTaskWorkspace(task);
|
||||
}
|
||||
@Override
|
||||
protected void AchieveResults() throws Exception {
|
||||
super.AchieveResults();
|
||||
AchieveRunTaskResults(task);
|
||||
}
|
||||
@Override
|
||||
protected Map<String, String> getEnvs() {
|
||||
return Current.getRunConfiguration().getEnvMap();
|
||||
}
|
||||
@Override
|
||||
protected String getScriptText() {
|
||||
return "ulimit -s unlimited\n" + super.getScriptText();
|
||||
}
|
||||
@Override
|
||||
protected void ValidateTaskResults() throws Exception {
|
||||
task.AnalyzeResultsTexts(project);
|
||||
}
|
||||
protected String getCoupDeGrace() {
|
||||
return "killall -SIGKILL " + task.getCompilationTask().binary_name;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,82 @@
|
||||
package GlobalData.Tasks.Supervisor.Local.Linux;
|
||||
import Common.Utils.Utils;
|
||||
import GlobalData.Tasks.Supervisor.Local.LocalTaskSupervisor;
|
||||
import GlobalData.Tasks.Task;
|
||||
import GlobalData.Tasks.TaskState;
|
||||
import GlobalData.User.User;
|
||||
import ProjectData.Project.db_project_info;
|
||||
import Visual_DVM_2021.Passes.PassException;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.util.Date;
|
||||
public abstract class LinuxLocalTaskSupervisor<T extends Task> extends LocalTaskSupervisor<T> {
|
||||
@Override
|
||||
protected void StartTask() throws Exception {
|
||||
super.StartTask();
|
||||
task.PID = Utils.readLine(taskProcess);
|
||||
}
|
||||
@Override
|
||||
protected String getScriptText() {
|
||||
User user = task.getUser();
|
||||
return
|
||||
String.join(" ",
|
||||
Utils.DQuotes(user.getStarterFile()),
|
||||
Utils.DQuotes(user.getLauncherFile()),
|
||||
String.valueOf(task.maxtime),
|
||||
Utils.DQuotes(getCoupDeGrace()),
|
||||
task.getFullCommand()
|
||||
);
|
||||
}
|
||||
@Override
|
||||
protected void CheckTask() throws Exception {
|
||||
if (getDONE_file().exists())
|
||||
task.state = TaskState.Finished;
|
||||
else if (getTIMEOUT_file().exists())
|
||||
task.state = TaskState.AbortedByTimeout;
|
||||
}
|
||||
@Override
|
||||
protected String getKillCommand() {
|
||||
return "kill -2 " + task.PID;
|
||||
}
|
||||
@Override
|
||||
public void WaitForTask() throws Exception {
|
||||
if (isTaskActive()) {
|
||||
if (task.PID.isEmpty())
|
||||
throw new PassException("Ошибка при старте : идентификатор задачи не определен.");
|
||||
task.StartDate = (new Date()).getTime();
|
||||
pass.ShowMessage1("Задача активна, идентификатор " + Utils.Brackets(task.PID));
|
||||
RefreshProgress();
|
||||
do {
|
||||
Thread.sleep(getTaskCheckPeriod() * 1000L);
|
||||
performanceTime += getTaskCheckPeriod();
|
||||
CheckTask();
|
||||
if (isTaskActive()) CheckIfNeedAbort();
|
||||
RefreshProgress();
|
||||
} while (isTaskActive());
|
||||
}
|
||||
}
|
||||
protected File getProjectTime() {
|
||||
return Paths.get(getProjectCopy().getAbsolutePath(), db_project_info.time_file).toFile();
|
||||
}
|
||||
protected File getDONE_file() {
|
||||
return Paths.get(getProjectCopy().getAbsolutePath(), db_project_info.DONE).toFile();
|
||||
}
|
||||
protected File getTIMEOUT_file() {
|
||||
return Paths.get(getProjectCopy().getAbsolutePath(), db_project_info.TIMEOUT).toFile();
|
||||
}
|
||||
@Override
|
||||
protected void PrepareWorkspace() throws Exception {
|
||||
super.PrepareWorkspace();
|
||||
Utils.forceDeleteWithCheck(getDONE_file());
|
||||
Utils.forceDeleteWithCheck(getTIMEOUT_file());
|
||||
Utils.forceDeleteWithCheck(getProjectTime());
|
||||
}
|
||||
@Override
|
||||
protected void CalculatePerformanceTime() throws Exception {
|
||||
Files.move(getProjectTime().toPath(), task.getTimeFile().toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
task.RefreshTime();
|
||||
}
|
||||
}
|
||||
105
src/GlobalData/Tasks/Supervisor/Local/LocalTaskSupervisor.java
Normal file
105
src/GlobalData/Tasks/Supervisor/Local/LocalTaskSupervisor.java
Normal file
@@ -0,0 +1,105 @@
|
||||
package GlobalData.Tasks.Supervisor.Local;
|
||||
import Common.Global;
|
||||
import Common.Utils.Utils;
|
||||
import GlobalData.Tasks.RunTask.RunTask;
|
||||
import GlobalData.Tasks.Supervisor.TaskSupervisor;
|
||||
import GlobalData.Tasks.Task;
|
||||
import GlobalData.Tasks.TaskState;
|
||||
import ProjectData.Project.db_project_info;
|
||||
import Visual_DVM_2021.Passes.Pass_2021;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.util.Map;
|
||||
import java.util.Vector;
|
||||
//про mpi mpich2
|
||||
//https://stackoverflow.com/questions/12983635/how-to-include-library-mpich2-in-mingw
|
||||
public abstract class LocalTaskSupervisor<T extends Task> extends TaskSupervisor<T, Pass_2021> {
|
||||
protected Process taskProcess;
|
||||
protected int exitCode;
|
||||
@Override
|
||||
protected void StartTask() throws Exception {
|
||||
exitCode = Utils.Nan;
|
||||
taskProcess = Utils.startScript(task.getLocalWorkspace(), getProjectCopy(), "start_task_script", getScriptText(), getEnvs());
|
||||
task.state = TaskState.Running;
|
||||
}
|
||||
@Override
|
||||
protected void AbortTask() throws Exception {
|
||||
Process killer = Runtime.getRuntime().exec(getKillCommand());
|
||||
killer.waitFor();
|
||||
}
|
||||
//---->
|
||||
protected abstract String getScriptText();
|
||||
protected abstract String getKillCommand();
|
||||
//----->
|
||||
protected Map<String, String> getEnvs() {
|
||||
return null;
|
||||
}
|
||||
//---->
|
||||
protected File getProjectCopy() {
|
||||
return Paths.get(task.getUser().getLocalProjectsDir().getAbsolutePath(), project.getUniqKey()).toFile();
|
||||
}
|
||||
protected File getBinary() {
|
||||
return Paths.get(getProjectCopy().getAbsolutePath(), "0" + (Global.isWindows ? ".exe" : "")).toFile();
|
||||
}
|
||||
protected File getProjectOutput() {
|
||||
return Paths.get(getProjectCopy().getAbsolutePath(), db_project_info.out_file).toFile();
|
||||
}
|
||||
protected File getProjectErrors() {
|
||||
return Paths.get(getProjectCopy().getAbsolutePath(), db_project_info.err_file).toFile();
|
||||
}
|
||||
@Override
|
||||
protected void PrepareWorkspace() throws Exception {
|
||||
super.PrepareWorkspace(); //локальная подготовка
|
||||
Utils.forceDeleteWithCheck(getProjectOutput());
|
||||
Utils.forceDeleteWithCheck(getProjectErrors());
|
||||
}
|
||||
@Override
|
||||
protected void AchieveResults() throws Exception {
|
||||
Files.copy(getProjectOutput().toPath(), task.getOutputFile().toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
Files.copy(getProjectErrors().toPath(), task.getErrorsFile().toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
protected void AchieveRunTaskResults(RunTask rTask) throws Exception {
|
||||
rTask.parseCleanTime();
|
||||
//-статистика
|
||||
Vector<File> stsFiles = new Vector<>();
|
||||
Utils.getFilesByExtensions_r(getProjectCopy(), stsFiles, "gz+");
|
||||
if (stsFiles.size() > 0) {
|
||||
File file = stsFiles.get(0);
|
||||
rTask.UpdateLastStsName(file.getName());
|
||||
Files.copy(file.toPath(), rTask.getLocalStsFile().toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
rTask.hasDvmSts = true;
|
||||
}
|
||||
/*
|
||||
//-gcov
|
||||
if (rTask.getRunConfiguration().needsGCOV()) {
|
||||
//-
|
||||
Process gcovProcess = Utils.startScript(rTask.getLocalWorkspace(), getProjectCopy(), "gcov_script", "gcov *.gcda -p");
|
||||
gcovProcess.waitFor();
|
||||
//-
|
||||
project.CreateGCOVDirs();
|
||||
Vector<File> gcovs = new Vector<>();
|
||||
Utils.getFilesByExtensions_r(getProjectCopy(), gcovs, "gcov");
|
||||
for (File src : gcovs) {
|
||||
File dst = Paths.get(project.getGCOVDirectory().getAbsolutePath(),
|
||||
src.getName().replace("#",
|
||||
Global.isWindows ? "\\" : "/")).toFile();
|
||||
Files.move(src.toPath(), dst.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
protected void PrepareRunTaskWorkspace(RunTask rTask) throws Exception {
|
||||
Utils.deleteFilesByExtensions(getProjectCopy(), "gcda", "gcov", "gz+", "par");
|
||||
rTask.UpdateLastStsName("");
|
||||
//отправить usr.par.
|
||||
if (rTask.hasDVMPar()) {
|
||||
File par_text = Paths.get(getProjectCopy().getAbsolutePath(), "usr.par").toFile();
|
||||
FileUtils.write(par_text, String.join("\n", rTask.getRunConfiguration().getParList()));
|
||||
}
|
||||
}
|
||||
protected String getCoupDeGrace(){return "";}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package GlobalData.Tasks.Supervisor.Local.Windows;
|
||||
import Common.Global;
|
||||
import Common.Utils.Utils;
|
||||
import GlobalData.Makefile.Makefile;
|
||||
import GlobalData.Settings.SettingName;
|
||||
import GlobalData.Tasks.CompilationTask.CompilationTask;
|
||||
import GlobalData.Tasks.TaskState;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
public class WindowsLocalCompilationSupervisor extends WindowsLocalTaskSupervisor<CompilationTask> {
|
||||
@Override
|
||||
protected String getKillCommand() {
|
||||
return "taskkill /FI \"IMAGENAME eq make.exe\" /F /T";
|
||||
}
|
||||
@Override
|
||||
protected String getScriptText() {
|
||||
return Utils.DQuotes(Global.db.settings.get(SettingName.LocalMakePathWindows).Value) + " 1>out.txt 2>err.txt";
|
||||
}
|
||||
//скорее всего как то выделить подготовку к компиляции как метод предка.
|
||||
@Override
|
||||
protected void PrepareWorkspace() throws Exception {
|
||||
//возможно тут сделать отличие. не удалять все, а тоже сверять по дате и именам..
|
||||
super.PrepareWorkspace();
|
||||
Utils.CheckAndCleanDirectory(getProjectCopy());
|
||||
//скопировать проект в папку. без бд.
|
||||
project.Clone(getProjectCopy(), false);
|
||||
//-удалить старый бинарник если есть? бессмысленно если папка и так полностью пересоздается при каждой компиляции.
|
||||
//по идее надо исправить на синхронизацию.
|
||||
//if (!task.binary_name.isEmpty()) {
|
||||
// File old_binary = Paths.get(getProjectCopy().getAbsolutePath(), task.binary_name).toFile();
|
||||
// FileUtils.forceDelete(old_binary);
|
||||
// }
|
||||
//создать мейкфайл.
|
||||
Makefile makefile = task.getMakefile();
|
||||
File makefile_text = Paths.get(getProjectCopy().getAbsolutePath(), "Makefile").toFile();
|
||||
FileUtils.write(makefile_text, makefile.Generate(project));
|
||||
}
|
||||
//как и валидация.
|
||||
@Override
|
||||
protected void ValidateTaskResults() throws Exception {
|
||||
if (getBinary().exists()) {
|
||||
File renamed_binary = Paths.get(getProjectCopy().getAbsolutePath(),
|
||||
Utils.getDateName("spf") + ".exe").toFile();
|
||||
task.binary_name = renamed_binary.getName();
|
||||
Files.move(getBinary().toPath(), renamed_binary.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||
task.state = TaskState.Done;
|
||||
} else task.state = TaskState.DoneWithErrors;
|
||||
task.AnalyzeResultsTexts(project);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package GlobalData.Tasks.Supervisor.Local.Windows;
|
||||
import Common.Current;
|
||||
import GlobalData.Tasks.RunTask.RunTask;
|
||||
|
||||
import java.util.Map;
|
||||
public class WindowsLocalRunSupervisor extends WindowsLocalTaskSupervisor<RunTask> {
|
||||
@Override
|
||||
protected void ValidateTaskResults() throws Exception {
|
||||
task.AnalyzeResultsTexts(project);
|
||||
}
|
||||
@Override
|
||||
protected String getScriptText() {
|
||||
return task.getFullCommand() + " 1>out.txt 2>err.txt";
|
||||
}
|
||||
//общая часть для запуска.
|
||||
@Override
|
||||
protected void PrepareWorkspace() throws Exception {
|
||||
super.PrepareWorkspace();
|
||||
PrepareRunTaskWorkspace(task);
|
||||
}
|
||||
@Override
|
||||
protected void AchieveResults() throws Exception {
|
||||
super.AchieveResults();
|
||||
AchieveRunTaskResults(task);
|
||||
}
|
||||
@Override
|
||||
protected Map<String, String> getEnvs() {
|
||||
return Current.getRunConfiguration().getEnvMap();
|
||||
}
|
||||
void kill_mpi() throws Exception {
|
||||
System.out.println("KILLING MPI");
|
||||
}
|
||||
@Override
|
||||
protected void AbortTask() throws Exception {
|
||||
super.AbortTask(); //убить группу.
|
||||
kill_mpi();
|
||||
}
|
||||
@Override
|
||||
protected String getKillCommand() {
|
||||
return "taskkill /FI \"IMAGENAME eq " + task.getCompilationTask().binary_name + "\" /F /T";
|
||||
}
|
||||
/*
|
||||
@Override
|
||||
protected void CoupDeGraceTask() throws Exception {
|
||||
kill_mpi();
|
||||
}
|
||||
*/
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package GlobalData.Tasks.Supervisor.Local.Windows;
|
||||
import Common.Global;
|
||||
import GlobalData.Tasks.Supervisor.Local.LocalTaskSupervisor;
|
||||
import GlobalData.Tasks.Task;
|
||||
import GlobalData.Tasks.TaskState;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
//https://ab57.ru/cmdlist/taskkill.html
|
||||
public abstract class WindowsLocalTaskSupervisor<T extends Task> extends LocalTaskSupervisor<T> {
|
||||
@Override
|
||||
protected void StartTask() throws Exception {
|
||||
super.StartTask();
|
||||
task.PID = "start_task_script.bat"; // возможно делать уникальное имя скрипта, чтобы было чем убивать под виндой.
|
||||
}
|
||||
//--------------------------------------------------->>>
|
||||
protected void CheckIfNeedAbort() {
|
||||
if (project.getInterruptFile().exists())
|
||||
task.state = TaskState.AbortingByUser;
|
||||
if (performanceTime > task.maxtime) {
|
||||
try {
|
||||
AbortTask();
|
||||
} catch (Exception ex) {
|
||||
Global.Log.PrintException(ex);
|
||||
}
|
||||
task.state = TaskState.AbortedByTimeout;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
protected void CheckTask() throws Exception {
|
||||
if (taskProcess.waitFor(getTaskCheckPeriod(), TimeUnit.SECONDS)) {
|
||||
exitCode = taskProcess.waitFor();
|
||||
task.state = TaskState.Finished;
|
||||
} else {
|
||||
performanceTime += getTaskCheckPeriod();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void WaitForTask() throws Exception {
|
||||
if (isTaskActive()) {
|
||||
task.StartDate = (new Date()).getTime();
|
||||
pass.ShowMessage1("Задача активна");
|
||||
RefreshProgress();
|
||||
do {
|
||||
CheckTask();
|
||||
if (isTaskActive()) CheckIfNeedAbort();
|
||||
RefreshProgress();
|
||||
} while (isTaskActive());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user