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
					
				
					 2 changed files with 25 additions and 7 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue