round45: Sammel-Scan bearbeitet jetzt bis zu 10 Geraete gleichzeitig statt nacheinander (behebt sehr lange Gesamtdauer bei vielen Geraeten)

This commit is contained in:
2026-07-25 13:17:44 +02:00
parent 59bb4a30b8
commit 6792f5b7ea

View File

@@ -203,19 +203,32 @@ export async function scanRoutes(app: FastifyInstance): Promise<void> {
let cancelled = false;
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")) {
cancelled = true;
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)) {
// Für dieses eine Gerät läuft bereits ein separater Scan (z. B.
// über den "Jetzt scannen"-Button auf der Geräte-Seite) -
// überspringen statt zu überlappen, sonst könnten beide
// gleichzeitig denselben neuen Dienst anlegen wollen.
scannedCount++;
continue;
// Für dieses eine Gerät läuft bereits ein separater Scan
// (z. B. über den "Jetzt scannen"-Button auf der
// Geräte-Seite) - überspringen statt zu überlappen, sonst
// könnten beide gleichzeitig denselben neuen Dienst anlegen
// wollen.
return;
}
try {
const result = await performDeviceScan(device, true);
@@ -229,7 +242,10 @@ export async function scanRoutes(app: FastifyInstance): Promise<void> {
} finally {
unlockDevice(device.id);
}
scannedCount++;
})
);
scannedCount += batch.length;
updateJobProgress("devices", scannedCount, null);
}
finishJob("devices", {