* `nix-store --verify': repair bad referer mappings.

This commit is contained in:
Eelco Dolstra 2005-03-25 14:21:49 +00:00
parent c6178f0b03
commit 7eaf038763

View file

@ -774,7 +774,7 @@ void verifyStore(bool checkContents)
if (usablePaths.find(*i) == usablePaths.end()) {
printMsg(lvlError, format("found references entry for unusable path `%1%'")
% *i);
nixDB.delPair(txn, dbReferences, *i);
setReferences(txn, *i, PathSet());
}
else {
bool isValid = validPaths.find(*i) != validPaths.end();
@ -808,18 +808,28 @@ void verifyStore(bool checkContents)
nixDB.delPair(txn, dbReferers, *i);
}
else {
PathSet referers;
PathSet referers, newReferers;
queryReferers(txn, *i, referers);
for (PathSet::iterator j = referers.begin();
j != referers.end(); ++j)
{
Paths references;
nixDB.queryStrings(txn, dbReferences, *j, references);
if (find(references.begin(), references.end(), *i) == references.end()) {
printMsg(lvlError, format("missing reference mapping from `%1%' to `%2%'")
% *j % *i);
if (usablePaths.find(*j) == usablePaths.end()) {
printMsg(lvlError, format("referer mapping from `%1%' to unusable `%2%'")
% *i % *j);
} else {
nixDB.queryStrings(txn, dbReferences, *j, references);
if (find(references.begin(), references.end(), *i) == references.end()) {
printMsg(lvlError, format("missing reference mapping from `%1%' to `%2%'")
% *j % *i);
/* !!! repair by inserting *i into references */
}
else newReferers.insert(*j);
}
}
if (referers != newReferers)
nixDB.setStrings(txn, dbReferers, *i,
Paths(newReferers.begin(), newReferers.end()));
}
}