Bad file format reading the append only file – Correggere l'errore in un container Redis

Ieri mattina il server che ospita l'istanza Bookwyrm di Livello Segreto non si è sentito molto bene: il disco principale ha terminato lo spazio libero e i container che fanno girare i servizi si sono fermati improvvisamente (non li biasimo, avrei fatto lo stesso).

Tralasciando le azioni migliorative da apportare al server stesso (e l’allestimento di un sistema di monitoraggio che mi devo studiare per bene) mi sono ritrovato – anche a valle della pulizia del disco e l’aumento dello spazio disponibile – una buona parte dello stack di Bookwrym ancora in protesta (sito up and running, ma con un errore generico al posto del contenuto).

Dando un’occhiata ai log ho notato che entrambi i container di Redis non hanno apprezzato molto quanto avvenuto e non erano in grado di ripartire. L’errore a console era qualcosa di questo tipo:

Bad file format reading the append only file appendonly.aof.45.incr.aof: make a backup of your AOF file, then use ./redis-check-aof --fix <filename.manifest>

Redis è gentilissimo e fornisce anche la soluzione al problema, ma come trovo la posizione di quel file? E come posso lanciare il comando indicato per sistemare la situazione?

La soluzione è semplice, sì, ma bisogna ragionarci un attimo (e mentre si ragiona prima di mettere le mani si fa un bel backup/snapshot della situazione attuale).

Primo passo: dare un’occhiata al docker-compose.yml per capire dove Redis va a salvare i dati. Nel mio caso:

    volumes:
      - redis-data:/data

Benissimo, ora controllo se i miei file sono direttamente nella cartella /data o in qualche sottocartella. Per farlo lancio un comando (ls -lha /data) nel container di Redis usando docker-compose run (che permette l’esecuzione di un singolo comando in un container) e aggiungo l’opzione —rm per rimuovere il container al termine dell’esecuzione:

docker-compose run --rm redis ls -lha /data
Creating redis_run … done
total 64K
drwxr-xr-x 3 redis redis 4.0K Aug 1 10:09 .
drwxr-xr-x 1 root root 4.0K Aug 1 10:09 ..
drwx------ 2 redis redis 4.0K Jul 29 12:58 appendonlydir
-rw------- 1 redis redis 52K Aug 1 10:09 dump.rdb

Trovata! Il colpo d’occhio non aiuta, ma la cartella “appendonlydir” è esattamente ciò di cui avevo bisogno.

Non resta che usare la stessa logica del comando precedente, ma utilizzando questa volta le istruzioni fornite dall’errore di Redis stesso:

docker-compose run --rm redis redis-check-aof --fix /data/appendonlydir/appendonly.aof.45.incr.aof

Ecco fatto, basta dare a Redis il tempo di macinare (nel mio caso anche di lanciare il comando per entrambi i container presenti nello stack di Bookwyrm) e tutto torna a funzionare.

🕸️🕸️🕸️

Fonti e siti menzionati nel post: