daemon: Remove unused schema upgrade code.
* nix/libstore/local-store.cc (LocalStore): Remove upgrade code. (LocalStore::queryValidPathsOld, LocalStore::queryPathInfoOld) (LocalStore::upgradeStore6, makeMutable) (LocalStore::upgardeStore7): Remove. * nix/libstore/local-store.hh: Adjust accordingly.
This commit is contained in:
parent
c7589cce8d
commit
602a148650
|
@ -171,27 +171,10 @@ LocalStore::LocalStore(bool reserveSpace)
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (curSchema < nixSchemaVersion) {
|
else if (curSchema < nixSchemaVersion) {
|
||||||
if (curSchema < 5)
|
/* Guix always used version 7 of the schema. */
|
||||||
throw Error(
|
throw Error(
|
||||||
"Your Nix store has a database in Berkeley DB format,\n"
|
format("Your store database uses an implausibly old schema, version %1%.")
|
||||||
"which is no longer supported. To convert to the new format,\n"
|
% curSchema);
|
||||||
"please upgrade Nix to version 0.12 first.");
|
|
||||||
|
|
||||||
if (!lockFile(globalLock, ltWrite, false)) {
|
|
||||||
printMsg(lvlError, "waiting for exclusive access to the Nix store...");
|
|
||||||
lockFile(globalLock, ltWrite, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the schema version again, because another process may
|
|
||||||
have performed the upgrade already. */
|
|
||||||
curSchema = getSchema();
|
|
||||||
|
|
||||||
if (curSchema < 6) upgradeStore6();
|
|
||||||
else if (curSchema < 7) { upgradeStore7(); openDB(true); }
|
|
||||||
|
|
||||||
writeFile(schemaPath, (format("%1%") % nixSchemaVersion).str());
|
|
||||||
|
|
||||||
lockFile(globalLock, ltRead, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else openDB(false);
|
else openDB(false);
|
||||||
|
@ -1633,140 +1616,6 @@ void LocalStore::markContentsGood(const Path & path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Functions for upgrading from the pre-SQLite database. */
|
|
||||||
|
|
||||||
PathSet LocalStore::queryValidPathsOld()
|
|
||||||
{
|
|
||||||
PathSet paths;
|
|
||||||
for (auto & i : readDirectory(settings.nixDBPath + "/info"))
|
|
||||||
if (i.name.at(0) != '.') paths.insert(settings.nixStore + "/" + i.name);
|
|
||||||
return paths;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ValidPathInfo LocalStore::queryPathInfoOld(const Path & path)
|
|
||||||
{
|
|
||||||
ValidPathInfo res;
|
|
||||||
res.path = path;
|
|
||||||
|
|
||||||
/* Read the info file. */
|
|
||||||
string baseName = baseNameOf(path);
|
|
||||||
Path infoFile = (format("%1%/info/%2%") % settings.nixDBPath % baseName).str();
|
|
||||||
if (!pathExists(infoFile))
|
|
||||||
throw Error(format("path `%1%' is not valid") % path);
|
|
||||||
string info = readFile(infoFile);
|
|
||||||
|
|
||||||
/* Parse it. */
|
|
||||||
Strings lines = tokenizeString<Strings>(info, "\n");
|
|
||||||
|
|
||||||
foreach (Strings::iterator, i, lines) {
|
|
||||||
string::size_type p = i->find(':');
|
|
||||||
if (p == string::npos)
|
|
||||||
throw Error(format("corrupt line in `%1%': %2%") % infoFile % *i);
|
|
||||||
string name(*i, 0, p);
|
|
||||||
string value(*i, p + 2);
|
|
||||||
if (name == "References") {
|
|
||||||
Strings refs = tokenizeString<Strings>(value, " ");
|
|
||||||
res.references = PathSet(refs.begin(), refs.end());
|
|
||||||
} else if (name == "Deriver") {
|
|
||||||
res.deriver = value;
|
|
||||||
} else if (name == "Hash") {
|
|
||||||
res.hash = parseHashField(path, value);
|
|
||||||
} else if (name == "Registered-At") {
|
|
||||||
int n = 0;
|
|
||||||
string2Int(value, n);
|
|
||||||
res.registrationTime = n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Upgrade from schema 5 (Nix 0.12) to schema 6 (Nix >= 0.15). */
|
|
||||||
void LocalStore::upgradeStore6()
|
|
||||||
{
|
|
||||||
printMsg(lvlError, "upgrading Nix store to new schema (this may take a while)...");
|
|
||||||
|
|
||||||
openDB(true);
|
|
||||||
|
|
||||||
PathSet validPaths = queryValidPathsOld();
|
|
||||||
|
|
||||||
SQLiteTxn txn(db);
|
|
||||||
|
|
||||||
foreach (PathSet::iterator, i, validPaths) {
|
|
||||||
addValidPath(queryPathInfoOld(*i), false);
|
|
||||||
std::cerr << ".";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cerr << "|";
|
|
||||||
|
|
||||||
foreach (PathSet::iterator, i, validPaths) {
|
|
||||||
ValidPathInfo info = queryPathInfoOld(*i);
|
|
||||||
unsigned long long referrer = queryValidPathId(*i);
|
|
||||||
foreach (PathSet::iterator, j, info.references)
|
|
||||||
addReference(referrer, queryValidPathId(*j));
|
|
||||||
std::cerr << ".";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cerr << "\n";
|
|
||||||
|
|
||||||
txn.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(FS_IOC_SETFLAGS) && defined(FS_IOC_GETFLAGS) && defined(FS_IMMUTABLE_FL)
|
|
||||||
|
|
||||||
static void makeMutable(const Path & path)
|
|
||||||
{
|
|
||||||
checkInterrupt();
|
|
||||||
|
|
||||||
struct stat st = lstat(path);
|
|
||||||
|
|
||||||
if (!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) return;
|
|
||||||
|
|
||||||
if (S_ISDIR(st.st_mode)) {
|
|
||||||
for (auto & i : readDirectory(path))
|
|
||||||
makeMutable(path + "/" + i.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The O_NOFOLLOW is important to prevent us from changing the
|
|
||||||
mutable bit on the target of a symlink (which would be a
|
|
||||||
security hole). */
|
|
||||||
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_NOFOLLOW);
|
|
||||||
if (fd == -1) {
|
|
||||||
if (errno == ELOOP) return; // it's a symlink
|
|
||||||
throw SysError(format("opening file `%1%'") % path);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int flags = 0, old;
|
|
||||||
|
|
||||||
/* Silently ignore errors getting/setting the immutable flag so
|
|
||||||
that we work correctly on filesystems that don't support it. */
|
|
||||||
if (ioctl(fd, FS_IOC_GETFLAGS, &flags)) return;
|
|
||||||
old = flags;
|
|
||||||
flags &= ~FS_IMMUTABLE_FL;
|
|
||||||
if (old == flags) return;
|
|
||||||
if (ioctl(fd, FS_IOC_SETFLAGS, &flags)) return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Upgrade from schema 6 (Nix 0.15) to schema 7 (Nix >= 1.3). */
|
|
||||||
void LocalStore::upgradeStore7()
|
|
||||||
{
|
|
||||||
if (getuid() != 0) return;
|
|
||||||
printMsg(lvlError, "removing immutable bits from the Nix store (this may take a while)...");
|
|
||||||
makeMutable(settings.nixStore);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
void LocalStore::upgradeStore7()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void LocalStore::vacuumDB()
|
void LocalStore::vacuumDB()
|
||||||
{
|
{
|
||||||
if (sqlite3_exec(db, "vacuum;", 0, 0, 0) != SQLITE_OK)
|
if (sqlite3_exec(db, "vacuum;", 0, 0, 0) != SQLITE_OK)
|
||||||
|
|
|
@ -15,7 +15,7 @@ namespace nix {
|
||||||
/* Nix store and database schema version. Version 1 (or 0) was Nix <=
|
/* Nix store and database schema version. Version 1 (or 0) was Nix <=
|
||||||
0.7. Version 2 was Nix 0.8 and 0.9. Version 3 is Nix 0.10.
|
0.7. Version 2 was Nix 0.8 and 0.9. Version 3 is Nix 0.10.
|
||||||
Version 4 is Nix 0.11. Version 5 is Nix 0.12-0.16. Version 6 is
|
Version 4 is Nix 0.11. Version 5 is Nix 0.12-0.16. Version 6 is
|
||||||
Nix 1.0. Version 7 is Nix 1.3. */
|
Nix 1.0. Version 7 is Nix 1.3. Guix has always used version 7. */
|
||||||
const int nixSchemaVersion = 7;
|
const int nixSchemaVersion = 7;
|
||||||
|
|
||||||
|
|
||||||
|
@ -244,11 +244,6 @@ private:
|
||||||
|
|
||||||
void updatePathInfo(const ValidPathInfo & info);
|
void updatePathInfo(const ValidPathInfo & info);
|
||||||
|
|
||||||
void upgradeStore6();
|
|
||||||
void upgradeStore7();
|
|
||||||
PathSet queryValidPathsOld();
|
|
||||||
ValidPathInfo queryPathInfoOld(const Path & path);
|
|
||||||
|
|
||||||
struct GCState;
|
struct GCState;
|
||||||
|
|
||||||
void deleteGarbage(GCState & state, const Path & path);
|
void deleteGarbage(GCState & state, const Path & path);
|
||||||
|
|
Loading…
Reference in New Issue