рефакторинг анализа результатов запуска двм пакетов. был удвоенный код

This commit is contained in:
2025-03-14 21:29:21 +03:00
parent 174bc344a4
commit 9a5b84c068
6 changed files with 126 additions and 171 deletions

5
.idea/workspace.xml generated
View File

@@ -8,8 +8,11 @@
<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$/src/_VisualDVM/GlobalData/Tasks/TaskState.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/GlobalData/Tasks/TaskState.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/Passes/All/RefreshDVMPackageResults.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/Passes/All/RefreshDVMPackageResults.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMPackage/DVMPackage.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMPackage/DVMPackage.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMPackage/DVMPackage.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMPackage/DVMPackage.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMTasks/DVMRunTask.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMTasks/DVMRunTask.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMTestingPlanner.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/DVMTestingPlanner.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/RemoteDVMTestingPlanner.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/_VisualDVM/TestingSystem/DVM/RemoteDVMTestingPlanner.java" 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

@@ -21,6 +21,7 @@ public enum TaskState implements StatusEnum {
WrongTestFormat, WrongTestFormat,
InternalError, InternalError,
Done, Done,
DoneWithDiffs,
//--- сугубо кластерные. //--- сугубо кластерные.
Queued, Queued,
NoSuchTask, NoSuchTask,
@@ -38,6 +39,7 @@ public enum TaskState implements StatusEnum {
case WrongTestFormat: case WrongTestFormat:
case InternalError: case InternalError:
case Crushed: case Crushed:
case DoneWithDiffs:
return true; return true;
default: default:
return false; return false;
@@ -63,6 +65,8 @@ public enum TaskState implements StatusEnum {
return "прервана"; return "прервана";
case Done: case Done:
return "успешно"; return "успешно";
case DoneWithDiffs:
return "различия с эталоном";
case DoneWithErrors: case DoneWithErrors:
return "с ошибками"; return "с ошибками";
case Crushed: case Crushed:
@@ -108,6 +112,7 @@ public enum TaskState implements StatusEnum {
case Crushed: case Crushed:
return VisualiserFonts.Fatal; return VisualiserFonts.Fatal;
case Finished: case Finished:
case DoneWithDiffs:
return VisualiserFonts.BlueState; return VisualiserFonts.BlueState;
case WorkspaceReady: case WorkspaceReady:
return VisualiserFonts.ReadyState; return VisualiserFonts.ReadyState;
@@ -136,6 +141,7 @@ public enum TaskState implements StatusEnum {
public boolean isComplete() { public boolean isComplete() {
switch (this) { switch (this) {
case Done: case Done:
case DoneWithDiffs:
case DoneWithErrors: case DoneWithErrors:
case AbortedByTimeout: case AbortedByTimeout:
case AbortedByUser: case AbortedByUser:

View File

@@ -42,73 +42,7 @@ public class RefreshDVMPackageResults extends TestingServerPass<DVMPackage> {
} }
@Override @Override
protected void body() throws Exception { protected void body() throws Exception {
boolean hasErrors = false; target.checkFinishState();
target.readJson();
Vector<DVMRunTask> runTasks = new Vector<>();
for (DVMCompilationTask compilationTask : target.package_json.compilationTasks)
runTasks.addAll(compilationTask.runTasks);
//----
int ct_count = 0;
int rt_count = 0;
int good = 0;
//--
int i = 0;
for (DVMCompilationTask compilationTask : target.package_json.compilationTasks)
for (DVMRunTask runTask : compilationTask.runTasks) {
ShowProgress(runTasks.size(), i, true);
++i;
rt_count++;
if (compilationTask.state != TaskState.Done) {
runTask.state = TaskState.Canceled;
} else {
File rt_workspace = Paths.get(target.getLocalWorkspace().getAbsolutePath(), "results", String.valueOf(runTask.id)).toFile();
if (rt_workspace.exists()) {
//анализ задачи на запуск.
File outFile = new File(rt_workspace, Constants.out_file);
File errFile = new File(rt_workspace.getAbsolutePath(), Constants.err_file);
//--
String output = FileUtils.readFileToString(outFile);
String errors = FileUtils.readFileToString(errFile);
//--
List<String> output_lines = Arrays.asList(output.split("\n"));
List<String> errors_lines = Arrays.asList(errors.split("\n"));
//---
if (output.trim().isEmpty()) {
runTask.state = TaskState.Crushed;
} else {
if (Utils.isCrushed(output_lines, errors_lines)) {
runTask.state = TaskState.Crushed;
} else {
Pair<TaskState, Integer> results = new Pair<>(TaskState.Done, 100);
switch (runTask.test_type) {
case Correctness:
results = Utils.analyzeCorrectness(output_lines);
break;
case Performance:
results = Utils.analyzePerformance(output_lines);
break;
default:
break;
}
runTask.state = results.getKey();
runTask.progress = results.getValue();
runTask.CleanTime = Utils.parseCleanTime(output);
}
}
}
}
if (!runTask.state.equals(TaskState.Done))
hasErrors = true;
else good++;
}
//--
target.saveJson(); //запись обновленных результатов пакета в json!
target.doneTasksCount = good;
target.state = hasErrors ? TasksPackageState.DoneWithErrors : TasksPackageState.Done;
double percent = (((double) (good)) / target.tasksCount) * 100.0;
target.description = "Выполнено на " + ((int) percent) + "%\n" +
"Всего задач: " + target.tasksCount + ", из них с ошибками " + (target.tasksCount - good);
//--
} }
@Override @Override
protected void performDone() throws Exception { protected void performDone() throws Exception {

View File

@@ -4,10 +4,12 @@ import Common.Database.Objects.DBObject;
import Common.Utils.Index; import Common.Utils.Index;
import Common.Utils.Utils_; import Common.Utils.Utils_;
import _VisualDVM.ComponentsServer.UserAccount.UserAccount; import _VisualDVM.ComponentsServer.UserAccount.UserAccount;
import _VisualDVM.Constants;
import _VisualDVM.Global; import _VisualDVM.Global;
import _VisualDVM.GlobalData.Compiler.Compiler; import _VisualDVM.GlobalData.Compiler.Compiler;
import _VisualDVM.GlobalData.Machine.Machine; import _VisualDVM.GlobalData.Machine.Machine;
import _VisualDVM.GlobalData.Machine.MachineType; import _VisualDVM.GlobalData.Machine.MachineType;
import _VisualDVM.GlobalData.Tasks.TaskState;
import _VisualDVM.GlobalData.User.User; import _VisualDVM.GlobalData.User.User;
import _VisualDVM.ServerObjectsCache.DVMConfigurationCache; import _VisualDVM.ServerObjectsCache.DVMConfigurationCache;
import _VisualDVM.ServerObjectsCache.DVMSettingsCache; import _VisualDVM.ServerObjectsCache.DVMSettingsCache;
@@ -21,10 +23,19 @@ import _VisualDVM.TestingSystem.DVM.DVMConfiguration.DVMConfiguration;
import _VisualDVM.TestingSystem.DVM.DVMSettings.DVMSettings; import _VisualDVM.TestingSystem.DVM.DVMSettings.DVMSettings;
import _VisualDVM.TestingSystem.DVM.DVMTasks.DVMCompilationTask; import _VisualDVM.TestingSystem.DVM.DVMTasks.DVMCompilationTask;
import _VisualDVM.TestingSystem.DVM.DVMTasks.DVMRunTask; import _VisualDVM.TestingSystem.DVM.DVMTasks.DVMRunTask;
import _VisualDVM.TestingSystem.DVM.DVMTasks.DVMTask;
import _VisualDVM.TestingSystem.SAPFOR.SapforTask.SapforTask;
import _VisualDVM.Utils;
import com.sun.org.glassfish.gmbal.Description; import com.sun.org.glassfish.gmbal.Description;
import javafx.util.Pair; import javafx.util.Pair;
import org.apache.commons.io.FileUtils;
import java.io.File; import java.io.File;
import java.nio.charset.Charset;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Vector; import java.util.Vector;
public class DVMPackage extends TestingPackage<DVMPackage_json> { public class DVMPackage extends TestingPackage<DVMPackage_json> {
//--- //---
@@ -209,11 +220,111 @@ public class DVMPackage extends TestingPackage<DVMPackage_json> {
public User getUser() { public User getUser() {
return new User(user_name, "", user_workspace); return new User(user_name, "", user_workspace);
} }
@Override
public void checkFinishState() throws Exception {
}
public String getMachineURL() { public String getMachineURL() {
return machine_address + ":" + machine_port; return machine_address + ":" + machine_port;
} }
//получение запакованных планировщиком результатов задач.
public void getTasksInfo(File packageLocalWorkspace, List<? extends DVMTask> tasks, String file_name) throws Exception {
LinkedHashMap<Integer, DVMTask> sorted_tasks = new LinkedHashMap<>();
for (DVMTask task : tasks)
sorted_tasks.put(task.id, task);
//--
File info_file = Utils_.getFile(packageLocalWorkspace.getAbsolutePath(),"results", file_name);
List<String> lines = FileUtils.readLines(info_file, Charset.defaultCharset());
for (String packed : lines) {
if (!packed.isEmpty()) {
String[] data = packed.split(" ");
int id = Integer.parseInt(data[0]);
TaskState state = TaskState.valueOf(data[1]);
double time = Double.parseDouble(data[2]);
//--
DVMTask task = sorted_tasks.get(id);
task.state = state;
task.Time = state.equals(TaskState.AbortedByTimeout) ? (task.maxtime + 1) : time;
}
}
}
@Override
public void checkFinishState() throws Exception {
File packageLocalWorkspace = new File(Global.DVMPackagesDirectory, String.valueOf(id));
boolean hasErrors = false;
readJson();
Vector<DVMRunTask> runTasks = new Vector<>();
for (DVMCompilationTask compilationTask : package_json.compilationTasks)
runTasks.addAll(compilationTask.runTasks);
//----
getTasksInfo(packageLocalWorkspace,package_json.compilationTasks, "CompilationInfo.txt");
getTasksInfo(packageLocalWorkspace,runTasks, "RunningInfo.txt");
//--
int ct_count = 0;
int rt_count = 0;
int good = 0;
//--
for (DVMCompilationTask compilationTask : package_json.compilationTasks) {
compilationTask.dvm_package_id = id;
if (!compilationTask.state.equals(TaskState.Done))
hasErrors = true;
ct_count++;
File ct_workspace = Paths.get(packageLocalWorkspace.getAbsolutePath(), "results", String.valueOf(compilationTask.id)).toFile();
if (ct_workspace.exists()) {
for (DVMRunTask runTask : compilationTask.runTasks) {
runTask.dvm_package_id = id;
rt_count++;
runTask.compilation_state = compilationTask.state;
runTask.compilation_time = compilationTask.Time;
if (compilationTask.state != TaskState.Done) {
runTask.state = TaskState.Canceled;
} else {
File rt_workspace = Paths.get(packageLocalWorkspace.getAbsolutePath(), "results", String.valueOf(runTask.id)).toFile();
if (rt_workspace.exists() && runTask.state.equals(TaskState.Finished)
) {
//анализ задачи на запуск.
File outFile = new File(rt_workspace, Constants.out_file);
File errFile = new File(rt_workspace.getAbsolutePath(), Constants.err_file);
//--
String output = FileUtils.readFileToString(outFile);
String errors = FileUtils.readFileToString(errFile);
//--
List<String> output_lines = Arrays.asList(output.split("\n"));
List<String> errors_lines = Arrays.asList(errors.split("\n"));
//---
if (output.trim().isEmpty()) {
runTask.state = TaskState.Crushed;
} else {
if (Utils.isCrushed(output_lines, errors_lines)) {
runTask.state = TaskState.Crushed;
} else {
Pair<TaskState, Integer> results = new Pair<>(TaskState.Done, 100);
switch (runTask.test_type) {
case Correctness:
results = Utils.analyzeCorrectness(output_lines);
break;
case Performance:
results = Utils.analyzePerformance(output_lines);
break;
default:
break;
}
runTask.state = results.getKey();
runTask.progress = results.getValue();
runTask.CleanTime = Utils.parseCleanTime(output);
}
}
}
}
if (!runTask.state.equals(TaskState.Done))
hasErrors = true;
else good++;
}
}
}
progress = 100;
doneTasksCount = good;
saveJson(); //запись обновленных результатов пакета в json!
state = hasErrors ? TasksPackageState.DoneWithErrors : TasksPackageState.Done;
double percent = (((double) (good)) / tasksCount) * 100.0;
description = "Выполнено на " + ((int) percent) + "%\n" +
"Всего задач: " + tasksCount + ", из них с ошибками " + (tasksCount - good);
}
} }

View File

@@ -86,26 +86,6 @@ public abstract class DVMTestingPlanner extends TestingPlanner<DVMPackage> {
} }
return res; return res;
} }
public void getTasksInfo(List<? extends DVMTask> tasks, String file_name) throws Exception {
LinkedHashMap<Integer, DVMTask> sorted_tasks = new LinkedHashMap<>();
for (DVMTask task : tasks)
sorted_tasks.put(task.id, task);
//--
File info_file = Paths.get(packageLocalWorkspace.getAbsolutePath(), "results", file_name).toFile();
List<String> lines = FileUtils.readLines(info_file, Charset.defaultCharset());
for (String packed : lines) {
if (!packed.isEmpty()) {
String[] data = packed.split(" ");
int id = Integer.parseInt(data[0]);
TaskState state = TaskState.valueOf(data[1]);
double time = Double.parseDouble(data[2]);
//--
DVMTask task = sorted_tasks.get(id);
task.state = state;
task.Time = state.equals(TaskState.AbortedByTimeout) ? (task.maxtime + 1) : time;
}
}
}
@Override @Override
protected void Print(String message) { protected void Print(String message) {
try { try {

View File

@@ -92,86 +92,7 @@ public class RemoteDVMTestingPlanner extends DVMTestingPlanner {
} }
@Override @Override
protected void AnalyseResults() throws Exception { protected void AnalyseResults() throws Exception {
boolean hasErrors = false; testingPackage.checkFinishState();
testingPackage.readJson();
Print("analysing results");
Vector<DVMRunTask> runTasks = new Vector<>();
for (DVMCompilationTask compilationTask : testingPackage.package_json.compilationTasks)
runTasks.addAll(compilationTask.runTasks);
//----
getTasksInfo(testingPackage.package_json.compilationTasks, "CompilationInfo.txt");
getTasksInfo(runTasks, "RunningInfo.txt");
//--
int ct_count = 0;
int rt_count = 0;
int good = 0;
//--
for (DVMCompilationTask compilationTask : testingPackage.package_json.compilationTasks) {
compilationTask.dvm_package_id = testingPackage.id;
if (!compilationTask.state.equals(TaskState.Done))
hasErrors = true;
ct_count++;
File ct_workspace = Paths.get(packageLocalWorkspace.getAbsolutePath(), "results", String.valueOf(compilationTask.id)).toFile();
if (ct_workspace.exists()) {
for (DVMRunTask runTask : compilationTask.runTasks) {
runTask.dvm_package_id = testingPackage.id;
rt_count++;
runTask.compilation_state = compilationTask.state;
runTask.compilation_time = compilationTask.Time;
if (compilationTask.state != TaskState.Done) {
runTask.state = TaskState.Canceled;
} else {
File rt_workspace = Paths.get(packageLocalWorkspace.getAbsolutePath(), "results", String.valueOf(runTask.id)).toFile();
if (rt_workspace.exists() && runTask.state.equals(TaskState.Finished)
) {
//анализ задачи на запуск.
File outFile = new File(rt_workspace, Constants.out_file);
File errFile = new File(rt_workspace.getAbsolutePath(), Constants.err_file);
//--
String output = FileUtils.readFileToString(outFile);
String errors = FileUtils.readFileToString(errFile);
//--
List<String> output_lines = Arrays.asList(output.split("\n"));
List<String> errors_lines = Arrays.asList(errors.split("\n"));
//---
if (output.trim().isEmpty()) {
runTask.state = TaskState.Crushed;
} else {
if (Utils.isCrushed(output_lines, errors_lines)) {
runTask.state = TaskState.Crushed;
} else {
Pair<TaskState, Integer> results = new Pair<>(TaskState.Done, 100);
switch (runTask.test_type) {
case Correctness:
results = Utils.analyzeCorrectness(output_lines);
break;
case Performance:
results = Utils.analyzePerformance(output_lines);
break;
default:
break;
}
runTask.state = results.getKey();
runTask.progress = results.getValue();
runTask.CleanTime = Utils.parseCleanTime(output);
}
}
}
}
if (!runTask.state.equals(TaskState.Done))
hasErrors = true;
else good++;
}
}
}
testingPackage.progress = 100;
testingPackage.doneTasksCount = good;
testingPackage.saveJson(); //запись обновленных результатов пакета в json!
Print("analysis done, ct_count=" + ct_count + " rt count=" + rt_count);
testingPackage.state = hasErrors ? TasksPackageState.DoneWithErrors : TasksPackageState.Done;
double percent = (((double) (good)) / testingPackage.tasksCount) * 100.0;
testingPackage.description = "Выполнено на " + ((int) percent) + "%\n" +
"Всего задач: " + testingPackage.tasksCount + ", из них с ошибками " + (testingPackage.tasksCount - good);
UpdatePackageState(); UpdatePackageState();
//теперь удалить распакованную папку с результатами. для скачки нужен только архив. //теперь удалить распакованную папку с результатами. для скачки нужен только архив.
File unpacked_results = new File(packageLocalWorkspace.getAbsolutePath(), "results"); File unpacked_results = new File(packageLocalWorkspace.getAbsolutePath(), "results");