Estou observando arquivos em busca de alterações usando eventos inotify (por acaso, do Python, chamando a libc).
Para alguns arquivos durante a git clone, vejo algo estranho: vejo um IN_CREATEevento e vejo lsque o arquivo tem conteúdo, no entanto, nunca vejo IN_MODIFYou IN_CLOSE_WRITE. Isso está me causando problemas, pois eu gostaria de responder IN_CLOSE_WRITEnos arquivos: especificamente, para iniciar um upload do conteúdo do arquivo.
Os arquivos que se comportam estranhamente estão no .git/objects/packdiretório e terminam em .packou .idx. Outros arquivos que o git cria têm uma cadeia IN_CREATE-> IN_MODIFY-> mais regular IN_CLOSE_WRITE(não estou observando IN_OPENeventos).
Isso está dentro da janela de encaixe no MacOS, mas vi evidências do mesmo na janela de encaixe no Linux em um sistema remoto, portanto, minha suspeita é que o aspecto do MacOS não é relevante. Estou vendo isso se estiver assistindo e git cloneestiver no mesmo contêiner de docker.
Minhas perguntas:
Por que esses eventos estão ausentes nesses arquivos?
O que pode ser feito sobre isso? Especificamente, como posso responder à conclusão das gravações nesses arquivos? Nota: idealmente, gostaria de responder quando a escrita estiver "finalizada" para evitar o upload desnecessário / (incorreto) de textos "inacabados".
Edit: Reading https://developer.ibm.com/tutorials/l-inotify/ parece que o que estou vendo é consistente com
- um arquivo temporário separado, com nome como
tmp_pack_hBV4Alz, sendo criado, modificado e fechado; - um duro link é criado para este arquivo, com a final
.packnome; - o
tmp_pack_hBV4Alznome original é excluído.
Eu acho que o meu problema, que é tentar usar o inotify como um gatilho para fazer upload de arquivos, reduz a perceber que o .packarquivo é um link físico para outro arquivo e o upload nesse caso?