Hallo,
erklär doch bitte mal genauer.
* Laufen die Prozesse auf demselben Host?
* Haben sie beide direkten Dateizugriff?
* Von wo nach wo wird die "große Datei" geladen?
Ja, die Prozesse laufen beide (können auch viele sein) auf demselben Host. Sie haben auch alle direkt Dateizugriff. Die große Datei (> 1 GB) wird von einem remote server auf den lokalen Host geladen, und zwar via ftp oder http, selten ssh. Es handelt sich also um Zugriff auf das Dateisystem und nicht um einen Datenbankzugriff.
gut, jetzt habe ich also eine ungefähre Vorstellung.
Prozess a lädt die Datei erstmal auf die Platte, schreibt sie also... Wenn er (der Prozess) sie nach dem Speichern lesend öffnet, brauche ich ja die Sperre nicht mehr.
Sehe ich auch so. Nur sollte Prozess a die Datei, wenn er sie erzeugt bzw. schreibt, auf jeden Fall gegen andere Zugriffe sperren. In der Phase ist eventuell sogar eine Sperre gegen ein weiteres Öffnen zum Lesen sinnvoll, denn Prozess b (c, d, e ...) würde ja dann unvollständige und dadurch möglicherweise ungültige Daten lesen.
File Locking... ok. Was passiert, wenn Prozess a den Download aus welchen Gründen auch immer nicht beendet hat?
Kommt drauf an. Solange Prozess a immer noch läuft, auch wenn der Download vielleicht unkontrolliert abgebrochen wurde, kann die Datei geöffnet und die Sperre noch bestehen bleiben. Spätestens wenn Prozess a endet, räumt aber das Betriebssystem hinter ihm her, schließt seine offenen File-Handles und löst ggf. noch bestehende Sperren auf.
Normalerweise sollte das Programm aber so gestrickt sein, dass es das bei Übertragungsfehlern sofort selbst tut. Es wäre zu überlegen, ob nach einem fehlerhaften bzw. unvollständigen Download die partiell vorhandenen Daten wieder gelöscht werden (dann sollte Prozess b aber die (Nicht-)Integrität an bestimmten Merkmalen erkennen) oder einfach halbfertig liegenbleiben (kann für eine Fehleranalyse vorteilhaft sein).
Wäre nicht die Metainformation wichtig, wie lange der Download nun schon dauert?
Ist diese Information denn nötig oder gewünscht? Sobald Prozess feststellt, dass die Datei gesperrt ist, könnte er den zugehörigen Verzeichniseintrag lesen und nach dem Creation Timestamp schauen. Und bekommt über den Quotient aus momentaner Dateigröße und verstrichener Zeit seit dem Anlegen auch die Übertragungsrate, falls das jemand wissen will. Falls die endgültige Dateigröße bekannt ist, kann man daraus sogar eine Schätzung ableiten, wie lange es noch dauern wird.
"Papa, wann sind wir endlich daaa?" ;-)
Der Zugriff ist heikel, die Prozesse könnten überhaupt nicht laufen, wenn ihnen die Datei fehlen würde.
Das ist schlecht. Programme sollten immer so robust ausgelegt sein, dass sie auf vorhersehbare Fehler (und das wäre so einer) sinnvoll und kontrolliert reagieren.
So long,
Martin
--
Abraham sprach zu Bebraham: Kann i mal dei Cebra ham?
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(