3220: Merge branch '3220-http-status-codes' closes #3220
[arvados.git] / sdk / cli / bin / crunch-job
index b0d779bf3ce84ba3ac9effd9839bd49a82bf9b77..a4951e7321513eab54e1d37e79bc42697a4e932d 100755 (executable)
@@ -96,15 +96,6 @@ $ENV{"CRUNCH_INSTALL"} = "$ENV{CRUNCH_TMP}/opt";
 $ENV{"CRUNCH_WORK"} = $ENV{"JOB_WORK"}; # deprecated
 mkdir ($ENV{"JOB_WORK"});
 
-my $arv_cli;
-
-if (defined $ENV{"ARV_CLI"}) {
-  $arv_cli = $ENV{"ARV_CLI"};
-}
-else {
-  $arv_cli = 'arv';
-}
-
 my $force_unlock;
 my $git_dir;
 my $jobspec;
@@ -639,8 +630,7 @@ for (my $todo_ptr = 0; $todo_ptr <= $#jobstep_todo; $todo_ptr ++)
     my $build_script_to_send = "";
     my $command =
        "if [ -e $ENV{TASK_WORK} ]; then rm -rf $ENV{TASK_WORK}; fi; "
-        ."mkdir -p $ENV{JOB_WORK} $ENV{CRUNCH_TMP} $ENV{TASK_WORK} $ENV{TASK_KEEPMOUNT} "
-        ."&& chmod og+wrx $ENV{TASK_WORK}"
+        ."mkdir -p $ENV{JOB_WORK} $ENV{CRUNCH_TMP} $ENV{TASK_WORK} $ENV{TASK_KEEPMOUNT}"
        ."&& cd $ENV{CRUNCH_TMP} ";
     if ($build_script)
     {
@@ -652,41 +642,41 @@ for (my $todo_ptr = 0; $todo_ptr <= $#jobstep_todo; $todo_ptr ++)
     if ($docker_hash)
     {
       $command .= "crunchstat -cgroup-root=/sys/fs/cgroup -cgroup-parent=docker -cgroup-cid=$ENV{TASK_WORK}/docker.cid -poll=10000 ";
-      $command .= "$docker_bin run -i -a stdin -a stdout -a stderr --cidfile=$ENV{TASK_WORK}/docker.cid ";
+      $command .= "$docker_bin run --rm=true --attach=stdout --attach=stderr --user=crunch --cidfile=$ENV{TASK_WORK}/docker.cid ";
       # Dynamically configure the container to use the host system as its
       # DNS server.  Get the host's global addresses from the ip command,
       # and turn them into docker --dns options using gawk.
       $command .=
           q{$(ip -o address show scope global |
               gawk 'match($4, /^([0-9\.:]+)\//, x){print "--dns", x[1]}') };
-      $command .= "-v \Q$ENV{TASK_WORK}:/tmp/crunch-job:rw\E ";
-      $command .= "-v \Q$ENV{CRUNCH_SRC}:/tmp/crunch-src:ro\E ";
-      $command .= "-v \Q$ENV{TASK_KEEPMOUNT}:/mnt:ro\E ";
-      $command .= "-e \QHOME=/tmp/crunch-job\E ";
+      $command .= "--volume=\Q$ENV{CRUNCH_SRC}:/tmp/crunch-src:ro\E ";
+      $command .= "--volume=\Q$ENV{TASK_KEEPMOUNT}:/keep:ro\E ";
+      $command .= "--env=\QHOME=/home/crunch\E ";
       while (my ($env_key, $env_val) = each %ENV)
       {
         if ($env_key =~ /^(ARVADOS|JOB|TASK)_/) {
           if ($env_key eq "TASK_WORK") {
-            $command .= "-\QTASK_WORK=/tmp/crunch-job\E ";
+            $command .= "--env=\QTASK_WORK=/tmp/crunch-job\E ";
           }
           elsif ($env_key eq "TASK_KEEPMOUNT") {
-            $command .= "-e \QTASK_KEEPMOUNT=/mnt\E ";
+            $command .= "--env=\QTASK_KEEPMOUNT=/keep\E ";
           }
           elsif ($env_key eq "CRUNCH_SRC") {
-            $command .= "-\QCRUNCH_SRC=/tmp/crunch-src\E ";
+            $command .= "--env=\QCRUNCH_SRC=/tmp/crunch-src\E ";
           }
           else {
-            $command .= "-\Q$env_key=$env_val\E ";
+            $command .= "--env=\Q$env_key=$env_val\E ";
           }
         }
       }
+      $command .= "--env=\QCRUNCH_NODE_SLOTS=$ENV{CRUNCH_NODE_SLOTS}\E ";
       $command .= "\Q$docker_hash\E ";
-      $command .= "stdbuf -o0 -e0 ";
+      $command .= "stdbuf --output=0 --error=0 ";
       $command .= "/tmp/crunch-src/crunch_scripts/" . $Job->{"script"};
     } else {
       # Non-docker run
       $command .= "crunchstat -cgroup-root=/sys/fs/cgroup -poll=10000 ";
-      $command .= "stdbuf -o0 -e0 ";
+      $command .= "stdbuf --output=0 --error=0 ";
       $command .= "$ENV{CRUNCH_SRC}/crunch_scripts/" . $Job->{"script"};
     }
 
@@ -842,7 +832,7 @@ if ($job_has_uuid) {
 if ($collated_output)
 {
   eval {
-    open(my $orig_manifest, '-|', 'arv', 'keep', 'get', $collated_output)
+    open(my $orig_manifest, '-|', 'arv-get', $collated_output)
         or die "failed to get collated manifest: $!";
     # Read the original manifest, and strip permission hints from it,
     # so we can put the result in a Collection.
@@ -995,27 +985,29 @@ sub reapchildren
   push @freeslot, $proc{$pid}->{slot};
   delete $proc{$pid};
 
-  # Load new tasks
-  my $newtask_list = [];
-  my $newtask_results;
-  do {
-    $newtask_results = $arv->{'job_tasks'}->{'list'}->execute(
-      'where' => {
-        'created_by_job_task_uuid' => $Jobstep->{'arvados_task'}->{uuid}
-      },
-      'order' => 'qsequence',
-      'offset' => scalar(@$newtask_list),
-    );
-    push(@$newtask_list, @{$newtask_results->{items}});
-  } while (@{$newtask_results->{items}});
-  foreach my $arvados_task (@$newtask_list) {
-    my $jobstep = {
-      'level' => $arvados_task->{'sequence'},
-      'failures' => 0,
-      'arvados_task' => $arvados_task
-    };
-    push @jobstep, $jobstep;
-    push @jobstep_todo, $#jobstep;
+  if ($task_success) {
+    # Load new tasks
+    my $newtask_list = [];
+    my $newtask_results;
+    do {
+      $newtask_results = $arv->{'job_tasks'}->{'list'}->execute(
+        'where' => {
+          'created_by_job_task_uuid' => $Jobstep->{'arvados_task'}->{uuid}
+        },
+        'order' => 'qsequence',
+        'offset' => scalar(@$newtask_list),
+      );
+      push(@$newtask_list, @{$newtask_results->{items}});
+    } while (@{$newtask_results->{items}});
+    foreach my $arvados_task (@$newtask_list) {
+      my $jobstep = {
+        'level' => $arvados_task->{'sequence'},
+        'failures' => 0,
+        'arvados_task' => $arvados_task
+      };
+      push @jobstep, $jobstep;
+      push @jobstep_todo, $#jobstep;
+    }
   }
 
   $progress_is_dirty = 1;
@@ -1180,7 +1172,7 @@ sub fetch_block
   my $hash = shift;
   my ($keep, $child_out, $output_block);
 
-  my $cmd = "$arv_cli keep get \Q$hash\E";
+  my $cmd = "arv-get \Q$hash\E";
   open($keep, '-|', $cmd) or die "fetch_block: $cmd: $!";
   sysread($keep, $output_block, 64 * 1024 * 1024);
   close $keep;
@@ -1192,7 +1184,7 @@ sub collate_output
   Log (undef, "collate");
 
   my ($child_out, $child_in);
-  my $pid = open2($child_out, $child_in, $arv_cli, 'keep', 'put', '--raw');
+  my $pid = open2($child_out, $child_in, 'arv-put', '--raw');
   my $joboutput;
   for (@jobstep)
   {
@@ -1229,7 +1221,7 @@ sub collate_output
       sysread($child_out, $joboutput, 64 * 1024 * 1024);
       chomp($joboutput);
     } else {
-      Log (undef, "timed out reading from 'arv keep put'");
+      Log (undef, "timed out reading from 'arv-put'");
     }
   }
   waitpid($pid, 0);
@@ -1342,7 +1334,7 @@ sub save_meta
   return if $justcheckpoint;  # checkpointing is not relevant post-Warehouse.pm
 
   $local_logfile->flush;
-  my $cmd = "$arv_cli keep put --filename ''\Q$keep_logfile\E "
+  my $cmd = "arv-put --filename ''\Q$keep_logfile\E "
       . quotemeta($local_logfile->filename);
   my $loglocator = `$cmd`;
   die "system $cmd failed: $?" if $?;