generated from Dicken/dickendock
round45: Sammel-Scan bearbeitet jetzt bis zu 10 Geraete gleichzeitig statt nacheinander (behebt sehr lange Gesamtdauer bei vielen Geraeten)
This commit is contained in:
@@ -203,19 +203,32 @@ export async function scanRoutes(app: FastifyInstance): Promise<void> {
|
|||||||
let cancelled = false;
|
let cancelled = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for (const device of devices) {
|
// Mehrere Geräte GLEICHZEITIG scannen statt strikt nacheinander -
|
||||||
|
// bei z. B. 118 Geräten und je 10-30 Sekunden pro vollständigem
|
||||||
|
// Portscan hätte ein rein sequenzieller Durchlauf zusammen leicht
|
||||||
|
// 30+ Minuten gedauert. Batch-Größe bewusst moderat (nicht alle
|
||||||
|
// Geräte auf einmal): jeder einzelne Geräte-Scan öffnet intern schon
|
||||||
|
// bis zu 1000 gleichzeitige Verbindungen (siehe ports.ts) - zu viele
|
||||||
|
// Geräte gleichzeitig könnte das eigene Netz/den Docker-Host
|
||||||
|
// überlasten.
|
||||||
|
const CONCURRENT_DEVICES = 10;
|
||||||
|
for (let i = 0; i < devices.length; i += CONCURRENT_DEVICES) {
|
||||||
if (isCancelRequested("devices")) {
|
if (isCancelRequested("devices")) {
|
||||||
cancelled = true;
|
cancelled = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
updateJobProgress("devices", scannedCount, device.hostname);
|
const batch = devices.slice(i, i + CONCURRENT_DEVICES);
|
||||||
|
updateJobProgress("devices", scannedCount, batch.map((d) => d.hostname).join(", "));
|
||||||
|
|
||||||
|
await Promise.all(
|
||||||
|
batch.map(async (device) => {
|
||||||
if (!tryLockDevice(device.id)) {
|
if (!tryLockDevice(device.id)) {
|
||||||
// Für dieses eine Gerät läuft bereits ein separater Scan (z. B.
|
// Für dieses eine Gerät läuft bereits ein separater Scan
|
||||||
// über den "Jetzt scannen"-Button auf der Geräte-Seite) -
|
// (z. B. über den "Jetzt scannen"-Button auf der
|
||||||
// überspringen statt zu überlappen, sonst könnten beide
|
// Geräte-Seite) - überspringen statt zu überlappen, sonst
|
||||||
// gleichzeitig denselben neuen Dienst anlegen wollen.
|
// könnten beide gleichzeitig denselben neuen Dienst anlegen
|
||||||
scannedCount++;
|
// wollen.
|
||||||
continue;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
const result = await performDeviceScan(device, true);
|
const result = await performDeviceScan(device, true);
|
||||||
@@ -229,7 +242,10 @@ export async function scanRoutes(app: FastifyInstance): Promise<void> {
|
|||||||
} finally {
|
} finally {
|
||||||
unlockDevice(device.id);
|
unlockDevice(device.id);
|
||||||
}
|
}
|
||||||
scannedCount++;
|
})
|
||||||
|
);
|
||||||
|
scannedCount += batch.length;
|
||||||
|
updateJobProgress("devices", scannedCount, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
finishJob("devices", {
|
finishJob("devices", {
|
||||||
|
|||||||
Reference in New Issue
Block a user