Você pode ler um mtime atualizado, mas ao ler o conteúdo ele ainda precisa ser atualizado?

3

Assumindo que touch etc. não esteja envolvido, apenas% padrãoopen, write , close , link chamadas do sistema.

Um processo está atualizando arquivos, outro é periodicamente stat ing para ver se eles mudaram e recarregar o conteúdo. Se é possível que o segundo processo termine com uma visão incorreta de um arquivo, se ele foi recarregado antes do primeiro ter concluído a gravação?

Olhando principalmente para os sistemas de arquivos ext4 do Linux, mas informações para outros podem ser úteis se diferirem.

    
por OrangeDog 10.03.2017 / 12:49

2 respostas

3

POSIX requer que read-after-write () sempre retorne os dados corretos, de acordo com o link :

After a write() to a regular file has successfully returned:

  • Any successful read() from each byte position in the file that was modified by that write will return the data specified by the write() for that position until such byte positions are again modified.

O arquivo mtime não é atualizado até o final da gravação no Linux, então não deve ser possível ver um mtime atualizado sem ver os dados que causaram esse atualização do mtime.

Upon successful completion, where nbyte is greater than 0, write() will mark for update the st_ctime and st_mtime fields of the file

O Ext4 tenta garantir a conformidade com POSIX, portanto, você deve estar seguro neste caso, mas nem todo sistema de arquivos é totalmente compatível com POSIX, portanto, YMMV.

    
por 18.04.2018 / 00:27
1

Depende de qual granularidade você deseja. As chamadas write() únicas devem ser atômicas (*). Mas se o aplicativo fizer várias chamadas de gravação como parte de uma única operação lógica, o outro processo poderá ser ativado no meio para ler apenas parte dele.

*) A chamada do sistema pode retornar depois de escrever apenas uma parte dos dados, isso será indicado no valor de retorno. Mas eu não sei se isso pode acontecer em arquivos locais no Linux.

Considere esta sequência:

--task 1--                  --task 2--
write()                     ..  
..                          stat()
..                          read()
write()                        

Se as duas gravações à esquerda fizerem parte de uma única modificação lógica, a tarefa 2 apenas lerá apenas parte dessa modificação.

    
por 10.03.2017 / 14:00