Ho recentemente risolto un problema con FreeBSD, SQLite3 e un file-system montato via NFS.
Veniamo ai dettagli: FreeBSD 9.2-RELEASE (“xray“) monta un file-system condiviso via NFS da un server Linux (“zulu“), già condiviso con altre macchine, e con cui non si presentano problemi particolari.
Il comportamento particolare di FreeBSD si manifesta quando tento di aprire un database SQLite3 direttamente sul file-system condiviso:
xray # mount -t nfs -o udp, nfsv3 zulu:/exportnfs /nfs
xray /nfs % sqlite3 test.sqlite3
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .schema
Error: disk I/O error
Dopo varie prove, e constatando che il problema si verifica solo con FreeBSD, mi imbatto nell’interessante articolo sullo strato più basso di SQLite, quello a contatto con il sistema operativo, ovvero il VFS.
Scopro che, passando l’opzione -vfs unix-dotfiles
riesco ad evitare il problema di I/O error
.
Capisco quindi che il problema è tra le opzioni di locking del client NFS di FreeBSD. Soluzione? Leggo il man di mount_nfs
e trovo l’opzione nolockd
. Faccio un remount ed il problema è risolto!