A.3. Fsync
Fsync
è conosciuto come operazione I/O molto esigente, ma ciò non è assolutamente vero. Per esempio, consultate l'articolo scritto da Theodore Ts'o Don't fear the fsync! [5] insieme alla discussione relativa.
Firefox chiamava la libreria sqlite ogni qualvolta l'utente selezionava un link per andare su di una nuova pagina. Sqlite chiamava
fsync
e a causa delle impostazioni del file system (principalmente ext3 con modalità data-ordered), era presente un latenza lunga quando non accadeva nulla. Tale periodo poteva essere molto lungo (fino a 30 secondi) se un altro processo copiava contemporaneamente un file molto grande.
Tuttavia in altri casi dove
fsync
non era usato si potevano verificare alcuni problemi smistandosi sul file system ext4. Ext3 era stato impostato in modalità data-ordered, la quale ripuliva la memoria ogni pochi secondi salvandola sul disco, Con ext4 e laptop_mode, l'intervallo tra i processi di archiviazione era più lungo con una potenziale perdita dei dati se il sistema veniva improvvisamente arrestato. Ora ext4 è stato aggiornato, ma anche in questo caso sarà necessario considerare con attenzione il design delle applicazioni ed usare fsync
in modo appropriato.
Il seguente esempio di lettura e scrittura in un file di configurazione mostra com'è possibile eseguire un backup di un file o perdere i dati:
/* open and read configuration file e.g. ~/.kde/myconfig */ fd = open("./kde/myconfig", O_WRONLY|O_TRUNC|O_CREAT); read(myconfig); ... write(fd, bufferOfNewData, sizeof(bufferOfNewData)); close(fd);
Un approccio migliore potrebbe essere:
open("/.kde/myconfig", O_WRONLY|O_TRUNC|O_CREAT); read(myconfig); ... fd = open("/.kde/myconfig.suffix", O_WRONLY|O_TRUNC|O_CREAT); write(fd, bufferOfNewData, sizeof(bufferOfNewData)); fsync; /* paranoia - optional */ ... close(fd); rename("/.kde/myconfig", "/.kde/myconfig~"); /* paranoia - optional */ rename("/.kde/myconfig.suffix", "/.kde/myconfig");