good_job 1.3.6 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8b5d625792328475faca2679c6718f344fc5162cac639be09f91197c998f2fdf
4
- data.tar.gz: 4aef2c4ae814f2a0606c18e875c91e56f8a1411394c37d45f4e1141be719f080
3
+ metadata.gz: 4a970811c9e009e460f65ed53b23913ae530e2a4018811ed63aa382ac673ad8a
4
+ data.tar.gz: 5678206af710fdbc275486529451356ae7ab8b2f52c64e8743db4789c806319d
5
5
  SHA512:
6
- metadata.gz: d309e288c89c65ec809cf7f9e138026b229aed9abb6ee667343c56ed1e96fb0833be36b7e1f1c6b064168957f537d572e2ceb5ecad0f6e754108762ace9fbd3b
7
- data.tar.gz: c1b83122c14edcbe619c6198fae270f9dbb0398888232f96e8956be23ca0f5798422181a21ea08735a0089ad3a92c0405ee69731a8a205f3fe9c99ba2b27bb36
6
+ metadata.gz: 5a1cc256e46120045b1c5f9583c9c9f6ee948a60b8e3a0f4a0dd6ee74be411dbe3d8303c6b8c0c536804f563b8819174a3840814a66f4e4110ba25244a25cffb
7
+ data.tar.gz: 11224d38b15c50108e14e529f645de8e9991aeb265414fea4513aaa253da6c13fcc9b981132516497db53f185430bb1b775ee1f5964cd8d9ece528a9a5353f70
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## [v1.4.0](https://github.com/bensheldon/good_job/tree/v1.4.0) (2020-12-31)
4
+
5
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v1.3.6...v1.4.0)
6
+
7
+ **Implemented enhancements:**
8
+
9
+ - Add JRuby support [\#167](https://github.com/bensheldon/good_job/pull/167) ([bensheldon](https://github.com/bensheldon))
10
+
11
+ **Closed issues:**
12
+
13
+ - JRuby Support [\#160](https://github.com/bensheldon/good_job/issues/160)
14
+
3
15
  ## [v1.3.6](https://github.com/bensheldon/good_job/tree/v1.3.6) (2020-12-30)
4
16
 
5
17
  [Full Changelog](https://github.com/bensheldon/good_job/compare/v1.3.5...v1.3.6)
@@ -89,7 +101,6 @@
89
101
  - Fix Ruby 2.7 GH action by setting default bundler explicitly [\#166](https://github.com/bensheldon/good_job/pull/166) ([bensheldon](https://github.com/bensheldon))
90
102
  - Cache ruby version explicitly in Github Action [\#165](https://github.com/bensheldon/good_job/pull/165) ([bensheldon](https://github.com/bensheldon))
91
103
  - Update development dependencies, rubocop [\#164](https://github.com/bensheldon/good_job/pull/164) ([bensheldon](https://github.com/bensheldon))
92
- - Fix intended constant hierarchy of GoodJob::Scheduler::ThreadPoolExecutor [\#158](https://github.com/bensheldon/good_job/pull/158) ([bensheldon](https://github.com/bensheldon))
93
104
  - Add bin/test\_app executable for Rails debugging [\#157](https://github.com/bensheldon/good_job/pull/157) ([bensheldon](https://github.com/bensheldon))
94
105
  - Extract Scheduler polling behavior to its own object [\#152](https://github.com/bensheldon/good_job/pull/152) ([bensheldon](https://github.com/bensheldon))
95
106
 
@@ -124,6 +135,7 @@
124
135
 
125
136
  **Merged pull requests:**
126
137
 
138
+ - Fix intended constant hierarchy of GoodJob::Scheduler::ThreadPoolExecutor [\#158](https://github.com/bensheldon/good_job/pull/158) ([bensheldon](https://github.com/bensheldon))
127
139
  - Add info how to setup basic auth for engine [\#153](https://github.com/bensheldon/good_job/pull/153) ([morgoth](https://github.com/morgoth))
128
140
  - Add documentation for Dashboard Rails::Engine [\#149](https://github.com/bensheldon/good_job/pull/149) ([bensheldon](https://github.com/bensheldon))
129
141
  - Style cleanup to Job error handling [\#147](https://github.com/bensheldon/good_job/pull/147) ([bensheldon](https://github.com/bensheldon))
data/README.md CHANGED
@@ -30,6 +30,7 @@ For more of the story of GoodJob, read the [introductory blog post](https://isla
30
30
  ## Table of contents
31
31
 
32
32
  - [Set up](#set-up)
33
+ - [Compatibility](#compatibility)
33
34
  - [Configuration](#configuration)
34
35
  - [Command-line options](#command-line-options)
35
36
  - [`good_job start`](#good_job-start)
@@ -123,6 +124,12 @@ For more of the story of GoodJob, read the [introductory blog post](https://isla
123
124
 
124
125
  Additional configuration is likely necessary, see the reference below for async configuration.
125
126
 
127
+ ## Compatibility
128
+
129
+ - **Ruby on Rails:** 5.2+
130
+ - **Ruby:** MRI 2.5+. JRuby 9.13+ (_JRuby's `activerecord-jdbcpostgresql-adapter` gem does not support Postgres LISTEN/NOTIFY)._
131
+ - **Postgres:** 9.6+
132
+
126
133
  ## Configuration
127
134
 
128
135
  ### Command-line options
@@ -157,7 +157,8 @@ module GoodJob
157
157
  SELECT 1 AS one
158
158
  WHERE pg_try_advisory_lock(('x'||substr(md5($1 || $2::text), 1, 16))::bit(64)::bigint)
159
159
  SQL
160
- self.class.connection.exec_query(query, 'GoodJob::Lockable Advisory Lock', [[nil, self.class.table_name], [nil, send(self.class.primary_key)]]).any?
160
+ binds = [[nil, self.class.table_name], [nil, send(self.class.primary_key)]]
161
+ ActiveRecord::Base.connection.exec_query(pg_or_jdbc_query(query), 'GoodJob::Lockable Advisory Lock', binds).any?
161
162
  end
162
163
 
163
164
  # Releases an advisory lock on this record if it is locked by this database
@@ -169,7 +170,8 @@ module GoodJob
169
170
  SELECT 1 AS one
170
171
  WHERE pg_advisory_unlock(('x'||substr(md5($1 || $2::text), 1, 16))::bit(64)::bigint)
171
172
  SQL
172
- self.class.connection.exec_query(query, 'GoodJob::Lockable Advisory Unlock', [[nil, self.class.table_name], [nil, send(self.class.primary_key)]]).any?
173
+ binds = [[nil, self.class.table_name], [nil, send(self.class.primary_key)]]
174
+ self.class.connection.exec_query(pg_or_jdbc_query(query), 'GoodJob::Lockable Advisory Unlock', binds).any?
173
175
  end
174
176
 
175
177
  # Acquires an advisory lock on this record or raises
@@ -212,9 +214,10 @@ module GoodJob
212
214
  WHERE pg_locks.locktype = 'advisory'
213
215
  AND pg_locks.objsubid = 1
214
216
  AND pg_locks.classid = ('x' || substr(md5($1 || $2::text), 1, 16))::bit(32)::int
215
- AND pg_locks.objid = (('x' || substr(md5($1 || $2::text), 1, 16))::bit(64) << 32)::bit(32)::int
217
+ AND pg_locks.objid = (('x' || substr(md5($3 || $4::text), 1, 16))::bit(64) << 32)::bit(32)::int
216
218
  SQL
217
- self.class.connection.exec_query(query, 'GoodJob::Lockable Advisory Locked?', [[nil, self.class.table_name], [nil, send(self.class.primary_key)]]).any?
219
+ binds = [[nil, self.class.table_name], [nil, send(self.class.primary_key)], [nil, self.class.table_name], [nil, send(self.class.primary_key)]]
220
+ self.class.connection.exec_query(pg_or_jdbc_query(query), 'GoodJob::Lockable Advisory Locked?', binds).any?
218
221
  end
219
222
 
220
223
  # Tests whether this record is locked by the current database session.
@@ -226,10 +229,11 @@ module GoodJob
226
229
  WHERE pg_locks.locktype = 'advisory'
227
230
  AND pg_locks.objsubid = 1
228
231
  AND pg_locks.classid = ('x' || substr(md5($1 || $2::text), 1, 16))::bit(32)::int
229
- AND pg_locks.objid = (('x' || substr(md5($1 || $2::text), 1, 16))::bit(64) << 32)::bit(32)::int
232
+ AND pg_locks.objid = (('x' || substr(md5($3 || $4::text), 1, 16))::bit(64) << 32)::bit(32)::int
230
233
  AND pg_locks.pid = pg_backend_pid()
231
234
  SQL
232
- self.class.connection.exec_query(query, 'GoodJob::Lockable Owns Advisory Lock?', [[nil, self.class.table_name], [nil, send(self.class.primary_key)]]).any?
235
+ binds = [[nil, self.class.table_name], [nil, send(self.class.primary_key)], [nil, self.class.table_name], [nil, send(self.class.primary_key)]]
236
+ self.class.connection.exec_query(pg_or_jdbc_query(query), 'GoodJob::Lockable Owns Advisory Lock?', binds).any?
233
237
  end
234
238
 
235
239
  # Releases all advisory locks on the record that are held by the current
@@ -245,5 +249,14 @@ module GoodJob
245
249
  # Made public in Rails 5.2
246
250
  self.class.send(:sanitize_sql_for_conditions, *args)
247
251
  end
252
+
253
+ def pg_or_jdbc_query(query)
254
+ if Concurrent.on_jruby?
255
+ # Replace $1 bind parameters with ?
256
+ query.gsub(/\$\d*/, '?')
257
+ else
258
+ query
259
+ end
260
+ end
248
261
  end
249
262
  end
@@ -9,6 +9,8 @@ module GoodJob # :nodoc:
9
9
  # When a message is received, the notifier passes the message to each of its recipients.
10
10
  #
11
11
  class Notifier
12
+ AdapterCannotListenError = Class.new(StandardError)
13
+
12
14
  # Default Postgres channel for LISTEN/NOTIFY
13
15
  CHANNEL = 'good_job'.freeze
14
16
  # Defaults for instance of Concurrent::ThreadPoolExecutor
@@ -94,6 +96,8 @@ module GoodJob # :nodoc:
94
96
  # @!visibility private
95
97
  # @return [void]
96
98
  def listen_observer(_time, _result, thread_error)
99
+ return if thread_error.is_a? AdapterCannotListenError
100
+
97
101
  if thread_error
98
102
  GoodJob.on_thread_error.call(thread_error) if GoodJob.on_thread_error.respond_to?(:call)
99
103
  ActiveSupport::Notifications.instrument("notifier_notify_error.good_job", { error: thread_error })
@@ -149,6 +153,8 @@ module GoodJob # :nodoc:
149
153
  ActiveRecord::Base.connection_pool.remove(conn)
150
154
  end
151
155
  pg_conn = ar_conn.raw_connection
156
+ raise AdapterCannotListenError unless pg_conn.respond_to? :wait_for_notify
157
+
152
158
  pg_conn.async_exec("SET application_name = #{pg_conn.escape_identifier(self.class.name)}").clear
153
159
  yield pg_conn
154
160
  ensure
@@ -22,7 +22,7 @@ module GoodJob # :nodoc:
22
22
  max_threads: Configuration::DEFAULT_MAX_THREADS,
23
23
  auto_terminate: true,
24
24
  idletime: 60,
25
- max_queue: -1,
25
+ max_queue: 0,
26
26
  fallback_policy: :discard,
27
27
  }.freeze
28
28
 
@@ -170,10 +170,13 @@ module GoodJob # :nodoc:
170
170
  # @return [Integer]
171
171
  def ready_worker_count
172
172
  synchronize do
173
- workers_still_to_be_created = @max_length - @pool.length
174
- workers_created_but_waiting = @ready.length
175
-
176
- workers_still_to_be_created + workers_created_but_waiting
173
+ if Concurrent.on_jruby?
174
+ @executor.getMaximumPoolSize - @executor.getActiveCount
175
+ else
176
+ workers_still_to_be_created = @max_length - @pool.length
177
+ workers_created_but_waiting = @ready.length
178
+ workers_still_to_be_created + workers_created_but_waiting
179
+ end
177
180
  end
178
181
  end
179
182
  end
@@ -1,4 +1,4 @@
1
1
  module GoodJob
2
2
  # GoodJob gem version.
3
- VERSION = '1.3.6'.freeze
3
+ VERSION = '1.4.0'.freeze
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: good_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.6
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Sheldon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-30 00:00:00.000000000 Z
11
+ date: 2020-12-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.0.2
55
- - !ruby/object:Gem::Dependency
56
- name: pg
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: 1.0.0
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: 1.0.0
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: railties
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -262,34 +248,6 @@ dependencies:
262
248
  - - ">="
263
249
  - !ruby/object:Gem::Version
264
250
  version: '0'
265
- - !ruby/object:Gem::Dependency
266
- name: rails
267
- requirement: !ruby/object:Gem::Requirement
268
- requirements:
269
- - - ">="
270
- - !ruby/object:Gem::Version
271
- version: '0'
272
- type: :development
273
- prerelease: false
274
- version_requirements: !ruby/object:Gem::Requirement
275
- requirements:
276
- - - ">="
277
- - !ruby/object:Gem::Version
278
- version: '0'
279
- - !ruby/object:Gem::Dependency
280
- name: rbtrace
281
- requirement: !ruby/object:Gem::Requirement
282
- requirements:
283
- - - ">="
284
- - !ruby/object:Gem::Version
285
- version: '0'
286
- type: :development
287
- prerelease: false
288
- version_requirements: !ruby/object:Gem::Requirement
289
- requirements:
290
- - - ">="
291
- - !ruby/object:Gem::Version
292
- version: '0'
293
251
  - !ruby/object:Gem::Dependency
294
252
  name: rspec-rails
295
253
  requirement: !ruby/object:Gem::Requirement