Оптимизация поиска нового состояния в папке 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

View File

@@ -4,8 +4,12 @@ import Common.UI.StatusEnum;
import Common.UI.Themes.VisualiserFonts;
import java.awt.*;
import java.util.Arrays;
import java.util.Vector;
import java.util.stream.Collectors;
public enum TasksPackageState implements StatusEnum {
Queued,
//--
TestsSynchronize, //оставить.
PackageWorkspaceCreation,
PackageStart,
@@ -19,7 +23,6 @@ public enum TasksPackageState implements StatusEnum {
RunningExecution,
//--
RunningEnd, //скачка архива
Cleaning, //todo удаление папки пакета на удаленной машине. пока отладки ради не делать.
//---------------------------------------
Analysis,
Done,
@@ -77,12 +80,15 @@ public enum TasksPackageState implements StatusEnum {
return "загрузка результатов";
case Analysis:
return "анализ результатов";
case Cleaning:
return "очистка";
case Done:
return "завершен";
default:
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.TasksPackage.TasksPackage;
import TestingSystem.DVM.TasksPackage.TasksPackageState;
import com.jcraft.jsch.ChannelSftp;
import javafx.util.Pair;
import org.apache.commons.io.FileUtils;
@@ -20,7 +19,7 @@ import java.io.File;
import java.nio.charset.Charset;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
public class TestsSupervisor_2022 {
@@ -149,23 +148,18 @@ public class TestsSupervisor_2022 {
}
}
public void checkNextState() throws Exception {
TasksPackageState oldState = tasksPackage.state;
Vector<ChannelSftp.LsEntry> files_ = connection.sftpChannel.ls(packageRemoteWorkspace.full_name + "/state");
Vector<ChannelSftp.LsEntry> files = new Vector<>();
for (ChannelSftp.LsEntry file : files_) {
try {
TasksPackageState.valueOf(file.getFilename());
files.add(file);
} catch (Exception ignore) {
}
}
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)
RemoteFile stateDir = new RemoteFile(packageRemoteWorkspace, "state");
//состояния пакета могут меняться только по возрастанию. ищем, появилось ли такое.
Vector<TasksPackageState> higherStates = tasksPackage.state.getHigherStates();
Collections.reverse(higherStates); //берем в обратном порядке, чтобы быстрее найти высшее.
for (TasksPackageState state: higherStates){
RemoteFile file = new RemoteFile(stateDir, state.toString());
if (connection.Exists(file)){
System.out.println("found new state: "+file.name);
tasksPackage.state = state;
planner.UpdatePackage();
return;
}
}
}
public void DownloadResults() throws Exception {
@@ -182,51 +176,53 @@ public class TestsSupervisor_2022 {
}
public void AnalyseResults() throws Exception {
System.out.println("analysing results");
int ct_count = 0;
int rt_count = 0;
for (TestCompilationTask testCompilationTask : compilationTasks) {
ct_count++;
if (CheckTask(testCompilationTask)) {
for (TestRunTask testRunTask : testCompilationTask.runTasks) {
rt_count++;
testRunTask.compilation_state = testCompilationTask.state;
testRunTask.compilation_output = testCompilationTask.output;
testRunTask.compilation_errors = testCompilationTask.errors;
if (testCompilationTask.state == TaskState.DoneWithErrors) {
testRunTask.state = TaskState.Canceled;
} else {
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;
if (false) {
int ct_count = 0;
int rt_count = 0;
for (TestCompilationTask testCompilationTask : compilationTasks) {
ct_count++;
if (CheckTask(testCompilationTask)) {
for (TestRunTask testRunTask : testCompilationTask.runTasks) {
rt_count++;
testRunTask.compilation_state = testCompilationTask.state;
testRunTask.compilation_output = testCompilationTask.output;
testRunTask.compilation_errors = testCompilationTask.errors;
if (testCompilationTask.state == TaskState.DoneWithErrors) {
testRunTask.state = TaskState.Canceled;
} 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;
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 {
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 {
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()), //нужны ли тут кавычки?
"g++ " + starter_code + " -o " + starter,
"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 " + launcher,
"chmod 0777 " + planner