def cancel
reload_object_before_update
- @object.cancel params[:cascade]
+ @object.cancel cascade: params[:cascade]
show
end
def cancel
reload_object_before_update
- @object.cancel params[:cascade]
+ @object.cancel cascade: params[:cascade]
show
end
end
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!
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
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!
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
].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',
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