Class: Delayed::Backend::ActiveRecord::Job
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Delayed::Backend::ActiveRecord::Job
- Defined in:
- lib/delayed/master/worker/backend/active_record.rb
Class Method Summary collapse
-
.ready_to_run(worker_name, max_run_time) ⇒ Object
Remove locked_by from query because all jobs reserved by current process have same locked_by.
-
.reserve_with_scope_using_optimized_mysql(ready_scope, worker, now) ⇒ Object
Patch for mysql query.
-
.reserve_with_scope_using_optimized_postgres(ready_scope, worker, now) ⇒ Object
Patch for postgresql query.
Class Method Details
.ready_to_run(worker_name, max_run_time) ⇒ Object
Remove locked_by from query because all jobs reserved by current process have same locked_by.
8 9 10 11 12 13 14 |
# File 'lib/delayed/master/worker/backend/active_record.rb', line 8 def self.ready_to_run(worker_name, max_run_time) where( "(run_at <= ? AND (locked_at IS NULL OR locked_at < ?)) AND failed_at IS NULL", db_time_now, db_time_now - max_run_time ) end |
.reserve_with_scope_using_optimized_mysql(ready_scope, worker, now) ⇒ Object
Patch for mysql query.
30 31 32 33 34 35 36 37 |
# File 'lib/delayed/master/worker/backend/active_record.rb', line 30 def self.reserve_with_scope_using_optimized_mysql(ready_scope, worker, now) transaction do ready_scope.limit(worker.read_ahead).select(:id).lock.detect do |job| count = where(id: job.id).update_all(locked_at: now, locked_by: worker.name) count == 1 && job.reload end end end |
.reserve_with_scope_using_optimized_postgres(ready_scope, worker, now) ⇒ Object
Patch for postgresql query.
17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/delayed/master/worker/backend/active_record.rb', line 17 def self.reserve_with_scope_using_optimized_postgres(ready_scope, worker, now) quoted_name = connection.quote_table_name(table_name) subquery = ready_scope.limit(1).lock(true).select("id").to_sql sql = <<~SQL.squish WITH job AS (#{subquery} SKIP LOCKED) UPDATE #{quoted_name} AS jobs SET locked_at = ?, locked_by = ? FROM job WHERE jobs.id = job.id RETURNING * SQL reserved = find_by_sql([sql, now, worker.name]) reserved[0] end |