# Journaling

Um sistema de arquivos com journaling (em português, diário) é aquele que rastreia as alterações ainda não confirmadas na parte principal do sistema de arquivos, registrando as intenções de tais alterações em uma estrutura de dados conhecida como Log de dados (diário), que geralmente é um log circular. No caso de uma falha do sistema ou falha de energia, esses sistemas de arquivos podem ser colocados online novamente mais rapidamente com uma probabilidade menor de serem corrompidos.
Dependendo da implementação real, um sistema de arquivos com journaling pode apenas controlar os metadados armazenados, resultando em melhor desempenho às custas de maior possibilidade de corrupção de dados. Alternativamente, um sistema de arquivos com journaling pode rastrear os dados armazenados e os metadados relacionados, enquanto algumas implementações permitem um comportamento selecionável a este respeito.
Exemplos de sistemas de arquivos que suportam journaling: Ext3, Ext4, JFS, JFFS, JFFS2, LogFS, NTFS, Reiser4, ReiserFS e XFS.

## História

Em 1990, o JFS, da IBM, foi um dos primeiros sistemas de arquivos comerciais UNIX rodando nos sistemas operacionais AIX que implementou o journaling. Depois, em 1993, a Microsoft implementou o journaling no sistema de arquivos NTFS e em 2001, foi implementado o journaling no ext3.

## Análise

A atualização de sistemas de arquivos para refletir mudanças em arquivos e diretórios geralmente requer muitas operações de escrita separadas. Isso possibilita que uma interrupção (como uma queda do fornecimento de energia ou um crash do sistema) entre as operações de escritas deixem as estruturas de dados em um estado intermediário inválido.
Por exemplo, a exclusão de um arquivo em um sistema de arquivos Unix envolve três etapas:
* Remoção da entrada do diretório;
* Liberação do inode para o pool de inodes disponíveis;
* Retorno de todos os blocos usados ​​para o pool de blocos disponíveis do disco.
Se ocorrer uma falha entre os passos 1 e 2, haverá um inode órfão e, portanto, um vazamento de armazenamento (storage leak em inglês). Por outro lado, se o crash ocorrer entre os passos 2 e 3, o arquivo ainda não excluído será marcado como disponível e possivelmente será substituído por outro dado.
Detectar e recuperar essas inconsistências normalmente requer uma completa checagem das suas estruturas de dados, por exemplo, por uma ferramenta como fsck (o verificador do sistema de arquivos). Isso geralmente deve ser feito antes que o sistema de arquivos seja novamente montado para acesso de leitura-escrita (read-write). Se o sistema de arquivos for grande e se houver relativamente pequena largura de banda de E/S, isso pode demorar muito tempo e resultar em tempos de parada mais longos se ele bloquear o resto do sistema de voltar à ativa.
Para evitar essa demora, um sistema de arquivo com journaling aloca uma área especial — o journal — no qual registra com antecedência as mudanças que fará. Após um acidente, a recuperação simplesmente envolve a leitura do journal do sistema de arquivos e a repetição das mudanças deste journal até o sistema de arquivos voltar a ser consistente. Essas mudanças são, portanto, atômicas (indivisíveis) na medida em que todas as mudanças são realizadas (repetidos completamente durante a recuperação), ou não são reproduzidos de forma alguma (são ignorados porque ainda não tinham completamente escrito no jornal antes da ocorrência do crash).