Der Scan schreibt auch dann zwischendurch, wenn ffprobe scheitert

Gemessen an achtzig Dateien: der Zählstand steht nach einer Sekunde bei
38, nach zwei bei 75, nach drei bei 80. Der Scan liefert also längst
laufend — anders als ich behauptet hatte. Der Grund steht in
UntersuchenAsync, das je Datei speichert; ich hatte nur das
SaveChangesAsync nach der Schleife gesehen.

Eine Lücke bleibt: scheitert die Untersuchung, kehrt sie vor dem
Speichern um. Ein Bestand aus Dateien, die ffprobe nicht lesen kann,
bliebe damit bis zum Schluss unsichtbar, und wer zusieht, hält den Scan
für hängend. Deshalb jetzt zusätzlich alle fünfzig Dateien ein Schreiben
aus der Schleife heraus — fünfzig und nicht jede, weil ein Schreibvorgang
je Datei bei vierzigtausend mehr kostet, als die Sichtbarkeit wert ist.

Für das Aufräumen danach ist das unbedenklich, aber nicht offensichtlich:
es löscht alles mit älterer SeenAt-Zeit als der Lauf, und würde die Zeit
irgendwo neu genommen statt vor der Schleife festgehalten, risse es den
halben Bestand mit. Ein Test über 120 Nulldateien — an denen ffprobe
scheitert, also genau der neue Weg — hält das fest.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-04 11:27:41 +02:00
co-authored by Claude Opus 5
parent b25c7a4712
commit d01c5d43f4
2 changed files with 58 additions and 0 deletions
+22
View File
@@ -62,6 +62,7 @@ public sealed class LibraryScanner(
: [];
int neu = 0, geändert = 0, unerkannt = 0, untersucht = 0;
var seitLetztemSchreiben = 0;
foreach (var datei in ergebnis.Files)
{
@@ -129,6 +130,27 @@ public sealed class LibraryScanner(
}
if (mussUntersucht && await UntersuchenAsync(eintrag, laufZeit, ct)) untersucht++;
// **Zwischendurch schreiben, nicht erst am Ende.**
//
// Gemessen an achtzig Dateien erscheinen die Titel ohnehin
// laufend — denn <see cref="UntersuchenAsync"/> speichert je
// Datei. Nur gilt das eben *nur* dort: scheitert die
// Untersuchung, kehrt sie vor dem Speichern um. Ein Bestand aus
// Dateien, die ffprobe nicht lesen kann, bliebe bis zum Schluss
// unsichtbar — und wer dabei zusieht, hält den Scan für hängend.
//
// Fünfzig, nicht jede: ein Schreibvorgang je Datei kostet bei
// vierzigtausend mehr, als die Sichtbarkeit wert ist.
//
// Für das Aufräumen weiter unten ist das unbedenklich. Es
// vergleicht gegen `laufZeit`, und die steht vor der Schleife
// fest; jede hier geschriebene Datei trägt genau diesen Wert.
if (++seitLetztemSchreiben >= 50)
{
await db.SaveChangesAsync(ct);
seitLetztemSchreiben = 0;
}
}
await db.SaveChangesAsync(ct);