Ho seguito la discussione sul "bug" su EXT4 che causa l'azzeramento dei file in caso di arresto anomalo se si utilizza il processo "crea file temp, scrive file temp, rinomina temp per file di destinazione". POSIX dice che a meno che non venga chiamato fsync(), non si può essere sicuri che i dati siano stati scaricati su harddisk.Modo sicuro ed efficiente per modificare più file su sistemi POSIX?
ovviamente facendo:
0) get the file contents (read it or make it somehow)
1) open original file and truncate it
2) write new contents
3) close file
non è buono anche con fsync() come il computer può bloccarsi durante 2) o fsync() e si finisce con i file parzialmente scritta.
solito Si è pensato che questo è abbastanza sicuro:
0) get the file contents (read it or make it somehow)
1) open temp file
2) write contents to temp file
3) close temp file
4) rename temp file to original file
purtroppo non è così. Per rendere più sicuro su EXT4 si avrebbe bisogno di fare:
0) get the file contents (read it or make it somehow)
1) open temp file
2) write contents to temp file
3) fsync()
4) close temp file
5) rename temp file to original file
questo sarebbe al sicuro e il crollo si dovrebbe neanche avere il nuovo contenuto di file o vecchi, contenuti mai azzerate o contenuti parziali. Ma se l'applicazione utilizza molti file, fsync() dopo ogni scrittura sarebbe lento.
Quindi la mia domanda è, come modificare più file in modo efficiente su un sistema in cui è necessario fsync() per essere sicuri che le modifiche siano state salvate sul disco? E intendo davvero modificare molti file, come in migliaia di file. Modificare due file e fare fsync() dopo ciascuno non sarebbe male, ma fsync() rallenta quando si modificano più file.
MODIFICA: ha modificato il file temporaneo fsync() chiuso in ordine corretto, ha aggiunto l'enfasi sulla scrittura di molti molti file.
Con il metodo rename è possibile scrivere 100.000 file di configurazione senza un fsync(), e fare 100.000 fsync() sarebbe lento. – Raynet
"si desidera che i dati scritti sul disco dalla chiusura() comunque" Di cosa stai parlando? Close dovrebbe solo deallocare la descrizione del file in base a POSIX. Non è necessario svuotare i buffer. http://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html – ArekBulski