Оптимизация поиска нового состояния в папке state.
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user