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; 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", {