about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2007-01-14T16·24+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2007-01-14T16·24+0000
commit8f67b3588603483402440538d7dc326451bbe60d (patch)
tree4c72877a8e2ea20379249eff1555d9eb6c7b600e /src
parent8659edc0981373a42f123cd7d84b9925be0123bc (diff)
* Make the garbage collector more resilient to certain consistency
  errors: in-use paths now cause a warning, not a fatal error.

Diffstat (limited to 'src')
-rw-r--r--src/libstore/gc.cc10
-rw-r--r--src/libstore/local-store.cc2
-rw-r--r--src/libstore/local-store.hh2
3 files changed, 10 insertions, 4 deletions
diff --git a/src/libstore/gc.cc b/src/libstore/gc.cc
index e867feeda8df..fa3b84b7afc9 100644
--- a/src/libstore/gc.cc
+++ b/src/libstore/gc.cc
@@ -599,9 +599,13 @@ void LocalStore::collectGarbage(GCAction action, const PathSet & pathsToDelete,
             printMsg(lvlInfo, format("deleting `%1%'") % *i);
             
             /* Okay, it's safe to delete. */
-            unsigned long long freed;
-            deleteFromStore(*i, freed);
-            bytesFreed += freed;
+            try {
+                unsigned long long freed;
+                deleteFromStore(*i, freed);
+                bytesFreed += freed;
+            } catch (PathInUse & e) {
+                printMsg(lvlError, format("warning: %1%") % e.msg());
+            }
 
 #ifndef __CYGWIN__
             if (fdLock != -1)
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index 1bed672d2c9a..b679ffb4fa7c 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -709,7 +709,7 @@ void deleteFromStore(const Path & _path, unsigned long long & bytesFreed)
         for (PathSet::iterator i = referrers.begin();
              i != referrers.end(); ++i)
             if (*i != path && isValidPathTxn(txn, *i))
-                throw Error(format("cannot delete path `%1%' because it is in use by path `%2%'") % path % *i);
+                throw PathInUse(format("cannot delete path `%1%' because it is in use by path `%2%'") % path % *i);
         invalidatePath(txn, path);
     }
     txn.commit();
diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh
index 8f4ed8fc82ba..83cb87d451a7 100644
--- a/src/libstore/local-store.hh
+++ b/src/libstore/local-store.hh
@@ -138,6 +138,8 @@ Path queryDeriver(const Transaction & txn, const Path & path);
 /* Delete a value from the nixStore directory. */
 void deleteFromStore(const Path & path, unsigned long long & bytesFreed);
 
+MakeError(PathInUse, Error);
+
 void verifyStore(bool checkContents);
 
 /* Whether we are in build users mode. */