diff --git a/bootstrap.sh b/bootstrap.sh index f007c713bf..2547f5dc88 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,4 +1,5 @@ #! /bin/sh -e +rm -f aclocal.m4 mkdir -p config libtoolize --copy aclocal diff --git a/configure.ac b/configure.ac index 662a65c822..acf5ac7ce3 100644 --- a/configure.ac +++ b/configure.ac @@ -236,7 +236,7 @@ AC_ARG_WITH(sqlite, AC_HELP_STRING([--with-sqlite=PATH], [prefix of SQLite]), sqlite=$withval, sqlite=) AM_CONDITIONAL(HAVE_SQLITE, test -n "$sqlite") -SQLITE_VERSION=3.6.23 +SQLITE_VERSION=3.7.0 AC_SUBST(SQLITE_VERSION) if test -z "$sqlite"; then sqlite_lib='${top_builddir}/externals/sqlite-$(SQLITE_VERSION)/libsqlite3.la' diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 6f3d9efa86..bddcbad12b 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -298,10 +298,20 @@ void LocalStore::openDB(bool create) if (sqlite3_exec(db, ("pragma synchronous = " + syncMode + ";").c_str(), 0, 0, 0) != SQLITE_OK) throw SQLiteError(db, "setting synchronous mode"); - /* Use `truncate' journal mode, which should be a bit faster. */ - if (sqlite3_exec(db, "pragma main.journal_mode = truncate;", 0, 0, 0) != SQLITE_OK) + /* Set the SQLite journal mode. The default is write-ahead + logging since it's the fastest and supports more concurrency. + The downside is that it doesn't work over NFS, so allow + truncate mode alternatively. */ + string mode = queryBoolSetting("use-sqlite-wal", true) ? "wal" : "truncate"; + if (sqlite3_exec(db, ("pragma main.journal_mode = " + mode + ";").c_str(), 0, 0, 0) != SQLITE_OK) throw SQLiteError(db, "setting journal mode"); + /* Increase the auto-checkpoint interval to 8192 pages. This + seems enough to ensure that instantiating the NixOS system + derivation is done in a single fsync(). */ + if (sqlite3_exec(db, "pragma wal_autocheckpoint = 8192;", 0, 0, 0) != SQLITE_OK) + throw SQLiteError(db, "setting autocheckpoint interval"); + /* Initialise the database schema, if necessary. */ if (create) { #include "schema.sql.hh"