- 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!
- elsif self.state != Cancelled
- raise InvalidStateTransitionError
- end
-
- return if !cascade
-
- # cancel all children; they could be jobs or pipeline instances
- children = self.components.andand.collect{|_, u| u}.compact
-
- return if children.empty?
-
- # cancel any child jobs
- 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, state: [PipelineInstance::RunningOnServer, PipelineInstance::RunningOnClient]).each do |pi|
- pi.cancel(cascade: cascade, need_transaction: false)
- end