forked from lix-project/lix
* Path locking in addToStore() and expandPath().
This commit is contained in:
parent
c95b4ad290
commit
d2e963f7a3
|
@ -86,7 +86,7 @@ FSId normaliseFState(FSId id, FSIdSet pending)
|
||||||
|
|
||||||
/* Obtain locks on all output paths. The locks are automatically
|
/* Obtain locks on all output paths. The locks are automatically
|
||||||
released when we exit this function or Nix crashes. */
|
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
|
/* Now check again whether there is a successor. This is because
|
||||||
another process may have started building in parallel. After
|
another process may have started building in parallel. After
|
||||||
|
|
15
src/store.cc
15
src/store.cc
|
@ -7,6 +7,7 @@
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
#include "db.hh"
|
#include "db.hh"
|
||||||
#include "archive.hh"
|
#include "archive.hh"
|
||||||
|
#include "pathlocks.hh"
|
||||||
#include "normalise.hh"
|
#include "normalise.hh"
|
||||||
|
|
||||||
|
|
||||||
|
@ -211,10 +212,19 @@ string expandId(const FSId & id, const string & target,
|
||||||
if (target.empty())
|
if (target.empty())
|
||||||
return path;
|
return path;
|
||||||
else {
|
else {
|
||||||
|
/* Acquire a lock on the target path. */
|
||||||
|
Strings lockPaths;
|
||||||
|
lockPaths.push_back(target);
|
||||||
|
PathLocks outputLock(lockPaths);
|
||||||
|
|
||||||
|
/* Copy. */
|
||||||
copyPath(path, target);
|
copyPath(path, target);
|
||||||
|
|
||||||
|
/* Register the target path. */
|
||||||
Transaction txn(nixDB);
|
Transaction txn(nixDB);
|
||||||
registerPath(txn, target, id);
|
registerPath(txn, target, id);
|
||||||
txn.commit();
|
txn.commit();
|
||||||
|
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -265,7 +275,12 @@ void addToStore(string srcPath, string & dstPath, FSId & id,
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Strings lockPaths;
|
||||||
|
lockPaths.push_back(dstPath);
|
||||||
|
PathLocks outputLock(lockPaths);
|
||||||
|
|
||||||
copyPath(srcPath, dstPath);
|
copyPath(srcPath, dstPath);
|
||||||
|
|
||||||
Transaction txn(nixDB);
|
Transaction txn(nixDB);
|
||||||
registerPath(txn, dstPath, id);
|
registerPath(txn, dstPath, id);
|
||||||
txn.commit();
|
txn.commit();
|
||||||
|
|
Loading…
Reference in a new issue