11642: Don't reuse completed jobs where output or log is null or not readable by...
authorPeter Amstutz <peter.amstutz@curoverse.com>
Fri, 9 Jun 2017 18:25:59 +0000 (14:25 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Fri, 9 Jun 2017 18:57:23 +0000 (14:57 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curoverse.com>

services/api/app/models/job.rb
services/api/test/fixtures/jobs.yml
services/api/test/functional/arvados/v1/job_reuse_controller_test.rb

index fa38ece244afb52b2c2159f8cad6950f6b16468c..84beab3c1154f809dcccddcd9ff919dbad53caa8 100644 (file)
@@ -275,12 +275,18 @@ class Job < ArvadosModel
         # Ignore: we have already decided not to reuse any completed
         # job.
         log_reuse_info { "job #{j.uuid} with output #{j.output} ignored, see above" }
+      elsif j.output.nil?
+        log_reuse_info { "job #{j.uuid} has nil output" }
+      elsif j.log.nil?
+        log_reuse_info { "job #{j.uuid} has nil log" }
+      elsif !Collection.readable_by(current_user).find_by_portable_data_hash(j.log)
+        log_reuse_info { "job #{j.uuid} log #{j.log} unavailable to user; continuing search" }
       elsif Rails.configuration.reuse_job_if_outputs_differ
         if Collection.readable_by(current_user).find_by_portable_data_hash(j.output)
           log_reuse_info { "job #{j.uuid} with output #{j.output} is reusable; decision is final." }
           return j
         else
-          # Ignore: keep locking for an incomplete job or one whose
+          # Ignore: keep looking for an incomplete job or one whose
           # output is readable.
           log_reuse_info { "job #{j.uuid} output #{j.output} unavailable to user; continuing search" }
         end
index 809ba0e138b584f2f60200c2046bcb88ba123911..abd2dcaa2630138dfaea523d6eda6db0520aebe3 100644 (file)
@@ -183,6 +183,23 @@ previous_job_run:
   state: Complete
   script_parameters_digest: a5f03bbfb8ba88a2efe4a7852671605b
 
+previous_job_run_nil_log:
+  uuid: zzzzz-8i9sb-cjs4pklxxjykqq3
+  created_at: <%= 14.minute.ago.to_s(:db) %>
+  finished_at: <%= 13.minutes.ago.to_s(:db) %>
+  owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz
+  repository: active/foo
+  script: hash
+  script_version: 4fe459abe02d9b365932b8f5dc419439ab4e2577
+  script_parameters:
+    input: fa7aeb5140e2848d39b416daeef4ffc5+45
+    an_integer: "3"
+  success: true
+  log: ~
+  output: ea10d51bcf88862dbcc36eb292017dfd+45
+  state: Complete
+  script_parameters_digest: 445702df4029b8a6e7075b451ff1256a
+
 previous_ancient_job_run:
   uuid: zzzzz-8i9sb-ahd7cie8jah9qui
   created_at: <%= 366.days.ago.to_s(:db) %>
@@ -217,6 +234,7 @@ previous_docker_job_run:
   docker_image_locator: fa3c1a9cb6783f85f2ecda037e07b8c3+167
   state: Complete
   script_parameters_digest: a5f03bbfb8ba88a2efe4a7852671605b
+  log: ea10d51bcf88862dbcc36eb292017dfd+45
 
 previous_ancient_docker_image_job_run:
   uuid: zzzzz-8i9sb-t3b460aolxxuldl
@@ -255,6 +273,7 @@ previous_job_run_with_arvados_sdk_version:
   output: ea10d51bcf88862dbcc36eb292017dfd+45
   state: Complete
   script_parameters_digest: a5f03bbfb8ba88a2efe4a7852671605b
+  log: ea10d51bcf88862dbcc36eb292017dfd+45
 
 previous_job_run_no_output:
   uuid: zzzzz-8i9sb-cjs4pklxxjykppp
index 8007fd26f8c8b64bf1295d8c7be091fed42cc1d6..afd05124cbbd162591829c1ba2b6e22511dc6955 100644 (file)
@@ -50,6 +50,26 @@ class Arvados::V1::JobReuseControllerTest < ActionController::TestCase
     assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
   end
 
+  test "no reuse job with null log" do
+    post :create, {
+      job: {
+        script: "hash",
+        script_version: "4fe459abe02d9b365932b8f5dc419439ab4e2577",
+        repository: "active/foo",
+        script_parameters: {
+          input: 'fa7aeb5140e2848d39b416daeef4ffc5+45',
+          an_integer: '3'
+        }
+      },
+      find_or_create: true
+    }
+    assert_response :success
+    assert_not_nil assigns(:object)
+    new_job = JSON.parse(@response.body)
+    assert_not_equal 'zzzzz-8i9sb-cjs4pklxxjykqq3', new_job['uuid']
+    assert_equal '4fe459abe02d9b365932b8f5dc419439ab4e2577', new_job['script_version']
+  end
+
   test "reuse job with symbolic script_version" do
     post :create, {
       job: {