Skip to content

MailBurg 1.8.1

Choose a tag to compare

@Stephan-Lefty Stephan-Lefty released this 09 Oct 09:28
· 10 commits to main since this release

Zwei Fehler, die niemandem aufgefallen wären, und ein Werkzeug, das
eine Wand weggeräumt hat. Diese Fassung kommt aus einem einzigen
Vormittag im laufenden Betrieb – angestoßen von einer Frage, nicht von
einem Fehlerbericht.

Auf einem Server blieb jeder eingescannte Anhang stumm

Wer MailBurg Server betreibt, sollte diese Fassung einspielen.

Im Programm steht seit jeher, was geschehen soll: nach jedem Abruf ein
kleines Zeitbudget Texterkennung, zwei Minuten oder dreißig Dokumente,
damit neu ankommende Scans sofort durchsuchbar sind. Das Programmfenster
tat das. Der Dienst nie – und auf einem Server gibt es kein Fenster.

Wie es aussah, ist der eigentliche Punkt. Die Mail war da, der
Anhang war da, nur ließ sich nichts darin finden. Das sieht nicht nach
einer Störung aus, sondern nach einem Dokument, in dem eben kein Text
steht. Wer eine Rechnungsnummer sucht, die ausschließlich auf dem
eingescannten Papier steht, bekommt keinen Treffer und sucht den Fehler
bei sich.

Der Dienst arbeitet jetzt dasselbe Häppchen ab wie das Fenster, im
selben geöffneten Archiv
. Eine Erkennung daneben – als zweiter Dienst
oder eigener Zeitplan – stünde dem Abruf im Weg, und dann bliebe Post
liegen, um Scans lesbar zu machen. Die Rangfolge ist eindeutig:
Archivieren ist Pflicht, Durchsuchbarmachen ist Kür.

Die Zahl der gelesenen Dokumente steht in der Abrufmeldung. Ohne sie
wäre von außen wieder nicht nachprüfbar, ob es läuft – und genau daran
lag es, dass die Lücke so lange unbemerkt blieb: Ein Dienst, der etwas
nicht tut, sieht aus wie einer, der nichts zu tun hatte.

Fehlt tesseract, wird das einmal je Dienstlauf gemeldet statt
achtundvierzigmal am Tag. Verschweigen wäre falsch, denn dann bleibt
jeder Scan dauerhaft unauffindbar; eine Tapete im Ereignisprotokoll
liest aber auch niemand.

Die Trefferliste fragte ein Archiv, das längst zu war

Beim Schließen eines Fensters sortiert und blättert Qt noch einmal – und
die Trefferliste lief dabei in ein Cannot operate on a closed database.

suchen() hatte die Prüfung von Anfang an, mit der Begründung im
Kommentar daneben. fetchMore prüfte nur, ob überhaupt ein Index da ist.
Zwei Stellen, eine nachgezogen, die andere nicht. Beide fragen jetzt
dieselbe Methode, damit die dritte sie nicht vergessen kann.

Im Betrieb trifft es den, der das Archiv wechselt, während Treffer
angezeigt werden. Gemessen: 76 Meldungen in einem Testlauf, danach keine.

Alle Befehle auf einen Blick

Neu: docs/befehle.md
– die Kommandozeile vollständig, nach Aufgaben geordnet statt nach dem
Alphabet
: nachsehen und prüfen, Post hereinholen, suchen und
herausholen, sichern, pflegen. Dazu die drei Befehle, die es allein für
die Server-Fassung gibt.

Obenan stehen drei Regeln, die aus Schaden stammen: vor dem Sichern den
Abruf anhalten, der Dienst hält den Suchindex, Kontonamen sind
unveränderlich. Jede hat im Betrieb schon Stunden oder Daten gekostet.

Ein Wächtertest hält die Übersicht an der Wirklichkeit. Jeder
genannte Befehl und jede genannte Option wird gegen den Parser des
Programms geprüft. Eine Übersicht veraltet sonst still – und wer dann
abtippt, was dort steht, bekommt eine Fehlermeldung statt einer Auskunft.

Für Mitwirkende: die Tests laufen über einen eigenen Läufer

python3 tests/lauf.py

Der Testlauf brach auf manchen Systemen nach dem letzten Test mit
einem Speicherzugriffsfehler ab, während unittest zuvor »OK« gemeldet
hatte. Der Absturz liegt im C++-Teil von Qt beim Herunterfahren des
Interpreters.

Es lag nicht an einem bestimmten Test, sondern an ihrer Zahl. Zehn
Methoden, die nichts tun als assertTrue(True), reichten zum Absturz:
2383 Tests gingen, 2393 nicht. Damit hätte jeder künftige Test dieselbe
Wirkung gehabt – bei einem Projekt, in dem jede Zusage einen Test
schuldet, ist das eine Wand und keine Lästigkeit.

Der Läufer führt die Tests aus, merkt sich das Ergebnis, räumt auf und
beendet den Prozess dann selbst. Das behebt das Symptom, nicht die
Ursache
, und genau so steht es im Modulkopf. Der Preis gehört dazu:
Fehler, die erst beim Aufräumen aufträten, fallen nicht mehr auf; wer
danach sucht, nimmt weiterhin python3 -m unittest discover -s tests.

Acht Tests wachen über den Läufer selbst. Einer, der immer 0 liefert,
wäre schlimmer als jeder Absturz: Die CI wäre grün, und kein
gescheiterter Test fiele je wieder auf.

Vier Lücken weniger in den Anleitungen

Alle aus dem Umzug eines Geschäftsarchivs mit 827.199 Dateien:

  • Die Vollständigkeitsrechnung – wie man belegt, dass jede
    ausgegebene Datei erklärt ist. Das war am Umzugstag die eigentliche
    Arbeit, und sie stand nirgends.
  • Die Codepage im Protokoll. Die Windows-Konsole schreibt
    »▄bergangen« statt »Übergangen«; wer nach dem Wort sucht, findet
    nichts und hält eine Meldung für nicht vorhanden, die achtzehnmal
    dastand.
  • Die deutschen Sprachdaten für tesseract. winget install bringt
    sie nicht mit, und MailBurg liest dann mit dem englischen Modell.
  • Sichern neben einem laufenden Abruf erzeugt eine Sicherung, die
    sich selbst widerspricht – und »Kette heil« meldet.

2403 Tests, lesbarkeit.py ohne Befund, CI grün.