about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-04-30T21·22-0400
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-04-30T21·22-0400
commit59a26360c75f1cf5fe65fce5e3703df0b6645140 (patch)
tree0335e94c4d795df78a62b63f41ca241e9698d344
parent82ae0e688c21794bea583f9b48bb3639f7e2601a (diff)
Support mandatory system features in the build hook
Mandatory features are features that MUST be present in a derivation's
requiredSystemFeatures attribute.  One application is performance
testing, where we have a dedicated machine to run performance tests
(and nothing else).  Then we would add the label "perf" to the
machine's mandatory features and to the performance testing
derivations.
-rw-r--r--doc/manual/build-farm.xml17
-rwxr-xr-xscripts/build-remote.pl.in12
2 files changed, 22 insertions, 7 deletions
diff --git a/doc/manual/build-farm.xml b/doc/manual/build-farm.xml
index f2d4a477e6b9..2e0d86b89f09 100644
--- a/doc/manual/build-farm.xml
+++ b/doc/manual/build-farm.xml
@@ -31,6 +31,7 @@ variable</link>.</para>
 nix@mcflurry.labs.cs.uu.nl  powerpc-darwin  /home/nix/.ssh/id_quarterpounder_auto  2
 nix@scratchy.labs.cs.uu.nl  i686-linux      /home/nix/.ssh/id_scratchy_auto        8 1 kvm
 nix@itchy.labs.cs.uu.nl     i686-linux      /home/nix/.ssh/id_scratchy_auto        8 2
+nix@poochie.labs.cs.uu.nl   i686-linux      /home/nix/.ssh/id_scratchy_auto        8 2 kvm perf
 </programlisting>
 </example>
 
@@ -73,11 +74,12 @@ bits of information:
   the machine.  If there are multiple machines of the right type, Nix
   will prefer the fastest, taking load into account.</para></listitem>
 
-  <listitem><para>A comma-separated list of
-  <emphasis>features</emphasis>.  If a derivation has the
+  <listitem><para>A comma-separated list of <emphasis>supported
+  features</emphasis>.  If a derivation has the
   <varname>requiredSystemFeatures</varname> attribute, then
   <filename>build-remote.pl</filename> will only perform the
-  derivation on a machine that has the specified features.  For instance, the attribute
+  derivation on a machine that has the specified features.  For
+  instance, the attribute
   
 <programlisting>
 requiredSystemFeatures = [ "kvm" ];  
@@ -87,6 +89,15 @@ requiredSystemFeatures = [ "kvm" ];
   <literal>kvm</literal> feature (i.e., <literal>scratchy</literal> in
   the example above).</para></listitem>
 
+  <listitem><para>A comma-separated list of <emphasis>mandatory
+  features</emphasis>.  A machine will only be used to build a
+  derivation if all of the machine’s mandatory features appear in the
+  derivation’s <varname>requiredSystemFeatures</varname> attribute.
+  Thus, in the example, the machine <literal>poochie</literal> will
+  only do derivations that have
+  <varname>requiredSystemFeatures</varname> set to <literal>["kvm"
+  "perf"]</literal> or <literal>["perf"]</literal>.</para></listitem>
+
 </orderedlist>
 
 You should also set up the environment variable
diff --git a/scripts/build-remote.pl.in b/scripts/build-remote.pl.in
index da5561cd2199..e54386d424fa 100755
--- a/scripts/build-remote.pl.in
+++ b/scripts/build-remote.pl.in
@@ -70,13 +70,16 @@ if (defined $conf && -e $conf) {
         s/\#.*$//g;
         next if /^\s*$/;
         my @tokens = split /\s/, $_;
+        my @supportedFeatures = split(/,/, $tokens[5] || "");
+        my @mandatoryFeatures = split(/,/, $tokens[6] || "");
         push @machines,
             { hostName => $tokens[0]
             , systemTypes => [ split(/,/, $tokens[1]) ]
             , sshKeys => $tokens[2]
             , maxJobs => int($tokens[3])
             , speedFactor => 1.0 * (defined $tokens[4] ? int($tokens[4]) : 1)
-            , features => [ split(/,/, $tokens[5] || "") ]
+            , supportedFeatures => [ @supportedFeatures, @mandatoryFeatures ]
+            , mandatoryFeatures => [ @mandatoryFeatures ]
             , enabled => 1
             };
     }
@@ -90,8 +93,7 @@ my ($drvPath, $hostName, $slotLock);
 
 REQ: while (1) {
     $_ = <STDIN> || exit 0;
-    my ($amWilling, $neededSystem);
-    ($amWilling, $neededSystem, $drvPath, $requiredFeatures) = split;
+    (my $amWilling, my $neededSystem, $drvPath, my $requiredFeatures) = split;
     my @requiredFeatures = split /,/, $requiredFeatures;
 
     my $canBuildLocally = $amWilling && ($localSystem eq $neededSystem);
@@ -117,7 +119,9 @@ REQ: while (1) {
         LOOP: foreach my $cur (@machines) {
             if ($cur->{enabled}
                 && (grep { $neededSystem eq $_ } @{$cur->{systemTypes}})
-                && all(map { my $f = $_; 0 != grep { $f eq $_ } @{$cur->{features}} } @requiredFeatures))
+                && all(map { my $f = $_; 0 != grep { $f eq $_ } @{$cur->{supportedFeatures}} } (@requiredFeatures, @mandatoryFeatures))
+                && all(map { my $f = $_; 0 != grep { $f eq $_ } @requiredFeatures } @{$cur->{mandatoryFeatures}})
+                )
             {
                 $rightType = 1;