Merge branch 'read-only-local-store' into overlayfs-store

This commit is contained in:
Ben Radford 2023-06-15 13:37:57 +01:00
commit 04d8f202a7
No known key found for this signature in database
GPG key ID: 9DF5D4640AB888D5
4 changed files with 22 additions and 17 deletions

View file

@ -363,7 +363,7 @@ LocalStore::LocalStore(const Params & params)
if (!readOnly) { if (!readOnly) {
migrateCASchema(state->db, dbDir + "/ca-schema", globalLock); migrateCASchema(state->db, dbDir + "/ca-schema", globalLock);
} else { } else {
throw Error("need to migrate to CA schema, but this cannot be done in read-only mode"); throw Error("need to migrate to content-addressed schema, but this cannot be done in read-only mode");
} }
} }
@ -502,7 +502,7 @@ int LocalStore::getSchema()
void LocalStore::openDB(State & state, bool create) void LocalStore::openDB(State & state, bool create)
{ {
if (create && readOnly) { if (create && readOnly) {
throw Error("unable to create database while in read-only mode"); throw Error("cannot create database while in read-only mode");
} }
if (access(dbDir.c_str(), R_OK | (readOnly ? 0 : W_OK))) if (access(dbDir.c_str(), R_OK | (readOnly ? 0 : W_OK)))

View file

@ -50,16 +50,16 @@ struct LocalStoreConfig : virtual LocalFSStoreConfig
false, false,
"read-only", "read-only",
R"( R"(
Allow this store to be opened when its database is on a read-only filesystem. Allow this store to be opened when its [database](@docroot@/glossary.md#gloss-nix-database) is on a read-only filesystem.
Normally Nix will attempt to open the store database in read-write mode, even Normally Nix will attempt to open the store database in read-write mode, even for querying (when write access is not needed).
for querying (when write access is not needed). This causes it to fail if the This causes it to fail if the database is on a read-only filesystem.
database is on a read-only filesystem.
Enable read-only mode to disable locking and open the SQLite database with the Enable read-only mode to disable locking and open the SQLite database with the [`immutable` parameter](https://www.sqlite.org/c3ref/open.html) set.
**immutable** parameter set. Do not use this unless the filesystem is read-only.
Using it when the filesystem is writable can cause incorrect query results or **Warning**
corruption errors if the database is changed by another process. Do not use this unless the filesystem is read-only.
Using it when the filesystem is writable can cause incorrect query results or corruption errors if the database is changed by another process.
)"}; )"};
const std::string name() override { return "Local Store"; } const std::string name() override { return "Local Store"; }
@ -292,6 +292,10 @@ public:
private: private:
/**
* Retrieve the current version of the database schema.
* If the database does not exist yet, the version returned will be 0.
*/
int getSchema(); int getSchema();
void openDB(State & state, bool create); void openDB(State & state, bool create);

View file

@ -227,14 +227,13 @@ constexpr std::array<ExperimentalFeatureDetails, 15> xpFeatureDetails = {{
.description = R"( .description = R"(
Allow the use of the `read-only` parameter in local store URIs. Allow the use of the `read-only` parameter in local store URIs.
Set this parameter to `true` to allow stores with databases on read-only Set this parameter to `true` to allow stores with databases on read-only filesystems to be opened for querying; ordinarily Nix will refuse to do this.
filesystems to be opened for querying; ordinarily Nix will refuse to do this.
Enabling this setting disables the locking required for safe concurrent This is because SQLite requires write access to the database file to perform the file locking operations necessary for safe concurrent access.
access, so you should be certain that the database will not be changed. When `read-only` is set to `true`, the database will be opened in immutable mode.
While the filesystem the database resides on might be read-only to this
process, consider whether another user, process, or system, might have Under this mode, SQLite will not do any locking at all, so you should be certain that the database will not be changed.
write access to it. While the filesystem the database resides on might be read-only to this process, consider whether another user, process, or system, might have write access to it.
)", )",
}, },
}}; }};

View file

@ -2,6 +2,8 @@ source common.sh
enableFeatures "read-only-local-store" enableFeatures "read-only-local-store"
needLocalStore "cannot open store read-only when daemon has already opened it writeable"
clearStore clearStore
happy () { happy () {