Оптимизация поиска нового состояния в папке state.

This commit is contained in:
2023-12-04 15:26:54 +03:00
parent 163552d74f
commit c37f3d9e70
4 changed files with 63 additions and 68 deletions

9
.idea/workspace.xml generated
View File

@@ -8,16 +8,9 @@
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="e42177c3-2328-4b27-8a01-35779b2beb99" name="Default Changelist" comment=""> <list default="true" id="e42177c3-2328-4b27-8a01-35779b2beb99" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/properties" beforeDir="false" afterPath="$PROJECT_DIR$/properties" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/TestingSystem/DVM/TasksPackage/TasksPackageState.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/TasksPackage/TasksPackageState.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/GlobalData/Tasks/Supervisor/Remote/RemoteTaskSupervisor.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/GlobalData/Tasks/Supervisor/Remote/RemoteTaskSupervisor.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/GlobalData/Tasks/Supervisor/Remote/ServerRunSupervisor.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/GlobalData/Tasks/Supervisor/Remote/ServerRunSupervisor.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/TestingSystem/Common/TestingPlanner.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TestingPlanner.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/TestingSystem/DVM/TestsSupervisor_2022.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/TestsSupervisor_2022.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/TestingSystem/DVM/TestsSupervisor_2022.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/TestsSupervisor_2022.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/TestingSystem/DVM/UserConnection.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/UserConnection.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/RemoteInitialiseUser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/RemoteInitialiseUser.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/RemoteInitialiseUser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/All/RemoteInitialiseUser.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/SSH/ConnectionPass.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/Passes/SSH/ConnectionPass.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/files/Planner/Supervisor.h" beforeDir="false" afterPath="$PROJECT_DIR$/src/files/Planner/Supervisor.h" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/files/Planner/Task.h" beforeDir="false" afterPath="$PROJECT_DIR$/src/files/Planner/Task.h" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />

View File

@@ -4,8 +4,12 @@ import Common.UI.StatusEnum;
import Common.UI.Themes.VisualiserFonts; import Common.UI.Themes.VisualiserFonts;
import java.awt.*; import java.awt.*;
import java.util.Arrays;
import java.util.Vector;
import java.util.stream.Collectors;
public enum TasksPackageState implements StatusEnum { public enum TasksPackageState implements StatusEnum {
Queued, Queued,
//--
TestsSynchronize, //оставить. TestsSynchronize, //оставить.
PackageWorkspaceCreation, PackageWorkspaceCreation,
PackageStart, PackageStart,
@@ -19,7 +23,6 @@ public enum TasksPackageState implements StatusEnum {
RunningExecution, RunningExecution,
//-- //--
RunningEnd, //скачка архива RunningEnd, //скачка архива
Cleaning, //todo удаление папки пакета на удаленной машине. пока отладки ради не делать.
//--------------------------------------- //---------------------------------------
Analysis, Analysis,
Done, Done,
@@ -77,12 +80,15 @@ public enum TasksPackageState implements StatusEnum {
return "загрузка результатов"; return "загрузка результатов";
case Analysis: case Analysis:
return "анализ результатов"; return "анализ результатов";
case Cleaning:
return "очистка";
case Done: case Done:
return "завершен"; return "завершен";
default: default:
return StatusEnum.super.getDescription(); return StatusEnum.super.getDescription();
} }
} }
public Vector<TasksPackageState> getHigherStates(){
return Arrays.stream(values()).filter(state -> state.ordinal() > this.ordinal()).collect(Collectors.toCollection(Vector::new));
}
} }

View File

@@ -12,7 +12,6 @@ import TestingSystem.DVM.Tasks.TestRunTask;
import TestingSystem.DVM.Tasks.TestTask; import TestingSystem.DVM.Tasks.TestTask;
import TestingSystem.DVM.TasksPackage.TasksPackage; import TestingSystem.DVM.TasksPackage.TasksPackage;
import TestingSystem.DVM.TasksPackage.TasksPackageState; import TestingSystem.DVM.TasksPackage.TasksPackageState;
import com.jcraft.jsch.ChannelSftp;
import javafx.util.Pair; import javafx.util.Pair;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
@@ -20,7 +19,7 @@ import java.io.File;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Vector; import java.util.Vector;
public class TestsSupervisor_2022 { public class TestsSupervisor_2022 {
@@ -149,23 +148,18 @@ public class TestsSupervisor_2022 {
} }
} }
public void checkNextState() throws Exception { public void checkNextState() throws Exception {
TasksPackageState oldState = tasksPackage.state; RemoteFile stateDir = new RemoteFile(packageRemoteWorkspace, "state");
Vector<ChannelSftp.LsEntry> files_ = connection.sftpChannel.ls(packageRemoteWorkspace.full_name + "/state"); //состояния пакета могут меняться только по возрастанию. ищем, появилось ли такое.
Vector<ChannelSftp.LsEntry> files = new Vector<>(); Vector<TasksPackageState> higherStates = tasksPackage.state.getHigherStates();
for (ChannelSftp.LsEntry file : files_) { Collections.reverse(higherStates); //берем в обратном порядке, чтобы быстрее найти высшее.
try { for (TasksPackageState state: higherStates){
TasksPackageState.valueOf(file.getFilename()); RemoteFile file = new RemoteFile(stateDir, state.toString());
files.add(file); if (connection.Exists(file)){
} catch (Exception ignore) { System.out.println("found new state: "+file.name);
} tasksPackage.state = state;
}
files.sort(Comparator.comparingInt(o -> o.getAttrs().getMTime()));
if (!files.isEmpty()) {
String fileName = files.get(files.size() - 1).getFilename();
System.out.println(fileName + " last file");
tasksPackage.state = TasksPackageState.valueOf(files.get(files.size() - 1).getFilename());
if (tasksPackage.state != oldState)
planner.UpdatePackage(); planner.UpdatePackage();
return;
}
} }
} }
public void DownloadResults() throws Exception { public void DownloadResults() throws Exception {
@@ -182,51 +176,53 @@ public class TestsSupervisor_2022 {
} }
public void AnalyseResults() throws Exception { public void AnalyseResults() throws Exception {
System.out.println("analysing results"); System.out.println("analysing results");
int ct_count = 0; if (false) {
int rt_count = 0; int ct_count = 0;
for (TestCompilationTask testCompilationTask : compilationTasks) { int rt_count = 0;
ct_count++; for (TestCompilationTask testCompilationTask : compilationTasks) {
if (CheckTask(testCompilationTask)) { ct_count++;
for (TestRunTask testRunTask : testCompilationTask.runTasks) { if (CheckTask(testCompilationTask)) {
rt_count++; for (TestRunTask testRunTask : testCompilationTask.runTasks) {
testRunTask.compilation_state = testCompilationTask.state; rt_count++;
testRunTask.compilation_output = testCompilationTask.output; testRunTask.compilation_state = testCompilationTask.state;
testRunTask.compilation_errors = testCompilationTask.errors; testRunTask.compilation_output = testCompilationTask.output;
if (testCompilationTask.state == TaskState.DoneWithErrors) { testRunTask.compilation_errors = testCompilationTask.errors;
testRunTask.state = TaskState.Canceled; if (testCompilationTask.state == TaskState.DoneWithErrors) {
} else { testRunTask.state = TaskState.Canceled;
CheckTask(testRunTask);
}
if (testRunTask.state.equals(TaskState.Finished)) {
//анализ задачи на запуск.
List<String> output_lines = Arrays.asList(testRunTask.output.split("\n"));
List<String> errors_lines = Arrays.asList(testRunTask.errors.split("\n"));
//---
if (Utils.isCrushed(output_lines, errors_lines)) {
testRunTask.state = TaskState.Crushed;
} else { } else {
Pair<TaskState, Integer> results = new Pair<>(TaskState.Done, 100); CheckTask(testRunTask);
switch (testRunTask.test_type) { }
case Correctness: if (testRunTask.state.equals(TaskState.Finished)) {
results = Utils.analyzeCorrectness(output_lines); //анализ задачи на запуск.
break; List<String> output_lines = Arrays.asList(testRunTask.output.split("\n"));
case Performance: List<String> errors_lines = Arrays.asList(testRunTask.errors.split("\n"));
results = Utils.analyzePerformance(output_lines); //---
break; if (Utils.isCrushed(output_lines, errors_lines)) {
default: testRunTask.state = TaskState.Crushed;
break; } else {
Pair<TaskState, Integer> results = new Pair<>(TaskState.Done, 100);
switch (testRunTask.test_type) {
case Correctness:
results = Utils.analyzeCorrectness(output_lines);
break;
case Performance:
results = Utils.analyzePerformance(output_lines);
break;
default:
break;
}
testRunTask.state = results.getKey();
testRunTask.progress = results.getValue();
testRunTask.CleanTime = Utils.parseCleanTime(testRunTask.output);
} }
testRunTask.state = results.getKey();
testRunTask.progress = results.getValue();
testRunTask.CleanTime = Utils.parseCleanTime(testRunTask.output);
} }
} }
} }
} }
System.out.println("ct_count=" + ct_count + " rt count=" + rt_count);
//теперь обновить их единым списком, и удалить задачи на компиляцию.
planner.ServerCommand(ServerCode.UpdateTestTasks, compilationTasks);
} }
System.out.println("ct_count=" + ct_count + " rt count=" + rt_count);
//теперь обновить их единым списком, и удалить задачи на компиляцию.
planner.ServerCommand(ServerCode.UpdateTestTasks, compilationTasks);
} }
public boolean CheckTask(TestTask testTask) throws Exception { public boolean CheckTask(TestTask testTask) throws Exception {
File taskWorkspace = Paths.get(packageLocalWorkspace.getAbsolutePath(), "results", String.valueOf(testTask.id)).toFile(); File taskWorkspace = Paths.get(packageLocalWorkspace.getAbsolutePath(), "results", String.valueOf(testTask.id)).toFile();

View File

@@ -69,7 +69,7 @@ public class RemoteInitialiseUser extends CurrentConnectionPass<String> {
"cd " + Utils.DQuotes(sftpChannel.pwd()), //нужны ли тут кавычки? "cd " + Utils.DQuotes(sftpChannel.pwd()), //нужны ли тут кавычки?
"g++ " + starter_code + " -o " + starter, "g++ " + starter_code + " -o " + starter,
"g++ " + launcher_code + " -o " + launcher, "g++ " + launcher_code + " -o " + launcher,
"g++ -O3 -std=C++17 Planner.cpp -o " + planner, "g++ -O3 -std=c++17 Planner.cpp -o " + planner,
"chmod 0777 " + starter, "chmod 0777 " + starter,
"chmod 0777 " + launcher, "chmod 0777 " + launcher,
"chmod 0777 " + planner "chmod 0777 " + planner