Grundkonzeptfrage zu meinem Watchfolderproblem von gestern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Nachdem ich gestern ja hier in dem Thread http://www.python-forum.de/topic-14206.html ja ne recht banale Frage hatte, kam neben der sehr schnellen Beantwortung dieser Frage auch ne Anmerkung bezueglich "Polling ist nicht so ne tolle Loesung", usw. Da das in dem anderen Thread aber eher nebensaechlich war und ich nicht ausfuehrlich erklaert habe worum es geht, versuche ich das hier jetzt nochmal. Einfach in der Hoffnung dass ich da von Euch vielleicht auch konzeptionell und nicht "nur" bei der Suche nach nem bestimmten Kommando noch Input bekomme und da was lernen kann :)

Hier mal meine Ausgangsaufgabenstellung:
ich arbeite im Film-Postproduction-Bereich, mache also digitale Effekte fuer Kinofilme. Hauptarbeitsmittel ist da ein grosser SAN-Storage, auf den verschiedenste Workstations (hauptsaechlich Macs) und ne Renderfarm zugreifen. Auf dem Storage liegen vor allem viele Ordner mit Einzelbildsequenzen drin.

Um die Highres-Bildsequenzen in Echtzeit anschauen zu koennen gibt es parallel dazu einen zweiten Rechner (Windows), der nen eigenen, sehr schnellen RAID-Storage hat, von dem er abspielt.

Was passieren soll ist jetzt folgendes. Die Renderfarm rechnet ne Bildsequenz, die in nem Ordner auf dem SAN landet. Diese Daten sollen jetzt nachdem sie fertig gerendert sind auf den Playbackrechner kopiert werden. Problem dabei ist: es darf nur in dem Moment kopiert werden in dem der Playbackrechner gerade nicht auf "Play" steht. Denn wenn parallel geschrieben wird ist nicht mehr zuverlaessig ein Realtime-Playback moeglich. Als Hilfsmittel, damit man weiss wann das Teil nen Playback macht, wird automatisch auf der Festplatte eine versteckte Datei (.play) angelegt, die sofort geloescht wird wenn man in der Software wieder auf "Stopp" geht.

Mein Grundkonzept sieht deshalb momentan folgendermassen aus:
1. Nach nem erfolgreichen Rendervorgang wird von der Renderfarm ein aufsteigend durchnummeriertes Textfile angelegt, das einfach den vollstaendigen Pfad zum jeweiligen zu kopierenden Ordner enthaelt.
2. Auf dem Playbackrechner hab ich mir jetzt ein Skript geschrieben, das in erstmal einfach aus ner while True-Endlosschleife besteht. Diese schaut erstmal nach ob .play gerade existiert. Wenn ja, warte ich mit sleep ein paar Sekunden und schau dann wieder nach.
3. wenn .play nicht existiert, schaue ich ob in dem Watchfolder Dateien drinliegen. Wenn ja, lese ich deren Namen per glob in ne Liste und arbeite dann jedes File ab.
4. dazu lese ich den Pfad aus den Dateien aus, lese mit glob den Inhalt des Pfadordners aus (sprich ich hole mir die Namen der einzelnen Dateien der Bildsequenz) und kopiere diese Dateien dann einzeln vom SAN auf den Storage des Playbackrechners. Vor jedem Einzelkopiervorgang checke ich nochmal ob .play existiert und kopiere erst dann wenn .play nicht (mehr) existiert.
5. Nach erfolgreichem Kopiervorgang loesche ich das entsprechende Queuefile aus dem Watchfolder.

Soweit momentan mein Konzept, das jetzt auch funktioniert. Laeuft rein im Terminal ohne GUI, aber das kann ja spaeter kommen.

Meine Frage jetzt:
In dem anderen Thread habt Ihr mir ja inotify bzw. gamin empfohlen, um eben nicht ein Polling machen zu muessen. Ist unter der obigen Voraussetzung immer noch sinnvoll/moeglich? Problem ist ja dass ich an den Kernel des SANs nicht rankomme. Wie koennte ich da also was "anschubsen"?
Und habt Ihr evtl. auch sonst noch konzeptionell Ideen, was an meiner Loesung evtl. voellig umstaendlich/unnoetig ist und eleganter geloest werden koennte?

Danke fuers Zuhoeren und fuer evtl. Tipps/Anregungen! Ich weiss das ist ein wenig lang geraten, hab aber nicht so recht ne Ahnung was ich weglassen haette koennen :)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Du bist ja in der selben Branche wie ich, auch wenn ich nix mit Kinofilmen bisher zu tun hatte ;)

Ich frage mich gerade, warum die fertigen Bilder nicht gleich auf beiden Rechnern kopiert werden.
Also das Rendering eines Frames dauert ja in der Regel seine Zeit. Somit fallen ja nicht viele Bilder in kurzer Zeit an. Wenn also direkt auf dem SAN-Storage und dem RAID-Storage vom Playbackrechner gespeichert wird, bringt das den Realtime-Playback schon zur strecke?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

hm, gute Frage. Aber dazu muesste ich ja z.B. den Storage des Playbackrechners z.B. schon mal im Netzwerk freigeben und auf allen Renderrechnern mounten. Allein das klingt fuer mich schon nach vorprogrammiertem Aerger :)

Und da es halt nicht um 3D-Rendering mit Renderzeiten von vielen Minuten, sondern um Film-Compositing geht, wo es auch mal Renderzeiten von nur wenigen Sekunden gibt, ist mir sowas zu heikel.

Vor allem kann es ja auch mal sein dass diese Playbackkiste auch mal down ist, umgebaut wird, einen Reboot macht, usw. Deshalb wuerde ich eigentlich nicht gerne als Server laufen lassen, der dann dauernd online sein muesste.

PS: was machst Du denn genau?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

shakebox hat geschrieben:In dem anderen Thread habt Ihr mir ja inotify bzw. gamin empfohlen, um eben nicht ein Polling machen zu muessen. Ist unter der obigen Voraussetzung immer noch sinnvoll/moeglich? Problem ist ja dass ich an den Kernel des SANs nicht rankomme. Wie koennte ich da also was "anschubsen"?
Solange du das SAN in einen Ordner mounten kannst sollte inotify bei Änderungen anspringen. Wie greifst du darauf zu? Per Samba? (ab 3.0.25 scheint es inotify zu untersützen) NFS? (das scheint hingegen gar nicht zu tun)

Vergiss aber nicht, dass wir hier von Linux sprechen. Windows hat zwar ähnliche Möglichkeiten, allerdings habe ich von einigen hier gehört dass sie unzuverlässig sind.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Leonidas hat geschrieben:Solange du das SAN in einen Ordner mounten kannst sollte inotify bei Änderungen anspringen. Wie greifst du darauf zu? Per Samba? (ab 3.0.25 scheint es inotify zu untersützen) NFS? (das scheint hingegen gar nicht zu tun)
weder noch :) Das Volume ist "lokal" angeschlossen per Fibrechannel, verhaelt sich also eher wie ne lokale Festplatte (taucht deshalb im Arbeitsplatz von Windows auch bei den internen Platten auf und nicht bei den Netzlaufwerken).

Nur zum Verstaendnis: gamin oder inotify wuerde also nicht auf dem "Server" (gibt es ja bei SAN eben nicht) laufen sondern auf dem Client (erstmal unabhaengig von der Frage des OS)? Kann mir die Funktionsweise da noch nicht ganz vorstellen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

shakebox hat geschrieben:hm, gute Frage. Aber dazu muesste ich ja z.B. den Storage des Playbackrechners z.B. schon mal im Netzwerk freigeben und auf allen Renderrechnern mounten. Allein das klingt fuer mich schon nach vorprogrammiertem Aerger :)
Ich dachte es ehr so, das nicht die Renderrechner direkt auf beiden speichern, sondern das irgendwo (dort wo auch deine Skripte laufen) die Dateien direkt dupliziert. Also nicht warten bis eine Sequenz fertig ist und dann kopieren, sondern einfach jeden Frame, sobald es da ist, transferieren, wenn der Playbackrechner online ist.
Dabei könntest du doch auch noch zusätzlich die versteckte .play Datei berücksichtigen.
shakebox hat geschrieben:PS: was machst Du denn genau?
Ich mache viel mit 3dsmax, AfterEffects und Co.: http://www.htfx.de

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

shakebox hat geschrieben:Nur zum Verstaendnis: gamin oder inotify wuerde also nicht auf dem "Server" (gibt es ja bei SAN eben nicht) laufen sondern auf dem Client (erstmal unabhaengig von der Frage des OS)? Kann mir die Funktionsweise da noch nicht ganz vorstellen.
Das läuft dort wo die HDD eingebunden wird. Es sieht ja so aus: das OS weiß wann sich etwas ändert, da es ja selbst auf die Platte schreibt. Diese Änderung wird dann an inotify weitergeleitet, welches die nachricht an alle Programme weiterleitet, die entsprechende Watches registriert haben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten