Merge pull request #5022 from NixOS/more-lenient-realisation-compatibility-check

Be more lenient when realisations have a conflicting dependency set
This commit is contained in:
Eelco Dolstra 2021-07-19 16:01:38 +02:00 committed by GitHub
commit 2cf21f2829
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 6 deletions

View file

@ -342,7 +342,7 @@ LocalStore::LocalStore(const Params & params)
if (settings.isExperimentalFeatureEnabled("ca-derivations")) { if (settings.isExperimentalFeatureEnabled("ca-derivations")) {
state->stmts->RegisterRealisedOutput.create(state->db, state->stmts->RegisterRealisedOutput.create(state->db,
R"( R"(
insert or replace into Realisations (drvPath, outputName, outputPath, signatures) insert into Realisations (drvPath, outputName, outputPath, signatures)
values (?, ?, (select id from ValidPaths where path = ?), ?) values (?, ?, (select id from ValidPaths where path = ?), ?)
; ;
)"); )");
@ -379,7 +379,7 @@ LocalStore::LocalStore(const Params & params)
R"( R"(
insert or replace into RealisationsRefs (referrer, realisationReference) insert or replace into RealisationsRefs (referrer, realisationReference)
values ( values (
?, (select id from Realisations where drvPath = ? and outputName = ?),
(select id from Realisations where drvPath = ? and outputName = ?)); (select id from Realisations where drvPath = ? and outputName = ?));
)"); )");
} }
@ -748,7 +748,6 @@ void LocalStore::registerDrvOutput(const Realisation & info)
(concatStringsSep(" ", info.signatures)) (concatStringsSep(" ", info.signatures))
.exec(); .exec();
} }
uint64_t myId = state->db.getLastInsertedRowId();
for (auto & [outputId, depPath] : info.dependentRealisations) { for (auto & [outputId, depPath] : info.dependentRealisations) {
auto localRealisation = queryRealisationCore_(*state, outputId); auto localRealisation = queryRealisationCore_(*state, outputId);
if (!localRealisation) if (!localRealisation)
@ -761,7 +760,8 @@ void LocalStore::registerDrvOutput(const Realisation & info)
"match what we have locally", "match what we have locally",
info.id.to_string(), outputId.to_string()); info.id.to_string(), outputId.to_string());
state->stmts->AddRealisationReference.use() state->stmts->AddRealisationReference.use()
(myId) (info.id.strHash())
(info.id.outputName)
(outputId.strHash()) (outputId.strHash())
(outputId.outputName) (outputId.outputName)
.exec(); .exec();

View file

@ -144,8 +144,16 @@ bool Realisation::isCompatibleWith(const Realisation & other) const
{ {
assert (id == other.id); assert (id == other.id);
if (outPath == other.outPath) { if (outPath == other.outPath) {
assert(dependentRealisations == other.dependentRealisations); if (dependentRealisations.empty() != other.dependentRealisations.empty()) {
return true; warn(
"Encountered a realisation for '%s' with an empty set of "
"dependencies. This is likely an artifact from an older Nix. "
"Ill try to fix the realisation if I can",
id.to_string());
return true;
} else if (dependentRealisations == other.dependentRealisations) {
return true;
}
} }
return false; return false;
} }