Thread Source Code verwalten
(30 answers)
Opened by tophoven at 2009-07-15 09:40 2009-07-22T21:49:31 sid burn Naja, ich gehe halt aus purer Paranoia immer erstmal davon aus, dass ich auch Daten verwalten will, die ich nicht öffentlich zugänglich machen will, bei denen ich also selbst für sämtliche Sicherheitskopien und deren Isolation von der Außenwelt sorgen muss. Ferner gehe ich davon aus, dass ein Gegner mit nahezu unbegrenzten Resourcen existiert, der ohne Rücksicht auf Kollateralschäden meine Daten klauen oder kaputt machen will. Vor diesem Hintergrund will ich dann immer noch ein bischen Sicherheit haben, auch wenn ich mir bewusst bin, dass das kaum noch möglich ist, da ich nur begrenzt Zugriffskontrollen einbauen kann, die mich selbst daran hindern, an meine Daten zu kommen, sollte ich unter Fremdeinfluss stehen ;-) Quote Ok, wenn es da ein gutes Werkzeug für Git gäbe, wäre das ein Argument. Quote Das ist natürlich blöder Code, ich dachte eher an so etwas: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 my $config = new Krasses::Config::Objekt(); { open my $in, '<', 'config.ini' or die ...; $config->load($in) or die ...; } $config->...; # modifiziere Konfiguration { my $out = new File::Temp(TEMPLATE => 'config.ini.XXXXXXXX') or die ...; $config->dump($out) or die ...; $out->flush() or die ...; $out->sync() or die ...; rename $out, 'config.ini' or die ...; # <-- Datei atomar ersetzen } Wenn letzterer Code mit ext4 immer noch derart funktioniert, dass anderer Code der nebeläufig ausgeführt wird, entweder komplett die alte oder komplett die neue Konfiguration sieht, und dass anderer Code, der später ausgeführt wird, komplett die neue Konfiguration sieht, dann sehe ich da auch keinen Bug. Mir hat jemand erzählt, bei ext4 reiche fsync plus rename nicht mehr aus, damit andere Prozesse danach auch wirklich die synchronisierten Daten sehen, weil das rename aufgrund der Delays beim Schreiben von Metainformationen dann auch nicht mehr atomar sei, und man könne das nur verhindern, indem man hinterher den Kernel anweise sämtliche I/O-Puffer zu flushen, was zum einen nicht portabel möglich ist und zum anderen Rootrechte erfordert. Ich habe diese Information allerdings nicht selbst überprüft, sondern mich nur ein wenig gewundert. Quote Hmm, ich bin halt eher Datenbanken in der Größenordnung von 10^12 Bytes und Repositories im Bereich 10^7 Bytes gewöhnt. Dann kommt aber hinzu, dass ein Versionskontrollsystem die meiste Zeit nur mit den Metainformationen herumrechnen muss, die nur einen Bruchteil des ganzen Repositorys ausmachen, während es die eigentlichen Nutzdaten nur gelegentlich und meistens unverändert durch die Gegend schieben muss. Quote Gar nicht, aber ein Versionskontrollsystem tut so etwas auch selten bis gar nicht. Und eine riesige komprimierte Datei, die man erst stückweise dekomprimieren und von der man dann noch Teile ausblenden muss, ist auch nicht gerade ideal nach einem String zu durchsuchen. Quote Sobald ich mir darüber im klaren bin, wie ich das wirklich haben will, schreibe ich selber ein ordentliches Versionskontrollsystem ;-) Auf jeden Fall hätte ich gerne etwas, was mit ganz wenigen Operationen auskommt. Am besten präsentiert sich ein Branch einfach als Dateisystem / Verzeichnis und versioniert sich automatisch, während ich darin arbeite, das aber so intelligent, dass nicht jedes Speichern zwischendurch um etwas auszutesten, permanent in der Versionsgeschichte abgelagert wird -- ich weiß nur noch nicht, wie man das am intelligentesten anstellt. Vielleicht, indem man verschachtelte Transaktionen zulässt und damit mehrere Änderungen bündeln kann. Oder noch besser, indem man die Konzepte Branch und Transaktion / Commit in einer neuen Abstraktion vereinigt, die Fähigkeit zur beliebigen Verschachtelung hinzufügt und dann eine hübsche Schnittstelle dafür entwickelt... When C++ is your hammer, every problem looks like your thumb.
|