summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2003-10-10 15:14:29 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2003-10-10 15:14:29 +0000
commit0abe185688aa19c9ca87c9d22e24a54b4b359969 (patch)
tree3333b11fc912c78d933e6a8ad8c897508aa1833c
parentd3d5e77810cca11cca95bbb6f0f5e15d23f31eea (diff)
downloadguix-0abe185688aa19c9ca87c9d22e24a54b4b359969.tar.gz
* `nix --verify': check and repair reverse mapping for successors.
-rw-r--r--src/store.cc120
-rw-r--r--src/store.hh2
2 files changed, 33 insertions, 89 deletions
diff --git a/src/store.cc b/src/store.cc
index de1dcca708..6953207131 100644
--- a/src/store.cc
+++ b/src/store.cc
@@ -82,25 +82,25 @@ void copyPath(const Path & src, const Path & dst)
 
 
 void registerSuccessor(const Transaction & txn,
-    const Path & path1, const Path & path2)
+    const Path & srcPath, const Path & sucPath)
 {
     Path known;
-    if (nixDB.queryString(txn, dbSuccessors, path1, known) &&
-        known != path2)
+    if (nixDB.queryString(txn, dbSuccessors, srcPath, known) &&
+        known != sucPath)
     {
         throw Error(format(
             "the `impossible' happened: expression in path "
             "`%1%' appears to have multiple successors "
             "(known `%2%', new `%3%'")
-            % path1 % known % path2);
+            % srcPath % known % sucPath);
     }
 
     Paths revs;
-    nixDB.queryStrings(txn, dbSuccessorsRev, path2, revs);
-    revs.push_back(path1);
+    nixDB.queryStrings(txn, dbSuccessorsRev, sucPath, revs);
+    revs.push_back(srcPath);
 
-    nixDB.setString(txn, dbSuccessors, path1, path2);
-    nixDB.setStrings(txn, dbSuccessorsRev, path2, revs);
+    nixDB.setString(txn, dbSuccessors, srcPath, sucPath);
+    nixDB.setStrings(txn, dbSuccessorsRev, sucPath, revs);
 }
 
 
@@ -213,74 +213,22 @@ void verifyStore()
 {
     Transaction txn(nixDB);
 
-    /* !!! verify that the result is consistent */
-
-#if 0
-    Strings paths;
-    nixDB.enumTable(txn, dbPath2Id, paths);
+    Paths paths;
+    nixDB.enumTable(txn, dbValidPaths, paths);
 
-    for (Strings::iterator i = paths.begin();
+    for (Paths::iterator i = paths.begin();
          i != paths.end(); i++)
     {
-        bool erase = true;
-        string path = *i;
-
+        Path path = *i;
         if (!pathExists(path)) {
             debug(format("path `%1%' disappeared") % path);
+            nixDB.delPair(txn, dbValidPaths, path);
+            nixDB.delPair(txn, dbSuccessorsRev, path);
+            nixDB.delPair(txn, dbSubstitutesRev, path);
         }
-
-        else {
-            string id;
-            if (!nixDB.queryString(txn, dbPath2Id, path, id)) abort();
-
-            Strings idPaths;
-            nixDB.queryStrings(txn, dbId2Paths, id, idPaths);
-
-            bool found = false;
-            for (Strings::iterator j = idPaths.begin();     
-                 j != idPaths.end(); j++)
-                if (path == *j) {
-                    found = true;
-                    break;
-                }
-
-            if (found)
-                erase = false;
-            else
-                /* !!! perhaps we should add path to idPaths? */
-                debug(format("reverse mapping for path `%1%' missing") % path);
-        }
-
-        if (erase) nixDB.delPair(txn, dbPath2Id, path);
     }
 
-    Strings ids;
-    nixDB.enumTable(txn, dbId2Paths, ids);
-
-    for (Strings::iterator i = ids.begin();
-         i != ids.end(); i++)
-    {
-        FSId id = parseHash(*i);
-
-        Strings idPaths;
-        nixDB.queryStrings(txn, dbId2Paths, id, idPaths);
-
-        for (Strings::iterator j = idPaths.begin();     
-             j != idPaths.end(); )
-        {
-            string id2;
-            if (!nixDB.queryString(txn, dbPath2Id, *j, id2) || 
-                id != parseHash(id2)) {
-                debug(format("erasing path `%1%' from mapping for id %2%") 
-                    % *j % (string) id);
-                j = idPaths.erase(j);
-            } else j++;
-        }
-
-        nixDB.setStrings(txn, dbId2Paths, id, idPaths);
-    }
-
-    
+#if 0    
     Strings subs;
     nixDB.enumTable(txn, dbSubstitutes, subs);
 
@@ -308,31 +256,27 @@ void verifyStore()
 
         nixDB.setStrings(txn, dbSubstitutes, srcId, subIds);
     }
+#endif
 
-    Strings sucs;
+    Paths sucs;
     nixDB.enumTable(txn, dbSuccessors, sucs);
 
-    for (Strings::iterator i = sucs.begin();
-         i != sucs.end(); i++)
-    {
-        FSId id1 = parseHash(*i);
-
-        string id2;
-        if (!nixDB.queryString(txn, dbSuccessors, id1, id2)) abort();
-        
-        Strings id2Paths;
-        nixDB.queryStrings(txn, dbId2Paths, id2, id2Paths);
-        if (id2Paths.size() == 0) {
-            Strings id2Subs;
-            nixDB.queryStrings(txn, dbSubstitutes, id2, id2Subs);
-            if (id2Subs.size() == 0) {
-                debug(format("successor %1% for %2% missing") 
-                    % id2 % (string) id1);
-                nixDB.delPair(txn, dbSuccessors, (string) id1);
-            }
+    for (Paths::iterator i = sucs.begin(); i != sucs.end(); i++) {
+        Path srcPath = *i;
+
+        Path sucPath;
+        if (!nixDB.queryString(txn, dbSuccessors, srcPath, sucPath)) abort();
+
+        Paths revs;
+        nixDB.queryStrings(txn, dbSuccessorsRev, sucPath, revs);
+
+        if (find(revs.begin(), revs.end(), srcPath) == revs.end()) {
+            debug(format("reverse successor mapping from `%1%' to `%2%' missing")
+                  % srcPath % sucPath);
+            revs.push_back(srcPath);
+            nixDB.setStrings(txn, dbSuccessorsRev, sucPath, revs);
         }
     }
-#endif
 
     txn.commit();
 }
diff --git a/src/store.hh b/src/store.hh
index 7b32a1a731..abf8745431 100644
--- a/src/store.hh
+++ b/src/store.hh
@@ -20,7 +20,7 @@ void copyPath(const Path & src, const Path & dst);
    we do it in reverse order, we can get an obstructed build (since to
    rebuild the successor, the outputs paths must not exist). */
 void registerSuccessor(const Transaction & txn,
-    const Path & path1, const Path & path2);
+    const Path & srcPath, const Path & sucPath);
 
 /* Register a substitute. */
 void registerSubstitute(const Path & srcPath, const Path & subPath);