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:
Eelco Dolstra 2012-11-06 17:45:20 +01:00
parent 3a95e1a17c
commit bbc107ef1e
2 changed files with 25 additions and 7 deletions

View file

@ -210,6 +210,7 @@ properties. Heres 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>

View file

@ -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();
} }