A.3. Fsync
Fsync
é conhecido como uma operação de E/S cara, mas isto não é totalmente verdadeiro. Por exemplo, consulte o artigo Theodore Ts'o's Don't fear the fsync! [5] e a discussão que o acompanha.
O Firefox costumava a chamar a biblioteca dosqlite todas as vezes que o usuário clicava em um link para ir para uma nova página. O Sqlite chamado de
fsync
e por causa das configurações de sistema do arquivo (principalmente o ext3 com modo de dados ordenados), existia uma longa latência quando nada acontecia. Isto podia levar um longo tempo (até 30 segundos) se outro processo era copiado em um arquivo grande ao mesmo tempo.
No entanto, em outros casos, onde o
fsync
não era usado, os problemas cresciam com a mudança do sistema de arquivo ext4. O Ext3 era ajustado para modo de dados ordenados, o qual enviava a memória a cada poucos segundos e salvava-as em um disco. Mas com um ext4 e laptop_mode, o intervalo entre salvamentos era maior e dados podiam ser perdidos quando o sistema não esperava desligamentos. Agora o ext4 foi reparado, mas nós ainda consideramos o design de nossos aplicativos com cuidado, e usamos o fsync
de acordo como o adequado.
O exemplo simples a seguir de leitura e gravação em um arquivo de configuração mostra como um backup de um arquivo pode ser realizado ou como dados podem ser perdidos:
/* 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);
Uma melhor solução seria:
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");