aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libstore/normalise.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/libstore/normalise.cc b/src/libstore/normalise.cc
index bf096bde7..937dbc7f9 100644
--- a/src/libstore/normalise.cc
+++ b/src/libstore/normalise.cc
@@ -1207,6 +1207,9 @@ private:
/* The process ID of the builder. */
pid_t pid;
+ /* Lock on the store path. */
+ PathLocks outputLock;
+
typedef void (SubstitutionGoal::*GoalState)();
GoalState state;
@@ -1316,6 +1319,23 @@ void SubstitutionGoal::exprRealised()
logPipe.create();
+ /* Acquire a lock on the output path. */
+ PathSet lockPath;
+ lockPath.insert(storePath);
+ outputLock.lockPaths(lockPath);
+
+ /* Check again whether the path is invalid. */
+ if (isValidPath(storePath)) {
+ debug(format("store path `%1%' has become valid") % storePath);
+ outputLock.setDeletion(true);
+ amDone();
+ return;
+ }
+
+ /* Remove the (stale) output path if it exists. */
+ if (pathExists(storePath))
+ deletePath(storePath);
+
/* Fork the substitute program. */
switch (pid = fork()) {
@@ -1425,6 +1445,8 @@ void SubstitutionGoal::finished()
registerValidPath(txn, storePath);
txn.commit();
+ outputLock.setDeletion(true);
+
amDone();
}