chiark / gitweb /
check really parallel
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 4 Nov 2016 14:33:18 +0000 (14:33 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 4 Nov 2016 14:33:18 +0000 (14:33 +0000)
check

diff --git a/check b/check
index 7293371..b9eac53 100755 (executable)
--- a/check
+++ b/check
@@ -2,13 +2,30 @@
 set -e
 set -o pipefail
 
+cpus=$(
+       perl -we '
+           use strict;
+           require Sys::CPU;
+           my $ncpus = Sys::CPU::cpu_count();
+           $ncpus *= 1.5;
+            print join " ", (0 .. $ncpus-1) or die $!;
+           print "\n" or die $!;
+       ' ||
+       echo 0 1 2
+)
+
 rm -rf stunt
 mkdir stunt
 cd stunt
 
+for cpu in $cpus; do
+       mkdir c$cpu
+       (cd c$cpu
+        git init)
+done
+
 #exec 3<&0 </dev/null
 
-git init
 #git commit --allow-empty -m 'Test object'
 #head=`git rev-parse HEAD`
 
@@ -22,20 +39,17 @@ perl -we '
     our $batch=0;
     our @tasks;
 
-    my $ncpus = eval {
-        require Sys::CPU;
-       Sys::CPU::cpu_count();
-    } // 3;
+    my @freecpus = qw('"$cpus"');
 
-$ncpus=1;
-    print STDERR "check using $ncpus cpus\n";
+    print STDERR "check using cpus @freecpus\n";
 
     sub await_task () {
-       my ($pid, $oldbatch) = @{ shift @tasks };
+       my ($pid, $cpu, $oldbatch) = @{ shift @tasks };
        waitpid $pid, 0 == $pid or die $!;
        die "$oldbatch $?" if $?;
-       unlink $oldbatch or die "$oldbatch $!";
-        print STDERR "check completed $oldbatch [$pid]\n";
+       unlink "b$oldbatch" or die "$oldbatch $!";
+        print STDERR "check completed $oldbatch [$pid] #$cpu\n";
+       push @freecpus, $cpu;
     }
 
     sub complete_batch () {
@@ -45,19 +59,22 @@ $ncpus=1;
 
         print STDERR "check closing $batch ($count)\n";
 
-       await_task if @tasks >= $ncpus;
+       await_task unless @freecpus;
+
+       my $cpu = shift @freecpus;
 
        my $pid = fork // die $!;
        if (!$pid) {
            close STDIN;
 #            seek STDIN,0,1;
 #            flush STDIN;
-           open STDIN, "<", $batch or die $batch;
-           exec qw(git update-ref --stdin);
+           open STDIN, "<", "b$batch" or die $batch;
+           chdir "c$cpu" or die "$cpu $!";
+           exec qw(eatmydata git update-ref --stdin);
            die $!;
        }
-        print STDERR "check spawned $batch ($count) [$pid]\n";
-       push @tasks, [ $pid, $batch ];
+        print STDERR "check spawned $batch ($count) [$pid] #$cpu\n";
+       push @tasks, [ $pid, $cpu, $batch ];
        $batch++;
        $file = undef;
        $count = 0;
@@ -65,7 +82,7 @@ $ncpus=1;
 
     while (<>) {
 #print STDERR ">$_<\n";
-        $file ||= new IO::File $batch, ">" or die $!;
+        $file ||= new IO::File "b$batch", ">" or die $!;
         chomp;
        print $file "delete refs/tags/$_\n" or die $!;
        $count++ < 100000 or complete_batch;