BTRFS – parent transid verify failed

Olá a todos,

Como é conhecido de quem lê o meu blog, faço uso de vários tipos de filesystems nos meus sistemas Linux.
Desde XFS a BTRFS, passando por Ext4 e ZFS, cada um brilha na sua utilização especifica.
Hoje venho falar de BTRFS que uso em máquinas que dão suporte a containers devido ao backend support de LXC a este filesystem e a capacidade de SSD caching a discos mecânicos.

Long story short, um dos meus servidores de LXC/containers, quando falhou a energia elétrica, não recebeu – ou escolheu não receber – a ordem de shutdown da UPS quando a energia em reserva chegou a níveis críticos.
O resultado do shutdown não ordenado, foi uma máquina onde um dos  volume de BTRFS não montava, com o erro de parent transid verify failed.

Este erro, ocorre quando temos uma transação de write ou delete presa no journaling do sistema operativo, e o disco (ou volume) onde está a tentar escrever não corresponde a topologia de dados que esperava.
A consequência? Não montar os filesystems e consequentemente não ter acesso aos dados lá incluídos.

No meu caso especifico, o erro era este:

parent transid verify failed on 3139939436512 wanted 162425 found 162256

Existem várias formas de resolver o tema, mas *todas* passam por ter backups válidos do filesystem ou volume em questão.

Nota: Caso não tenham backups válidos, existe forma de retirar do volume danificado os dados, através de opções de mount:

mount -t btrfs -o ro,rootflags=recovery,nospace_cache /dev/vglxc/lxc /mnt/tmp
mount -t btrfs -o ro,rootflags=recovery,nospace_cache,clear_cache /dev/vglxc/lxc /mnt/tmp
mount -t btrfs -o ro,recovery,nospace_cache,nospace_cache /dev/vglxc/lxc /mnt/tmp

Em seguida copiem os vossos dados para uma outra localização antes de proceder a reparação do volume de btrfs.

Atenção que o método acima pode falhar. Para estes casos, é tentar um btrfs restore:

btrfs restore /dev/vglxc/lxc /mnt/tmp

Nota:  Este método vai demorar, pelo que é aconselhado correr ele numa consola que esteja em TMUX ou Screen.

Finalmente iremos então recuperar o volume:

umount /dev/vglxc/lxc
btrfsck --repair /dev/vglxc/lxc

Sei de ocasiões em que mesmo assim, após o btrfsck, em que o volume teima em não montar.
Nestas alturas, e em ultimo recurso, pode-se efetuar os seguintes comandos:

btrfsck --init-extent-tree /dev/vglxc/lxc
btrfs-zero-log /dev/vglxc/lxc

É importante ter noção que a partir do momento em que corram os comandos imediatamente acima ficam com possíveis corrupções em ficheiros, pois as transações que estavam pendentes em journaling acabaram de ser purgadas, portanto é fundamental manter *sempre* backups dos vossos dados.

No meu caso, foram apenas ficheiros de logs dos containers que estavam a ser escritos no momento da falha energética que sofreram danos, pelo que não necessitei de nenhum restore.

Concluindo,

Embora não seja um ZFS, o BTRFS é um filesystem extremamente promissor e extremamente potente.
É contudo igualmente extremamente sensível a power’s down a bruta, ou descontrolados.

A reter desta historia? Tenham sempre os vossos backups em dia (coisa que faço religiosamente), e comprem uma UPS.
Se vou mudar para outro filesystem? Não. Mesmo com a Redhat a colocar este filesystem em deprecated – na minha opinião esta atitude tem motivação comercial e não de engenharia do produto.
Este apresenta muitas vantagens em relação aos outros para a utilidade que lhe dou.

Até a um próximo post!

Abraço!
Nuno