delayed_job_active_record 4.1.2 → 4.1.3
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3bdebcffb191581b743a334926d45c01184fbe0a58a906741b0f7f73118375bc
|
4
|
+
data.tar.gz: fdc7e1c5c74cd0f5beef00a61d62daaf3bf91d2ca631248a7a2a7382f3d420d9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 443633226e38e35bf47be09f548b9bdc1aea188f7c74244b32d8cbbd6b18cac0fd04bffac8540f075e3cc18cd737937f7049a16cc39a363be4fea6cfc9097471
|
7
|
+
data.tar.gz: c479df41fa2326aef35d02771336c17ba5ce956aa1c006769b1a67f4282e716c161d723cfd479178f24bbc21b5fdf6183e656a867d3221cf8753d21c7b800cbd
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
**If you're viewing this at https://github.com/collectiveidea/delayed_job_active_record,
|
2
2
|
you're reading the documentation for the master branch.
|
3
3
|
[View documentation for the latest release
|
4
|
-
(4.1.
|
4
|
+
(4.1.3).](https://github.com/collectiveidea/delayed_job_active_record/tree/v4.1.3)**
|
5
5
|
|
6
6
|
# DelayedJob ActiveRecord Backend
|
7
7
|
|
@@ -1,14 +1,14 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
|
-
spec.add_dependency "activerecord", [">= 3.0", "< 5.
|
2
|
+
spec.add_dependency "activerecord", [">= 3.0", "< 5.3"]
|
3
3
|
spec.add_dependency "delayed_job", [">= 3.0", "< 5"]
|
4
4
|
spec.authors = ["Brian Ryckbost", "Matt Griffin", "Erik Michaels-Ober"]
|
5
5
|
spec.description = "ActiveRecord backend for Delayed::Job, originally authored by Tobias Lütke"
|
6
6
|
spec.email = ["bryckbost@gmail.com", "matt@griffinonline.org", "sferik@gmail.com"]
|
7
|
-
spec.files = %w
|
7
|
+
spec.files = %w[CONTRIBUTING.md LICENSE.md README.md delayed_job_active_record.gemspec] + Dir["lib/**/*.rb"]
|
8
8
|
spec.homepage = "http://github.com/collectiveidea/delayed_job_active_record"
|
9
9
|
spec.licenses = ["MIT"]
|
10
10
|
spec.name = "delayed_job_active_record"
|
11
11
|
spec.require_paths = ["lib"]
|
12
12
|
spec.summary = "ActiveRecord backend for DelayedJob"
|
13
|
-
spec.version = "4.1.
|
13
|
+
spec.version = "4.1.3"
|
14
14
|
end
|
@@ -10,7 +10,9 @@ module Delayed
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def reserve_sql_strategy=(val)
|
13
|
-
|
13
|
+
if !(val == :optimized_sql || val == :default_sql)
|
14
|
+
raise ArgumentError, "allowed values are :optimized_sql or :default_sql"
|
15
|
+
end
|
14
16
|
@reserve_sql_strategy = val
|
15
17
|
end
|
16
18
|
end
|
@@ -34,6 +36,9 @@ module Delayed
|
|
34
36
|
end
|
35
37
|
|
36
38
|
scope :by_priority, lambda { order("priority ASC, run_at ASC") }
|
39
|
+
scope :min_priority, lambda { where("priority >= ?", Worker.min_priority) if Worker.min_priority }
|
40
|
+
scope :max_priority, lambda { where("priority <= ?", Worker.max_priority) if Worker.max_priority }
|
41
|
+
scope :for_queues, lambda { |queues = Worker.queues| where(queue: queues) if Array(queues).any? }
|
37
42
|
|
38
43
|
before_save :set_default_run_at
|
39
44
|
|
@@ -45,7 +50,12 @@ module Delayed
|
|
45
50
|
set_delayed_job_table_name
|
46
51
|
|
47
52
|
def self.ready_to_run(worker_name, max_run_time)
|
48
|
-
where(
|
53
|
+
where(
|
54
|
+
"(run_at <= ? AND (locked_at IS NULL OR locked_at < ?) OR locked_by = ?) AND failed_at IS NULL",
|
55
|
+
db_time_now,
|
56
|
+
db_time_now - max_run_time,
|
57
|
+
worker_name
|
58
|
+
)
|
49
59
|
end
|
50
60
|
|
51
61
|
def self.before_fork
|
@@ -61,15 +71,13 @@ module Delayed
|
|
61
71
|
where(locked_by: worker_name).update_all(locked_by: nil, locked_at: nil)
|
62
72
|
end
|
63
73
|
|
64
|
-
def self.reserve(worker, max_run_time = Worker.max_run_time)
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
ready_scope = ready_scope.where(queue: Worker.queues) if Worker.queues.any?
|
72
|
-
ready_scope = ready_scope.by_priority
|
74
|
+
def self.reserve(worker, max_run_time = Worker.max_run_time)
|
75
|
+
ready_scope =
|
76
|
+
ready_to_run(worker.name, max_run_time)
|
77
|
+
.min_priority
|
78
|
+
.max_priority
|
79
|
+
.for_queues
|
80
|
+
.by_priority
|
73
81
|
|
74
82
|
reserve_with_scope(ready_scope, worker, db_time_now)
|
75
83
|
end
|
@@ -88,41 +96,12 @@ module Delayed
|
|
88
96
|
|
89
97
|
def self.reserve_with_scope_using_optimized_sql(ready_scope, worker, now)
|
90
98
|
case connection.adapter_name
|
91
|
-
when "PostgreSQL"
|
92
|
-
|
93
|
-
# This locks the single record 'FOR UPDATE' in the subquery
|
94
|
-
# http://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-FOR-UPDATE-SHARE
|
95
|
-
# Note: active_record would attempt to generate UPDATE...LIMIT like
|
96
|
-
# SQL for Postgres if we use a .limit() filter, but it would not
|
97
|
-
# use 'FOR UPDATE' and we would have many locking conflicts
|
98
|
-
quoted_table_name = connection.quote_table_name(table_name)
|
99
|
-
subquery_sql = ready_scope.limit(1).lock(true).select("id").to_sql
|
100
|
-
reserved = find_by_sql(["UPDATE #{quoted_table_name} SET locked_at = ?, locked_by = ? WHERE id IN (#{subquery_sql}) RETURNING *", now, worker.name])
|
101
|
-
reserved[0]
|
99
|
+
when "PostgreSQL", "PostGIS"
|
100
|
+
reserve_with_scope_using_optimized_postgres(ready_scope, worker, now)
|
102
101
|
when "MySQL", "Mysql2"
|
103
|
-
|
104
|
-
# MySQL 5.6.4 onwards millisecond precision exists, but the
|
105
|
-
# datetime object created doesn't have precision, so discarded
|
106
|
-
# while updating. But during the where clause, for mysql(>=5.6.4),
|
107
|
-
# it queries with precision as well. So removing the precision
|
108
|
-
now = now.change(usec: 0)
|
109
|
-
# This works on MySQL and possibly some other DBs that support
|
110
|
-
# UPDATE...LIMIT. It uses separate queries to lock and return the job
|
111
|
-
count = ready_scope.limit(1).update_all(locked_at: now, locked_by: worker.name)
|
112
|
-
return nil if count == 0
|
113
|
-
where(locked_at: now, locked_by: worker.name, failed_at: nil).first
|
102
|
+
reserve_with_scope_using_optimized_mysql(ready_scope, worker, now)
|
114
103
|
when "MSSQL", "Teradata"
|
115
|
-
|
116
|
-
# is called directly
|
117
|
-
subsubquery_sql = ready_scope.limit(1).to_sql
|
118
|
-
# select("id") doesn't generate a subquery, so force a subquery
|
119
|
-
subquery_sql = "SELECT id FROM (#{subsubquery_sql}) AS x"
|
120
|
-
quoted_table_name = connection.quote_table_name(table_name)
|
121
|
-
sql = ["UPDATE #{quoted_table_name} SET locked_at = ?, locked_by = ? WHERE id IN (#{subquery_sql})", now, worker.name]
|
122
|
-
count = connection.execute(sanitize_sql(sql))
|
123
|
-
return nil if count == 0
|
124
|
-
# MSSQL JDBC doesn't support OUTPUT INSERTED.* for returning a result set, so query locked row
|
125
|
-
where(locked_at: now, locked_by: worker.name, failed_at: nil).first
|
104
|
+
reserve_with_scope_using_optimized_mssql(ready_scope, worker, now)
|
126
105
|
# Fallback for unknown / other DBMS
|
127
106
|
else
|
128
107
|
reserve_with_scope_using_default_sql(ready_scope, worker, now)
|
@@ -137,6 +116,48 @@ module Delayed
|
|
137
116
|
end
|
138
117
|
end
|
139
118
|
|
119
|
+
def self.reserve_with_scope_using_optimized_postgres(ready_scope, worker, now)
|
120
|
+
# Custom SQL required for PostgreSQL because postgres does not support UPDATE...LIMIT
|
121
|
+
# This locks the single record 'FOR UPDATE' in the subquery
|
122
|
+
# http://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-FOR-UPDATE-SHARE
|
123
|
+
# Note: active_record would attempt to generate UPDATE...LIMIT like
|
124
|
+
# SQL for Postgres if we use a .limit() filter, but it would not
|
125
|
+
# use 'FOR UPDATE' and we would have many locking conflicts
|
126
|
+
quoted_name = connection.quote_table_name(table_name)
|
127
|
+
subquery = ready_scope.limit(1).lock(true).select("id").to_sql
|
128
|
+
sql = "UPDATE #{quoted_name} SET locked_at = ?, locked_by = ? WHERE id IN (#{subquery}) RETURNING *"
|
129
|
+
reserved = find_by_sql([sql, now, worker.name])
|
130
|
+
reserved[0]
|
131
|
+
end
|
132
|
+
|
133
|
+
def self.reserve_with_scope_using_optimized_mysql(ready_scope, worker, now)
|
134
|
+
# Removing the millisecond precision from now(time object)
|
135
|
+
# MySQL 5.6.4 onwards millisecond precision exists, but the
|
136
|
+
# datetime object created doesn't have precision, so discarded
|
137
|
+
# while updating. But during the where clause, for mysql(>=5.6.4),
|
138
|
+
# it queries with precision as well. So removing the precision
|
139
|
+
now = now.change(usec: 0)
|
140
|
+
# This works on MySQL and possibly some other DBs that support
|
141
|
+
# UPDATE...LIMIT. It uses separate queries to lock and return the job
|
142
|
+
count = ready_scope.limit(1).update_all(locked_at: now, locked_by: worker.name)
|
143
|
+
return nil if count == 0
|
144
|
+
where(locked_at: now, locked_by: worker.name, failed_at: nil).first
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.reserve_with_scope_using_optimized_mssql(ready_scope, worker, now)
|
148
|
+
# The MSSQL driver doesn't generate a limit clause when update_all
|
149
|
+
# is called directly
|
150
|
+
subsubquery_sql = ready_scope.limit(1).to_sql
|
151
|
+
# select("id") doesn't generate a subquery, so force a subquery
|
152
|
+
subquery_sql = "SELECT id FROM (#{subsubquery_sql}) AS x"
|
153
|
+
quoted_table_name = connection.quote_table_name(table_name)
|
154
|
+
sql = "UPDATE #{quoted_table_name} SET locked_at = ?, locked_by = ? WHERE id IN (#{subquery_sql})"
|
155
|
+
count = connection.execute(sanitize_sql([sql, now, worker.name]))
|
156
|
+
return nil if count == 0
|
157
|
+
# MSSQL JDBC doesn't support OUTPUT INSERTED.* for returning a result set, so query locked row
|
158
|
+
where(locked_at: now, locked_by: worker.name, failed_at: nil).first
|
159
|
+
end
|
160
|
+
|
140
161
|
# Get the current time (GMT or local depending on DB)
|
141
162
|
# Note: This does not ping the DB to get the time, so all your clients
|
142
163
|
# must have syncronized clocks.
|
@@ -146,7 +167,7 @@ module Delayed
|
|
146
167
|
elsif ::ActiveRecord::Base.default_timezone == :utc
|
147
168
|
Time.now.utc
|
148
169
|
else
|
149
|
-
Time.now
|
170
|
+
Time.now # rubocop:disable Rails/TimeZone
|
150
171
|
end
|
151
172
|
end
|
152
173
|
|
@@ -22,9 +22,7 @@ module DelayedJob
|
|
22
22
|
private
|
23
23
|
|
24
24
|
def migration_version
|
25
|
-
if ActiveRecord::VERSION::MAJOR >= 5
|
26
|
-
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]"
|
27
|
-
end
|
25
|
+
"[#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}]" if ActiveRecord::VERSION::MAJOR >= 5
|
28
26
|
end
|
29
27
|
end
|
30
28
|
end
|
@@ -7,7 +7,11 @@ require "rails/generators/active_record"
|
|
7
7
|
module DelayedJob
|
8
8
|
class UpgradeGenerator < ActiveRecordGenerator
|
9
9
|
def create_migration_file
|
10
|
-
migration_template
|
10
|
+
migration_template(
|
11
|
+
"upgrade_migration.rb",
|
12
|
+
"db/migrate/add_queue_to_delayed_jobs.rb",
|
13
|
+
migration_version: migration_version
|
14
|
+
)
|
11
15
|
end
|
12
16
|
end
|
13
17
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_job_active_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.1.
|
4
|
+
version: 4.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Ryckbost
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2018-04-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '3.0'
|
22
22
|
- - "<"
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version: '5.
|
24
|
+
version: '5.3'
|
25
25
|
type: :runtime
|
26
26
|
prerelease: false
|
27
27
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -31,7 +31,7 @@ dependencies:
|
|
31
31
|
version: '3.0'
|
32
32
|
- - "<"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '5.
|
34
|
+
version: '5.3'
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: delayed_job
|
37
37
|
requirement: !ruby/object:Gem::Requirement
|
@@ -93,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
93
|
version: '0'
|
94
94
|
requirements: []
|
95
95
|
rubyforge_project:
|
96
|
-
rubygems_version: 2.6
|
96
|
+
rubygems_version: 2.7.6
|
97
97
|
signing_key:
|
98
98
|
specification_version: 4
|
99
99
|
summary: ActiveRecord backend for DelayedJob
|