forked from lix-project/lix
Process binary caches in order of priority
Binary caches can now specify a priority in their nix-cache-info file. The binary cache substituter checks caches in order of priority. This is to ensure that fast, static caches like nixos.org/binary-cache are processed before slow, dynamic caches like hydra.nixos.org.
This commit is contained in:
parent
3a95e1a17c
commit
bbc107ef1e
|
@ -210,6 +210,7 @@ properties. Here’s an example:
|
||||||
<screen>
|
<screen>
|
||||||
StoreDir: /nix/store
|
StoreDir: /nix/store
|
||||||
WantMassQuery: 1
|
WantMassQuery: 1
|
||||||
|
Priority: 10
|
||||||
</screen>
|
</screen>
|
||||||
|
|
||||||
The properties that are currently supported are:
|
The properties that are currently supported are:
|
||||||
|
@ -246,6 +247,16 @@ The properties that are currently supported are:
|
||||||
|
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry><term><literal>Priority</literal></term>
|
||||||
|
|
||||||
|
<listitem><para>Each binary cache has a priority (defaulting to
|
||||||
|
50). Binary caches are checked for binaries in order of ascending
|
||||||
|
priority; thus a higher number denotes a lower priority. The
|
||||||
|
binary cache <uri>http://nixos.org/binary-cache</uri> has priority
|
||||||
|
40.</para></listitem>
|
||||||
|
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
|
|
||||||
</para>
|
</para>
|
||||||
|
|
|
@ -102,7 +102,9 @@ sub processRequests {
|
||||||
|
|
||||||
|
|
||||||
sub initCache {
|
sub initCache {
|
||||||
my $dbPath = "$Nix::Config::stateDir/binary-cache-v1.sqlite";
|
my $dbPath = "$Nix::Config::stateDir/binary-cache-v2.sqlite";
|
||||||
|
|
||||||
|
unlink "$Nix::Config::stateDir/binary-cache-v1.sqlite";
|
||||||
|
|
||||||
# Open/create the database.
|
# Open/create the database.
|
||||||
$dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "")
|
$dbh = DBI->connect("dbi:SQLite:dbname=$dbPath", "", "")
|
||||||
|
@ -120,7 +122,8 @@ sub initCache {
|
||||||
url text unique not null,
|
url text unique not null,
|
||||||
timestamp integer not null,
|
timestamp integer not null,
|
||||||
storeDir text not null,
|
storeDir text not null,
|
||||||
wantMassQuery integer not null
|
wantMassQuery integer not null,
|
||||||
|
priority integer not null
|
||||||
);
|
);
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
@ -156,7 +159,7 @@ EOF
|
||||||
|
|
||||||
$dbh->do("create index if not exists NARExistenceByExistTimestamp on NARExistence (exist, timestamp)");
|
$dbh->do("create index if not exists NARExistenceByExistTimestamp on NARExistence (exist, timestamp)");
|
||||||
|
|
||||||
$queryCache = $dbh->prepare("select id, storeDir, wantMassQuery from BinaryCaches where url = ?") or die;
|
$queryCache = $dbh->prepare("select id, storeDir, wantMassQuery, priority from BinaryCaches where url = ?") or die;
|
||||||
|
|
||||||
$insertNAR = $dbh->prepare(
|
$insertNAR = $dbh->prepare(
|
||||||
"insert or replace into NARs(cache, storePath, url, compression, fileHash, fileSize, narHash, " .
|
"insert or replace into NARs(cache, storePath, url, compression, fileHash, fileSize, narHash, " .
|
||||||
|
@ -220,7 +223,7 @@ sub getAvailableCaches {
|
||||||
my $res = $queryCache->fetchrow_hashref();
|
my $res = $queryCache->fetchrow_hashref();
|
||||||
if (defined $res) {
|
if (defined $res) {
|
||||||
next if $res->{storeDir} ne $Nix::Config::storeDir;
|
next if $res->{storeDir} ne $Nix::Config::storeDir;
|
||||||
push @caches, { id => $res->{id}, url => $url, wantMassQuery => $res->{wantMassQuery} };
|
push @caches, { id => $res->{id}, url => $url, wantMassQuery => $res->{wantMassQuery}, priority => $res->{priority} };
|
||||||
next;
|
next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,6 +239,7 @@ sub getAvailableCaches {
|
||||||
|
|
||||||
my $storeDir = "/nix/store";
|
my $storeDir = "/nix/store";
|
||||||
my $wantMassQuery = 0;
|
my $wantMassQuery = 0;
|
||||||
|
my $priority = 50;
|
||||||
foreach my $line (split "\n", $request->{content}) {
|
foreach my $line (split "\n", $request->{content}) {
|
||||||
unless ($line =~ /^(.*): (.*)$/) {
|
unless ($line =~ /^(.*): (.*)$/) {
|
||||||
print STDERR "bad cache info file ‘$request->{url}’\n";
|
print STDERR "bad cache info file ‘$request->{url}’\n";
|
||||||
|
@ -243,15 +247,18 @@ sub getAvailableCaches {
|
||||||
}
|
}
|
||||||
if ($1 eq "StoreDir") { $storeDir = $2; }
|
if ($1 eq "StoreDir") { $storeDir = $2; }
|
||||||
elsif ($1 eq "WantMassQuery") { $wantMassQuery = int($2); }
|
elsif ($1 eq "WantMassQuery") { $wantMassQuery = int($2); }
|
||||||
|
elsif ($1 eq "Priority") { $priority = int($2); }
|
||||||
}
|
}
|
||||||
|
|
||||||
$dbh->do("insert into BinaryCaches(url, timestamp, storeDir, wantMassQuery) values (?, ?, ?, ?)",
|
$dbh->do("insert into BinaryCaches(url, timestamp, storeDir, wantMassQuery, priority) values (?, ?, ?, ?, ?)",
|
||||||
{}, $url, time(), $storeDir, $wantMassQuery);
|
{}, $url, time(), $storeDir, $wantMassQuery, $priority);
|
||||||
my $id = $dbh->last_insert_id("", "", "", "");
|
my $id = $dbh->last_insert_id("", "", "", "");
|
||||||
next if $storeDir ne $Nix::Config::storeDir;
|
next if $storeDir ne $Nix::Config::storeDir;
|
||||||
push @caches, { id => $id, url => $url, wantMassQuery => $wantMassQuery };
|
push @caches, { id => $id, url => $url, wantMassQuery => $wantMassQuery, priority => $priority };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@caches = sort { $a->{priority} <=> $b->{priority} } @caches;
|
||||||
|
|
||||||
expireNegative();
|
expireNegative();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue