diff --git a/src/normalise.cc b/src/normalise.cc index 074eda2960..3f138a53ea 100644 --- a/src/normalise.cc +++ b/src/normalise.cc @@ -86,7 +86,7 @@ FSId normaliseFState(FSId id, FSIdSet pending) /* Obtain locks on all output paths. The locks are automatically released when we exit this function or Nix crashes. */ - PathLocks outputLock(pathsFromOutPaths(outPaths)); + PathLocks outputLocks(pathsFromOutPaths(outPaths)); /* Now check again whether there is a successor. This is because another process may have started building in parallel. After diff --git a/src/store.cc b/src/store.cc index 2411a737fa..8a3db12ba9 100644 --- a/src/store.cc +++ b/src/store.cc @@ -7,6 +7,7 @@ #include "globals.hh" #include "db.hh" #include "archive.hh" +#include "pathlocks.hh" #include "normalise.hh" @@ -211,10 +212,19 @@ string expandId(const FSId & id, const string & target, if (target.empty()) return path; else { + /* Acquire a lock on the target path. */ + Strings lockPaths; + lockPaths.push_back(target); + PathLocks outputLock(lockPaths); + + /* Copy. */ copyPath(path, target); + + /* Register the target path. */ Transaction txn(nixDB); registerPath(txn, target, id); txn.commit(); + return target; } } @@ -265,7 +275,12 @@ void addToStore(string srcPath, string & dstPath, FSId & id, } catch (...) { } + Strings lockPaths; + lockPaths.push_back(dstPath); + PathLocks outputLock(lockPaths); + copyPath(srcPath, dstPath); + Transaction txn(nixDB); registerPath(txn, dstPath, id); txn.commit();