Hi,

A few weeks ago, I merged the no-bdb branch with the trunk. This branch changed the Nix store metadata storage from using Berkeley DB to using separate (plain text) files per store path. This means that Berkeley DB is no longer needed (except for converting old Nix stores). The new storage schema has a bunch of advantages:

- Berkeley DB environments don't work over NFS (because it uses mmap). The new approach uses only plain locks, so if your NFS server/client support locking (via lockd), then you can share a Nix store via NFS. These can even be different architectures (e.g. a i686-linux and powerpc-darwin machine could share a Nix store on an NFS server).

- Berkeley DB has the problem that if a process crashes, any other processes accessing the BDB environment will fail as well, and recovery is needed. Nix runs recovery automatically, but it's still a pain.

- In the build farm we got frequent BDB deadlock errors. Admittedly this is a problem in how Nix did transactions; you have to retry a transaction when a deadlock is detected, but we didn't do that.

- Berkeley DB environments aren't compatible between different architectures. So upgrading a NixOS installation from i686-linux to x86_64-linux was a problem.

- Users frequently had problems with Berkeley DB running out of locks or other resources (http://nixos.org/releases/nix/nix-0.11/manual/#id2521556). The new approach has no such limits.

- The new approach no longer needs read/write access to the database in order to do read-only queries (like nix-env -qas \*). So this to some extent obviates the need for the Nix daemon if you just want to allow unprivileged users to do queries (just like e.g. RPM allows any user to do rpm -qa).

Some notes on upgrading:

- The no-bdb Nix is now the default for NixOS. If you do an svn up / nixos-rebuild switch, your database will be upgraded automatically at some point. (Perhaps not by the switch, but when you next run a Nix command that accesses the store.) Once the upgrade has succeeded, you can't go back! [1] So you may wish to make a backup of /nix/var/nix/db ;-)

- After the upgrade, you can delete the old BDB files:

$ cd /nix/var/nix/db
$ rm __db* log.* derivers references referrers reserved validpaths DB_CONFIG

Note that the new metadata is stored in /nix/var/nix/db/info and /nix/var/nix/db/referrer. BTW, just because the files in those directories are human-readable doesn't mean that they're human-editable. Nix is pretty particular about the format.

- Nix by default still has a dependency on Berkeley DB in order to be able to upgrade. If you don't need this, you can build Nix with the --disable-old-db-compat configure flag.

- The new storage schema may or may not require less disk space than the BDB environment. It mostly depends on the cluster size of your file system. With 1 KB clusters (which seems to be the ext3 default nowadays) it usually takes up much less space.

[1] Actually, if you haven't deleted the old BDB files from /nix/var/nix/db, you can downgrade by doing "echo -n 4 > /nix/var/nix/db/schema".

--
Eelco Dolstra | http://www.st.ewi.tudelft.nl/~dolstra/
_______________________________________________
nix-dev mailing list
[email protected]
https://mail.cs.uu.nl/mailman/listinfo/nix-dev

Reply via email to