Auf das Netzwerk ist kein Verlass


Wenn man sich auf etwas nicht verlassen kann, dann ist es das Netzwerk. Und dessen sollte man sich immer bewusst sein, was immer man programmiert und irgendwie mit Netzwerk zu tun hat, ansonsten kann man böse Überraschungen erleben, wenn es dann mal ausfällt und man diese Möglichkeit nicht berücksichtigt hat. Und ganz schnell merkt man dann, wenn man sich Gedanken darüber macht, das eine Aufgabe, die erst recht trivial aussah, bei näherer Betrachtung doch etwas mehr Programmieraufwand erfordert.

Nehmen wir ein einfaches Beispiel. Ein Kunde von uns hatte ein Programm in Auftrage gegeben, welches Dateien aus einer Samba-Freigabe auf den lokalen Rechner verschieben und von dort dann in ein Dokumentenverwaltungssystem importieren sollte. Ich gehe davon aus, dass klar sein sollte, dass unter gar keinen Umständen eine dieser Dateien verloren gehen darf.
OK, Dateien verschieben. Kein Problem, gibt ja die API-Funktion MoveFile. Jetzt aber die große Frage: Was passiert, wenn beim Verschieben der Datei das Netzwerk ausfällt? Als erstes wird MoveFile wahrscheinlich mit einer Fehlermeldung zurückkehren. Aber was ist mit der Datei? Wie arbeitet MoveFile? Wird die Datei aus dem Quellverzeichnis erst gelöscht, wenn sie erfolgreich verschoben werden konnte oder existiert sie dann schon nicht mehr in dem Quellverzeichnis? Und habe ich dann im Zielverzeichnis eine kaputte Datei, weil nicht vollständig? Gut, man könnte das jetzt testen und im besten Fall, wird sie aus dem Quellverzeichnis erst gelöscht, wenn sie auch erfolgreich verschoben werden konnte. Aber kann man sich darauf verlassen? Als Grundregel sollte man sich zu eigen machen, dass man sich auf gar nichts verlässt. Und als Konsequenz resultiert daraus, dass man so defensiv wie möglich programmiert.

Wie sah nun unsere Lösung aus? Die Lösung ist relativ einfach: Zu erst werden alle Dateien kopiert und erst, wenn alle Dateien erfolgreich kopiert wurden, werden sie aus dem Quellverzeichnis gelöscht. Tritt während des Kopierens ein Fehler auf, werden die schon kopierten Dateien wider gelöscht, eine Fehlermeldung ausgegeben und der weiter Programmablauf abgebrochen. Aber das ist noch nicht alles. Was wenn während des Löschens das Netzwerk ausfällt? Eigentlich kein Problem, ist ja nicht weiter tragisch, es kommt ja zu keinem Datenverlust. Aber wird das Programm das nächste Mal gestartet, werden Dateien noch mal kopiert und importiert, die schon bearbeitet wurden. Es entstehen also Dubletten in dem Dokumentenverwaltungssystem, was auch nicht sein darf. Also wird beim Löschen eine Liste mitgeführt aus der jede erfolgreich gelöschte Datei entfernt wird. Sollte es zu einem Fehler beim Löschen kommen, weil das Netzwerk nicht verfügbar ist, kann eine Liste der noch nicht gelöschten Dateien ausgegeben werden, so dass diese vor dem nächsten Programmstart von Hand gelöscht werden können.

Wie man sieht, erschien die Problemstellung auf den ersten Blick trivial. Unter Berücksichtigung, dass man sich auf das Netzwerk nicht verlassen kann, ist aus einer Zeile Programmcode (MoveFile) eine ganze Klasse geworden.

Hier das ganze noch mal als Flussdiagramm:


Flussdiagramm - Dateien verschieben

An dem Flussdiagramm sieht man auch noch mal, wie nützlich es ist, sich so etwas vorher mal zu überlegen und zu Papier zu bringen, bevor man anfängt das ganze zu programmieren, denn mit den Flussdiagramm vor Augen fällt es viel leichter bei der Implementation nicht den Überblick zu verlieren. Und es hat den Vorteil, dass man es dem Kollegen zeigen kann, der dann eventuell noch einen Fehler in der Programmlogik bemerkt oder noch Verbesserungsvorschläge hat. Und um so ein Flussdiagramm zu erstellen braucht es nicht unbedingt Microsoft Visio oder ein anderes teures und aufwendiges Programm. Dieses Flussdiagramm wurde zum Beispiel mit OpenOffice Draw erstellt.

2010-12-29T23:44:51 +0100, mail+homepage[at]michael-puff.de