From 2e9cb970e94c1ba259c6365ea4b456ca87e85cee Mon Sep 17 00:00:00 2001 From: radhika Date: Fri, 10 Feb 2017 14:08:50 -0500 Subject: [PATCH] 10903: support need_transaction for job and pipeline_instance cancel methods. --- .../controllers/arvados/v1/jobs_controller.rb | 2 +- .../arvados/v1/pipeline_instances_controller.rb | 2 +- services/api/app/models/job.rb | 17 ++++++++++++----- services/api/app/models/pipeline_instance.rb | 13 ++++++++++--- services/api/test/unit/job_test.rb | 4 ++-- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/services/api/app/controllers/arvados/v1/jobs_controller.rb b/services/api/app/controllers/arvados/v1/jobs_controller.rb index c38e419084..bca74cd55f 100644 --- a/services/api/app/controllers/arvados/v1/jobs_controller.rb +++ b/services/api/app/controllers/arvados/v1/jobs_controller.rb @@ -46,7 +46,7 @@ class Arvados::V1::JobsController < ApplicationController def cancel reload_object_before_update - @object.cancel params[:cascade] + @object.cancel cascade: params[:cascade] show end diff --git a/services/api/app/controllers/arvados/v1/pipeline_instances_controller.rb b/services/api/app/controllers/arvados/v1/pipeline_instances_controller.rb index 476fc0abb5..c44c81a733 100644 --- a/services/api/app/controllers/arvados/v1/pipeline_instances_controller.rb +++ b/services/api/app/controllers/arvados/v1/pipeline_instances_controller.rb @@ -5,7 +5,7 @@ class Arvados::V1::PipelineInstancesController < ApplicationController def cancel reload_object_before_update - @object.cancel params[:cascade] + @object.cancel cascade: params[:cascade] show end end diff --git a/services/api/app/models/job.rb b/services/api/app/models/job.rb index 5ce5ff20f2..d73d629905 100644 --- a/services/api/app/models/job.rb +++ b/services/api/app/models/job.rb @@ -284,7 +284,14 @@ class Job < ArvadosModel end end - def cancel cascade=nil + def cancel(cascade: false, need_transaction: true) + if need_transaction + ActiveRecord::Base.transaction do + cancel(cascade: cascade, need_transaction: false) + end + return + end + if self.state.in?([Queued, Running]) self.state = Cancelled self.save! @@ -300,13 +307,13 @@ class Job < ArvadosModel return if children.empty? # cancel any child jobs - Job.where(uuid: children).each do |job| - job.cancel cascade if job.state.in?([Queued, Running]) + Job.where(uuid: children, state: [Queued, Running]).each do |job| + job.cancel(cascade: cascade, need_transaction: false) end # cancel any child pipelines - PipelineInstance.where(uuid: children).each do |pi| - pi.cancel cascade if pi.state.in?([PipelineInstance::RunningOnServer, PipelineInstance::RunningOnClient]) + PipelineInstance.where(uuid: children, state: [PipelineInstance::RunningOnServer, PipelineInstance::RunningOnClient]).each do |pi| + pi.cancel(cascade: cascade, need_transaction: false) end end diff --git a/services/api/app/models/pipeline_instance.rb b/services/api/app/models/pipeline_instance.rb index 651f36d30f..75903ca7d0 100644 --- a/services/api/app/models/pipeline_instance.rb +++ b/services/api/app/models/pipeline_instance.rb @@ -100,7 +100,14 @@ class PipelineInstance < ArvadosModel self.where("state = 'RunningOnServer'") end - def cancel cascade=nil + def cancel(cascade: false, need_transaction: true) + if need_transaction + ActiveRecord::Base.transaction do + cancel(cascade: cascade, need_transaction: false) + end + return + end + if self.state.in?([RunningOnServer, RunningOnClient]) self.state = Paused self.save! @@ -115,8 +122,8 @@ class PipelineInstance < ArvadosModel return if children.empty? - Job.where(uuid: children).each do |job| - job.cancel cascade if job.state.in?([Job::Queued, Job::Running]) + Job.where(uuid: children, state: [Job::Queued, Job::Running]).each do |job| + job.cancel(cascade: cascade, need_transaction: false) end end diff --git a/services/api/test/unit/job_test.rb b/services/api/test/unit/job_test.rb index 72b7689817..8355ccf897 100644 --- a/services/api/test/unit/job_test.rb +++ b/services/api/test/unit/job_test.rb @@ -509,7 +509,7 @@ class JobTest < ActiveSupport::TestCase ].each do |cascade| test "cancel job with cascade #{cascade}" do job = Job.find_by_uuid jobs(:running_job_with_components_at_level_1).uuid - job.cancel cascade + job.cancel cascade: cascade assert_equal Job::Cancelled, job.state descendents = ['zzzzz-8i9sb-jobcomponentsl2', @@ -542,7 +542,7 @@ class JobTest < ActiveSupport::TestCase test 'cancelling a job with circular relationship with another does not result in an infinite loop' do job = Job.find_by_uuid jobs(:running_job_2_with_circular_component_relationship).uuid - job.cancel true + job.cancel cascade: true assert_equal Job::Cancelled, job.state -- 2.30.2