From 3f3a3ae87b3d72d52842d9a2ffe7010f5b0066b9 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 21 Jun 2004 09:35:50 +0000 Subject: [PATCH] * Acquire a lock on the output path when running a substitute. Also delete obstructing invalid paths. --- src/libstore/normalise.cc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/libstore/normalise.cc b/src/libstore/normalise.cc index bf096bde7f..937dbc7f9b 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(); }