Разделение очереди на разные машины, и исправление бага. могло выполняться более одного пакета одновременно
This commit is contained in:
@@ -16,6 +16,9 @@ import TestingSystem.SAPFOR.ServerSapfor.ServerSapforsDBTable;
|
||||
import Visual_DVM_2021.Passes.PassCode_2021;
|
||||
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Comparator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Vector;
|
||||
public class TestsDatabase extends SQLiteDatabase {
|
||||
public ConfigurationDBTable configurations;
|
||||
public TestDBTable tests;
|
||||
@@ -52,64 +55,93 @@ public class TestsDatabase extends SQLiteDatabase {
|
||||
public PassCode_2021 getSynchronizePassCode() {
|
||||
return PassCode_2021.SynchronizeTests;
|
||||
}
|
||||
public DVMPackage getFirstActiveDVMPackage() {
|
||||
DVMPackage first_active = null;
|
||||
DVMPackage first_queued = null;
|
||||
if (!dvmPackages.Data.isEmpty()) {
|
||||
for (DVMPackage p : dvmPackages.Data.values()) {
|
||||
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;
|
||||
}
|
||||
public Vector<SapforPackage> getFirstActiveSapforPackagesCopies() {
|
||||
Vector<SapforPackage> res = new Vector<>();
|
||||
Vector<SapforPackage> packages = new Vector<>();
|
||||
SapforPackage activePackage = null;
|
||||
//1. получить активные пакеты.
|
||||
for (SapforPackage p : sapforPackages.Data.values()) {
|
||||
switch (p.state) {
|
||||
case Done:
|
||||
case Aborted:
|
||||
case Draft:
|
||||
break;
|
||||
default:
|
||||
packages.add(p);
|
||||
break;
|
||||
}
|
||||
if (first_active != null) return first_active;
|
||||
if (first_queued != null) {
|
||||
first_queued.state = TasksPackageState.TestsSynchronize;
|
||||
}
|
||||
//2. отсортировать по приоритету.
|
||||
packages.sort(new Comparator<SapforPackage>() {
|
||||
@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 {
|
||||
Update(first_queued);
|
||||
Update(activePackage);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
return first_queued;
|
||||
res.add(new SapforPackage(activePackage));
|
||||
; //копия чтобы не было конфликта доступа с нитью планировщика.
|
||||
}
|
||||
return null;
|
||||
return res;
|
||||
}
|
||||
public SapforPackage getFirstActiveSapforPackage() {
|
||||
SapforPackage first_active = null;
|
||||
SapforPackage first_queued = null;
|
||||
if (!sapforPackages.Data.isEmpty()) {
|
||||
for (SapforPackage p : sapforPackages.Data.values()) {
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
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;
|
||||
//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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user