Разделение очереди на разные машины, и исправление бага. могло выполняться более одного пакета одновременно

This commit is contained in:
2024-03-21 19:02:08 +03:00
parent dd0570f281
commit b6b6e2e642
10 changed files with 154 additions and 119 deletions

12
.idea/workspace.xml generated
View File

@@ -8,9 +8,15 @@
<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/Common/Utils/Validators/ShellParser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Common/Utils/Validators/ShellParser.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/properties" beforeDir="false" afterPath="$PROJECT_DIR$/properties" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Repository/Component/Visualiser.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Repository/Component/Visualiser.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/Repository/Server/ServerCode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Repository/Server/ServerCode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/UI/Main/TestingForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/UI/Main/TestingForm.java" afterDir="false" /> <change beforePath="$PROJECT_DIR$/src/TestingSystem/Common/TasksPackageState.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TasksPackageState.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/Common/TestingServer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TestingServer.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/TestingSystem/Common/TestsDatabase.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/Common/TestsDatabase.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/TestingSystem/DVM/DVMTestingPlanner.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/DVM/DVMTestingPlanner.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/TestingSystem/SAPFOR/SapforTestingPlanner.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/TestingSystem/SAPFOR/SapforTestingPlanner.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/Visual_DVM_2021/UI/Main/MainForm.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/Visual_DVM_2021/UI/Main/MainForm.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

@@ -4,7 +4,7 @@
"ServerUserName": "testuser", "ServerUserName": "testuser",
"ServerUserSHHPort": 23, "ServerUserSHHPort": 23,
"ComponentsServerPort": 7995, "ComponentsServerPort": 7995,
"TestingServerPort": 7998, "TestingServerPort": 7996,
"SocketTimeout": 5000, "SocketTimeout": 5000,
"OldServer": false, "OldServer": false,
"SMTPHost": "smtp.mail.ru", "SMTPHost": "smtp.mail.ru",
@@ -31,10 +31,10 @@
"PerformanceAnalyzerPath": "", "PerformanceAnalyzerPath": "",
"ComponentsBackUpsCount": 10, "ComponentsBackUpsCount": 10,
"TestingKernels": 28, "TestingKernels": 28,
"AutoCheckTesting": false, "AutoCheckTesting": true,
"CheckTestingIntervalSeconds": 10, "CheckTestingIntervalSeconds": 10,
"EmailOnTestingProgress": false, "EmailOnTestingProgress": false,
"collapseCredentials": true, "collapseCredentials": false,
"collapseFileGraphs": false, "collapseFileGraphs": false,
"collapseFileMessages": false, "collapseFileMessages": false,
"collapseProjectTrees": false "collapseProjectTrees": false

View File

@@ -70,7 +70,7 @@ public enum ServerCode {
GetFirstActiveDVMPackage, GetFirstActiveDVMPackage,
DVMPackageNeedsKill, // не доделано. DVMPackageNeedsKill, // не доделано.
UpdateActiveDVMPackages, UpdateActiveDVMPackages,
GetFirstActiveSapforPackage, GetFirstActiveSapforPackages,
SapforPackageNeedsKill, SapforPackageNeedsKill,
UpdateActiveSapforPackages, UpdateActiveSapforPackages,
DownloadDVMPackage, DownloadDVMPackage,
@@ -80,5 +80,6 @@ public enum ServerCode {
ReplaceTestCode, ReplaceTestCode,
ReplaceTestsCodes, ReplaceTestsCodes,
GetSapforPackagesJson, GetSapforPackagesJson,
GetFirstsActiveDVMPackages
; ;
} }

View File

@@ -25,8 +25,8 @@ public enum TasksPackageState implements StatusEnum {
RunningExecution, RunningExecution,
//-- //--
RunningEnd, //скачка архива RunningEnd, //скачка архива
//---------------------------------------
Analysis, Analysis,
//-
Done, Done,
Aborted; Aborted;
public boolean isActive() { public boolean isActive() {

View File

@@ -11,6 +11,7 @@ import Visual_DVM_2021.Passes.Server.TestingSystemPass;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.Vector;
public abstract class TestingPlanner<P extends TestingPackage> { public abstract class TestingPlanner<P extends TestingPackage> {
protected P testingPackage; protected P testingPackage;
protected int getSleepMillis() { protected int getSleepMillis() {
@@ -83,7 +84,7 @@ public abstract class TestingPlanner<P extends TestingPackage> {
} }
} }
//--- //---
protected abstract ServerCode getActivePackageCode(); protected abstract ServerCode getActivePackagesCode();
protected abstract ServerCode getCheckIfNeedsKillCode(); protected abstract ServerCode getCheckIfNeedsKillCode();
protected abstract TasksPackageState getStateAfterStart(); protected abstract TasksPackageState getStateAfterStart();
protected void InitSessionCredentials() { protected void InitSessionCredentials() {
@@ -130,11 +131,9 @@ public abstract class TestingPlanner<P extends TestingPackage> {
} }
} }
// --- // ---
public void Perform() { protected void PerformPackage(TestingPackage package_in) throws Exception{
try { testingPackage = (P) package_in;
testingPackage = null; //--
testingPackage = (P) ServerCommand(getActivePackageCode());
if (testingPackage != null) {
Print(testingPackage.id + ":" + testingPackage.state.getDescription()); Print(testingPackage.id + ":" + testingPackage.state.getDescription());
//-- //--
InitSessionCredentials(); InitSessionCredentials();
@@ -166,8 +165,15 @@ public abstract class TestingPlanner<P extends TestingPackage> {
testingPackage = null; testingPackage = null;
System.gc(); System.gc();
//-- //--
} }
//else Print(this.getClass().getSimpleName()+": no active package found"); public void Perform() {
try {
testingPackage = null;
Vector<P> activePackages = (Vector<P>) ServerCommand(getActivePackagesCode());
// System.out.println(this.getClass().getSimpleName()+": found "+activePackages.size()+" active packages"); //Тесты:
for (P activePackage: activePackages)
PerformPackage(activePackage);
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} finally { } finally {

View File

@@ -202,10 +202,6 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
response = new ServerExchangeUnit_2021(ServerCode.OK); response = new ServerExchangeUnit_2021(ServerCode.OK);
RefreshDVMTests((Account) request.object, Integer.parseInt(request.arg)); RefreshDVMTests((Account) request.object, Integer.parseInt(request.arg));
break; break;
case GetFirstActiveDVMPackage:
Print("Получить первый активный пакет задач DVM");
GetFirstActiveDVMPackage();
break;
case DVMPackageNeedsKill: case DVMPackageNeedsKill:
Print("Проверить нуждается ли пакет DVM в убийстве"); Print("Проверить нуждается ли пакет DVM в убийстве");
DVMPackageNeedsKill(); DVMPackageNeedsKill();
@@ -214,9 +210,9 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
Print("Получить данные по пакетам DVM"); Print("Получить данные по пакетам DVM");
UpdateActiveDVMPackages(); UpdateActiveDVMPackages();
break; break;
case GetFirstActiveSapforPackage: case GetFirstActiveSapforPackages:
Print("Получить первый активный пакет задач SAPFOR"); Print("Получить первый активный пакет задач SAPFOR");
GetFirstActiveSapforPackage(); GetFirstActiveSapforPackages();
break; break;
case SapforPackageNeedsKill: case SapforPackageNeedsKill:
Print("Проверить нуждает ли пакет SAPFOR в убийстве"); Print("Проверить нуждает ли пакет SAPFOR в убийстве");
@@ -254,6 +250,10 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
Print("Получить информацию о задачах пакетов SAPFOR"); Print("Получить информацию о задачах пакетов SAPFOR");
GetSapforPackagesJson(); GetSapforPackagesJson();
break; break;
case GetFirstsActiveDVMPackages:
Print("Получить первые активные пакеты задач DVM на машинах");
GetFirstActiveDVMPackagesByMachines();
break;
default: default:
throw new RepositoryRefuseException("Неподдерживаемый код: " + code); throw new RepositoryRefuseException("Неподдерживаемый код: " + code);
} }
@@ -385,24 +385,13 @@ public class TestingServer extends RepositoryServer<TestsDatabase> {
} }
} }
} }
//-------------------------------------------------------------------------------------->>> private void GetFirstActiveDVMPackagesByMachines() {
void GetFirstActiveDVMPackage() throws Exception {
response = new ServerExchangeUnit_2021(ServerCode.OK); response = new ServerExchangeUnit_2021(ServerCode.OK);
response.object = null; response.object = db.getFirstActiveDVMPackagesCopies();
DVMPackage dvmPackage = db.getFirstActiveDVMPackage();
if (dvmPackage != null) {
//нужно вернуть копию объекта с иным адресом!!
response.object = new DVMPackage(dvmPackage);
} }
} private void GetFirstActiveSapforPackages() throws Exception {
private void GetFirstActiveSapforPackage() throws Exception {
response = new ServerExchangeUnit_2021(ServerCode.OK); response = new ServerExchangeUnit_2021(ServerCode.OK);
response.object = null; response.object = db.getFirstActiveSapforPackagesCopies();
SapforPackage sapforPackage = db.getFirstActiveSapforPackage();
if (sapforPackage != null) {
//нужно вернуть копию объекта с иным адресом!!
response.object = new SapforPackage(sapforPackage);
}
} }
//--- //---
void UpdateActiveDVMPackages() throws Exception { void UpdateActiveDVMPackages() throws Exception {

View File

@@ -16,6 +16,9 @@ import TestingSystem.SAPFOR.ServerSapfor.ServerSapforsDBTable;
import Visual_DVM_2021.Passes.PassCode_2021; import Visual_DVM_2021.Passes.PassCode_2021;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Vector;
public class TestsDatabase extends SQLiteDatabase { public class TestsDatabase extends SQLiteDatabase {
public ConfigurationDBTable configurations; public ConfigurationDBTable configurations;
public TestDBTable tests; public TestDBTable tests;
@@ -52,64 +55,93 @@ public class TestsDatabase extends SQLiteDatabase {
public PassCode_2021 getSynchronizePassCode() { public PassCode_2021 getSynchronizePassCode() {
return PassCode_2021.SynchronizeTests; return PassCode_2021.SynchronizeTests;
} }
public DVMPackage getFirstActiveDVMPackage() { public Vector<SapforPackage> getFirstActiveSapforPackagesCopies() {
DVMPackage first_active = null; Vector<SapforPackage> res = new Vector<>();
DVMPackage first_queued = null; Vector<SapforPackage> packages = new Vector<>();
if (!dvmPackages.Data.isEmpty()) { SapforPackage activePackage = null;
for (DVMPackage p : dvmPackages.Data.values()) { //1. получить активные пакеты.
switch (p.state) {
case Done:
case Aborted:
break;
case Queued:
if (first_queued == null) first_queued = p;
break;
default:
if (first_active == null) first_active = p; //это и будет первый активный.
break;
}
}
if (first_active != null) return first_active;
if (first_queued != null) {
first_queued.state = TasksPackageState.TestsSynchronize;
try {
Update(first_queued);
} catch (Exception ex) {
ex.printStackTrace();
}
}
return first_queued;
}
return null;
}
public SapforPackage getFirstActiveSapforPackage() {
SapforPackage first_active = null;
SapforPackage first_queued = null;
if (!sapforPackages.Data.isEmpty()) {
for (SapforPackage p : sapforPackages.Data.values()) { for (SapforPackage p : sapforPackages.Data.values()) {
switch (p.state) { switch (p.state) {
case Done: case Done:
case Aborted: case Aborted:
break; case Draft:
case Queued:
if (first_queued == null) first_queued = p;
break; break;
default: default:
if (first_active == null) first_active = p; //это и будет первый активный. packages.add(p);
break; break;
} }
} }
if (first_active != null) return first_active; //2. отсортировать по приоритету.
if (first_queued != null) { packages.sort(new Comparator<SapforPackage>() {
first_queued.state = TasksPackageState.TestsSynchronize; @Override
public int compare(SapforPackage o1, SapforPackage o2) {
return Integer.compare(o1.state.ordinal(), o2.state.ordinal());
}
});
if (!packages.isEmpty()) {
activePackage = packages.lastElement();
if (activePackage.state.equals(TasksPackageState.Queued)) {
activePackage.state = TasksPackageState.TestsSynchronize;
try { try {
Update(first_queued); Update(activePackage);
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
} }
return first_queued; res.add(new SapforPackage(activePackage));
; //копия чтобы не было конфликта доступа с нитью планировщика.
} }
return null; return res;
}
public Vector<DVMPackage> getFirstActiveDVMPackagesCopies() {
Vector<DVMPackage> res = new Vector<>();
//--
LinkedHashMap<String, Vector<DVMPackage>> packagesByMachines = new LinkedHashMap<>();
//----
//1. Получить список активных пакетов по машинам.
for (DVMPackage dvmPackage : dvmPackages.Data.values()) {
switch (dvmPackage.state) {
case Done:
case Aborted:
case Draft:
break;
default:
//активен.
Vector<DVMPackage> packages = null;
//--
if (packagesByMachines.containsKey(dvmPackage.machine_address)) {
packages = packagesByMachines.get(dvmPackage.machine_address);
} else {
packages = new Vector<>();
packagesByMachines.put(dvmPackage.machine_address, packages);
}
packages.add(dvmPackage);
break;
}
}
//2. Выбрать для каждой машины наиболее приоритетный пакет.
for (String machine : packagesByMachines.keySet()) {
Vector<DVMPackage> packages = packagesByMachines.get(machine);
if (!packages.isEmpty()) {
packages.sort(new Comparator<DVMPackage>() {
@Override
public int compare(DVMPackage o1, DVMPackage o2) {
return Integer.compare(o1.state.ordinal(), o2.state.ordinal());
}
});
//-
DVMPackage activePackage = packages.lastElement();
if (activePackage.state.equals(TasksPackageState.Queued)) {
activePackage.state = TasksPackageState.TestsSynchronize;
try {
Update(activePackage);
} catch (Exception ex) {
ex.printStackTrace();
}
}
res.add(new DVMPackage(activePackage)); //копия чтобы не было конфликта доступа с нитью планировщика.
}
}
return res;
} }
} }

View File

@@ -125,8 +125,8 @@ public class DVMTestingPlanner extends TestingPlanner<DVMPackage> {
} }
//--- //---
@Override @Override
protected ServerCode getActivePackageCode() { protected ServerCode getActivePackagesCode() {
return ServerCode.GetFirstActiveDVMPackage; return ServerCode.GetFirstsActiveDVMPackages;
} }
@Override @Override
protected ServerCode getCheckIfNeedsKillCode() { protected ServerCode getCheckIfNeedsKillCode() {

View File

@@ -19,8 +19,8 @@ import java.util.Date;
public class SapforTestingPlanner extends TestingPlanner<SapforPackage> { public class SapforTestingPlanner extends TestingPlanner<SapforPackage> {
File workspace; File workspace;
@Override @Override
protected ServerCode getActivePackageCode() { protected ServerCode getActivePackagesCode() {
return ServerCode.GetFirstActiveSapforPackage; return ServerCode.GetFirstActiveSapforPackages;
} }
@Override @Override
protected ServerCode getCheckIfNeedsKillCode() { protected ServerCode getCheckIfNeedsKillCode() {
@@ -139,4 +139,5 @@ public class SapforTestingPlanner extends TestingPlanner<SapforPackage> {
killer.waitFor(); killer.waitFor();
Print("done!"); Print("done!");
} }
//--
} }

View File

@@ -171,7 +171,7 @@ public class MainForm extends Form implements MainWindow {
res += selected_tests.size(); res += selected_tests.size();
} }
//-- //--
globalTabs.setTitleAt(3, "Тесты: " + res); globalTabs.setTitleAt(2, "Тесты: " + res);
} }
private void SaveTestingPanel() { private void SaveTestingPanel() {
if (testingForm != null) { if (testingForm != null) {