forked from lix-project/lix
Release shared lock before acquiring exclusive lock
In principle, this should avoid deadlocks where two instances of Nix are holding a shared lock on big-lock and are both waiting to get an exclusive lock. However, it seems like `flock(2)` is supposed to do this automatically, so it's not clear whether this is actually where the problem comes from.
This commit is contained in:
parent
26c7602c39
commit
81c3f99b36
|
@ -91,6 +91,7 @@ void migrateCASchema(SQLite& db, Path schemaPath, AutoCloseFD& lockFd)
|
||||||
|
|
||||||
if (!lockFile(lockFd.get(), ltWrite, false)) {
|
if (!lockFile(lockFd.get(), ltWrite, false)) {
|
||||||
printInfo("waiting for exclusive access to the Nix store for ca drvs...");
|
printInfo("waiting for exclusive access to the Nix store for ca drvs...");
|
||||||
|
lockFile(lockFd.get(), ltNone, false); // We have acquired a shared lock; release it to prevent deadlocks
|
||||||
lockFile(lockFd.get(), ltWrite, true);
|
lockFile(lockFd.get(), ltWrite, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,6 +300,7 @@ LocalStore::LocalStore(const Params & params)
|
||||||
|
|
||||||
if (!lockFile(globalLock.get(), ltWrite, false)) {
|
if (!lockFile(globalLock.get(), ltWrite, false)) {
|
||||||
printInfo("waiting for exclusive access to the Nix store...");
|
printInfo("waiting for exclusive access to the Nix store...");
|
||||||
|
lockFile(globalLock.get(), ltNone, false); // We have acquired a shared lock; release it to prevent deadlocks
|
||||||
lockFile(globalLock.get(), ltWrite, true);
|
lockFile(globalLock.get(), ltWrite, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue