# Sistema de arquivos estruturado em log

Um sistema de arquivos estruturado em log é um sistema de arquivos no qual dados e metadados são gravados sequencialmente em um buffer circular, chamado log. O projeto foi proposto pela primeira vez em 1988 por John K. Ousterhout e Fred Douglis e implementado pela primeira vez em 1992 por Ousterhout e Mendel Rosenblum para o sistema operacional distribuído do tipo Unix Sprite.

## Justificativa

Os sistemas de arquivos convencionais tendem a dispor os arquivos com grande cuidado com a localização espacial e fazer alterações locais em suas estruturas de dados para ter um bom desempenho em discos ópticos e magnéticos, que tendem a buscar de forma relativamente lenta.
O design de sistemas de arquivos estruturados em log baseia-se na hipótese de que isso não será mais efetivo porque os tamanhos de memória cada vez maiores nos computadores modernos levariam a E/S a ficar saturada com a gravação, porque as leituras quase sempre seriam satisfeitas pelo cache de memória. Um sistema de arquivos estruturado em log, portanto, trata seu armazenamento como um log circular e grava sequencialmente no cabeçalho do log.
Isso tem vários efeitos colaterais importantes:
* A taxa de transferência de gravação em discos óticos e magnéticos é melhorada porque eles podem ser agrupados em grandes sequências e as buscas dispendiosas são reduzidas ao mínimo.
* As gravações criam várias versões em avanço cronológico de dados e metadados de arquivos. Algumas implementações tornam essas versões de arquivos antigas classificáveis e acessíveis, um recurso às vezes chamado de viagem no tempo ou instantâneo. Isso é muito semelhante a um sistema de arquivos com suporte ao versionamento.
* A recuperação em caso de falhas é mais simples. Em sua próxima montagem, o sistema de arquivos não precisa percorrer todas as estruturas de dados para corrigir inconsistências, mas pode reconstruir seu estado a partir do último ponto consistente no log.
Os sistemas de arquivos estruturados em log, no entanto, devem recuperar o espaço livre ao retornar ao começo do log para evitar que o sistema de arquivos fique cheio quando o final do log for atingido. O espaço pode ser liberado pelo começo do log ao apagar arquivos para os quais existem versões mais recentes mais à frente no log. Se não houver versões mais recentes, os dados serão movidos e anexados ao final do log.
Para reduzir a sobrecarga incorrida por essa coleta de lixo, a maioria das implementações evita logs puramente circulares e divide seu armazenamento em segmentos. O final do log simplesmente avança em segmentos não adjacentes que já estão livres. Se for necessário espaço, os segmentos menos cheios são recuperados primeiro. Isso diminui a carga de E/S do coletor de lixo, mas isto se torna cada vez mais ineficaz à medida que o sistema de arquivos é preenchido e se aproxima da capacidade máxima.

## Desvantagens

A justificativa de design para sistemas de arquivos estruturados em log pressupõe que a maioria das leituras será otimizada, aumentando sempre os caches de memória. Essa suposição nem sempre é válida:
* Em mídias magnéticas - onde as buscas são relativamente caras - a estrutura de logs pode na verdade tornar as leituras muito mais lentas, uma vez que fragmenta arquivos que os sistemas de arquivos convencionais normalmente mantêm contíguos com gravações no mesmo local.
* Na memória flash - em que os tempos de busca geralmente são insignificantes - a estrutura de log pode não conferir um ganho de desempenho que valha a pena, pois a fragmentação da gravação tem muito menos impacto sobre o rendimento da gravação. Outro problema é empilhar o log em cima de outro log, o que não é uma boa ideia, pois força várias exclusões com acesso desalinhado. No entanto, muitos dispositivos baseados em flash não podem reescrever parte de um bloco, e devem primeiro executar um ciclo (lento) de apagamento de cada bloco antes de poder reescrever, portanto, colocar todas as gravações em um bloco pode ajudar a aumentar o desempenho das gravações espalhadas em vários blocos, cada uma das quais deve ser copiada em um buffer, apagada e gravada de volta, o que é uma clara vantagem para a chamada memória flash "bruta", em que a camada de tradução da flash é ignorada.