Class: ForemanTasks::Lock
- Inherits:
 - 
      ApplicationRecord
      
        
- Object
 - ApplicationRecord
 - ForemanTasks::Lock
 
 
- Defined in:
 - app/models/foreman_tasks/lock.rb
 
Defined Under Namespace
Classes: LockConflict
Class Method Summary collapse
- .colliding_locks(resource, task, *_lock_names) ⇒ Object
 - 
  
    
      .exclusive!(resource, task)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Locks the resource so that no other task can lock it while running.
 - 
  
    
      .lock!(resource, task, *_lock_names)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
See #exclusive!.
 
Instance Method Summary collapse
- 
  
    
      #colliding_locks  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
returns a scope of the locks colliding with this one.
 - #save! ⇒ Object
 
Class Method Details
.colliding_locks(resource, task, *_lock_names) ⇒ Object
      72 73 74  | 
    
      # File 'app/models/foreman_tasks/lock.rb', line 72 def colliding_locks(resource, task, *_lock_names) build(resource, task).colliding_locks.to_a end  | 
  
.exclusive!(resource, task) ⇒ Object
Locks the resource so that no other task can lock it while running. No other task related to the resource is not allowed (even not-locking ones) A typical usecase is resource deletion, where it’s good idea to make sure nothing else related to the resource is really running. It also creates a Link between the task and the resource and between the task and all related resources.
      60 61 62 63 64 65  | 
    
      # File 'app/models/foreman_tasks/lock.rb', line 60 def exclusive!(resource, task) lock = build(resource, task) lock.save! ForemanTasks::Link.(resource, task) lock end  | 
  
.lock!(resource, task, *_lock_names) ⇒ Object
See #exclusive!
      68 69 70  | 
    
      # File 'app/models/foreman_tasks/lock.rb', line 68 def lock!(resource, task, *_lock_names) exclusive!(resource, task) end  | 
  
Instance Method Details
#colliding_locks ⇒ Object
returns a scope of the locks colliding with this one
      40 41 42 43 44 45  | 
    
      # File 'app/models/foreman_tasks/lock.rb', line 40 def colliding_locks task_ids = task.self_and_parents.map(&:id) colliding_locks_scope = Lock.where(Lock.arel_table[:task_id].not_in(task_ids)) colliding_locks_scope.where(resource_id: resource_id, resource_type: resource_type) end  | 
  
#save! ⇒ Object
      47 48 49 50 51  | 
    
      # File 'app/models/foreman_tasks/lock.rb', line 47 def save! super rescue ActiveRecord::RecordNotUnique raise LockConflict.new(self, colliding_locks) end  |