diff options
Diffstat (limited to 'src/libstore/local-store.cc')
-rw-r--r-- | src/libstore/local-store.cc | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index bffefbaa780e..4378f0ba6101 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -58,6 +58,7 @@ static TableId dbDerivers = 0; static void upgradeStore07(); static void upgradeStore09(); +static void upgradeStore11(); void checkStoreNotSymlink() @@ -131,6 +132,8 @@ LocalStore::LocalStore(bool reserveSpace) upgradeStore07(); if (curSchema == 2) upgradeStore09(); + if (curSchema == 3) + upgradeStore11(); writeFile(schemaFN, (format("%1%") % nixSchemaVersion).str()); } } @@ -1042,10 +1045,10 @@ static void upgradeStore09() { /* !!! we should disallow concurrent upgrades */ - printMsg(lvlError, "upgrading Nix store to new schema (this may take a while)..."); - if (!pathExists(nixDBPath + "/referers")) return; + printMsg(lvlError, "upgrading Nix store to new schema (this may take a while)..."); + Transaction txn(nixDB); std::cerr << "converting referers to referrers..."; @@ -1082,4 +1085,29 @@ static void upgradeStore09() } +/* Upgrade from schema 3 (Nix 0.10) to schema 4 (Nix >= 0.11). The + only thing to do here is to delete the substitutes table and get + rid of invalid but substitutable references/referrers. */ +static void upgradeStore11() +{ + if (!pathExists(nixDBPath + "/substitutes")) return; + + printMsg(lvlError, "upgrading Nix store to new schema (this may take a while)..."); + + Transaction txn(nixDB); + TableId dbSubstitutes = nixDB.openTable("substitutes"); + + Paths subKeys; + nixDB.enumTable(txn, dbSubstitutes, subKeys); + for (Paths::iterator i = subKeys.begin(); i != subKeys.end(); ++i) { + if (!isValidPathTxn(txn, *i)) + invalidatePath(txn, *i); + } + + txn.commit(); + nixDB.closeTable(dbSubstitutes); + nixDB.deleteTable("substitutes"); +} + + } |