good_job 1.2.1 → 1.2.2

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
2
  SHA256:
3
- metadata.gz: '08edeaef5cda608f5e5afd0ee0c8813805e4e88791a338dc66ab9129a9f727f6'
4
- data.tar.gz: 3608a46f95035a843ea422cca420f344d870a8be558fe9f2cdb6c765c5cbd153
3
+ metadata.gz: b5125c48d26036d60649d0448f064aebcbe95fd90ac5e2eeb22e504761f7cdd1
4
+ data.tar.gz: f6cd3d0bcbfbbc639d0724557c7dbad61e9aef717545916b57a11c4413dcfe3f
5
5
  SHA512:
6
- metadata.gz: 57f471ffef16a4f1def70922e8601b3612de84441233523492a543b7276dbb00c5dd8e37a8fd7c58d930ac78c3ea0f65704a4bef4175ef588fbf65d11051eca7
7
- data.tar.gz: e0d76a4990f613b81431e42c89f5ff1172b5353a9025d6684d866048771cbd845d51a12a212fe1df85934d7854f298a333d426b8738b0fbfd2fbbad27880f02a
6
+ metadata.gz: eeb551e271b3a47aa903d64e566a010c87a632fd064835928d4986342405f458e02c5f88451c034ee2c73225274d54583ed963431e08e80232bcd3d87f76d500
7
+ data.tar.gz: f0c70c47ad3279bb41440ed27408511bdebc064524cf0933db066a0420bae829b1145b7713bc644febe0bc21e3010334f1c641863674110df878dd4245d17b7a
@@ -1,12 +1,42 @@
1
1
  # Changelog
2
2
 
3
+ ## [v1.2.2](https://github.com/bensheldon/good_job/tree/v1.2.2) (2020-08-26)
4
+
5
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v1.2.1...v1.2.2)
6
+
7
+ **Implemented enhancements:**
8
+
9
+ - Run Github Action tests against Ruby 2.5, 2.6, 2.7 [\#100](https://github.com/bensheldon/good_job/issues/100)
10
+
11
+ **Fixed bugs:**
12
+
13
+ - Freezes puma on code change [\#95](https://github.com/bensheldon/good_job/issues/95)
14
+ - Ruby 2.7 keyword arguments warning [\#93](https://github.com/bensheldon/good_job/issues/93)
15
+
16
+ **Closed issues:**
17
+
18
+ - Add test for `rails g good\_job:install` [\#57](https://github.com/bensheldon/good_job/issues/57)
19
+
20
+ **Merged pull requests:**
21
+
22
+ - Use more ActiveRecord in Lockable and not connection.execute [\#102](https://github.com/bensheldon/good_job/pull/102) ([bensheldon](https://github.com/bensheldon))
23
+ - Run CI tests on Ruby 2.5, 2.6, and 2.7 [\#101](https://github.com/bensheldon/good_job/pull/101) ([arku](https://github.com/arku))
24
+ - Return to using executor.wrap around Scheduler execution task [\#99](https://github.com/bensheldon/good_job/pull/99) ([bensheldon](https://github.com/bensheldon))
25
+ - Fix Ruby 2.7 keyword arguments warning [\#98](https://github.com/bensheldon/good_job/pull/98) ([arku](https://github.com/arku))
26
+ - Remove executor/reloader for less interlocking [\#97](https://github.com/bensheldon/good_job/pull/97) ([sj26](https://github.com/sj26))
27
+ - Name the thread pools [\#96](https://github.com/bensheldon/good_job/pull/96) ([sj26](https://github.com/sj26))
28
+ - Add test for `rails g good\_job:install` [\#94](https://github.com/bensheldon/good_job/pull/94) ([arku](https://github.com/arku))
29
+
3
30
  ## [v1.2.1](https://github.com/bensheldon/good_job/tree/v1.2.1) (2020-08-21)
4
31
 
5
32
  [Full Changelog](https://github.com/bensheldon/good_job/compare/v1.2.0...v1.2.1)
6
33
 
7
- **Closed issues:**
34
+ **Fixed bugs:**
8
35
 
9
36
  - undefined method `thread\_mattr\_accessor' when not requiring the Sprockets Railstie [\#85](https://github.com/bensheldon/good_job/issues/85)
37
+
38
+ **Closed issues:**
39
+
10
40
  - Document comparison of GoodJob with other backends [\#51](https://github.com/bensheldon/good_job/issues/51)
11
41
 
12
42
  **Merged pull requests:**
@@ -47,7 +77,6 @@
47
77
 
48
78
  **Merged pull requests:**
49
79
 
50
- - Capture errors via instrumentation from retry\_on and discard\_on [\#79](https://github.com/bensheldon/good_job/pull/79) ([bensheldon](https://github.com/bensheldon))
51
80
  - Document GoodJob::Scheduler with Yard [\#78](https://github.com/bensheldon/good_job/pull/78) ([bensheldon](https://github.com/bensheldon))
52
81
 
53
82
  ## [v1.1.2](https://github.com/bensheldon/good_job/tree/v1.1.2) (2020-08-13)
@@ -72,6 +101,7 @@
72
101
 
73
102
  **Merged pull requests:**
74
103
 
104
+ - Capture errors via instrumentation from retry\_on and discard\_on [\#79](https://github.com/bensheldon/good_job/pull/79) ([bensheldon](https://github.com/bensheldon))
75
105
  - Allow instantiation of multiple schedulers via --queues [\#76](https://github.com/bensheldon/good_job/pull/76) ([bensheldon](https://github.com/bensheldon))
76
106
  - Extract options parsing to Configuration object [\#74](https://github.com/bensheldon/good_job/pull/74) ([bensheldon](https://github.com/bensheldon))
77
107
 
@@ -9,10 +9,12 @@ module GoodJob
9
9
  end
10
10
 
11
11
  configuration = GoodJob::Configuration.new(
12
- execution_mode: execution_mode,
13
- queues: queues,
14
- max_threads: max_threads,
15
- poll_interval: poll_interval
12
+ {
13
+ execution_mode: execution_mode,
14
+ queues: queues,
15
+ max_threads: max_threads,
16
+ poll_interval: poll_interval,
17
+ }
16
18
  )
17
19
 
18
20
  @execution_mode = configuration.execution_mode
@@ -58,7 +58,8 @@ module GoodJob
58
58
 
59
59
  unfinished.priority_ordered.only_scheduled.limit(1).with_advisory_lock do |good_jobs|
60
60
  good_job = good_jobs.first
61
- break unless good_job
61
+ # TODO: Determine why some records are fetched without an advisory lock at all
62
+ break unless good_job&.owns_advisory_lock?
62
63
 
63
64
  result, error = good_job.perform
64
65
  end
@@ -55,19 +55,17 @@ module GoodJob
55
55
  end
56
56
 
57
57
  def advisory_lock
58
- query = <<~SQL
59
- SELECT 1 AS one
60
- WHERE pg_try_advisory_lock(('x'||substr(md5(:table_name || :id::text), 1, 16))::bit(64)::bigint)
58
+ where_sql = <<~SQL
59
+ pg_try_advisory_lock(('x'||substr(md5(:table_name || :id::text), 1, 16))::bit(64)::bigint)
61
60
  SQL
62
- self.class.connection.execute(sanitize_sql_for_conditions([query, { table_name: self.class.table_name, id: send(self.class.primary_key) }])).ntuples.positive?
61
+ self.class.unscoped.where(where_sql, { table_name: self.class.table_name, id: send(self.class.primary_key) }).exists?
63
62
  end
64
63
 
65
64
  def advisory_unlock
66
- query = <<~SQL
67
- SELECT 1 AS one
68
- WHERE pg_advisory_unlock(('x'||substr(md5(:table_name || :id::text), 1, 16))::bit(64)::bigint)
65
+ where_sql = <<~SQL
66
+ pg_advisory_unlock(('x'||substr(md5(:table_name || :id::text), 1, 16))::bit(64)::bigint)
69
67
  SQL
70
- self.class.connection.execute(sanitize_sql_for_conditions([query, { table_name: self.class.table_name, id: send(self.class.primary_key) }])).ntuples.positive?
68
+ self.class.unscoped.where(where_sql, { table_name: self.class.table_name, id: send(self.class.primary_key) }).exists?
71
69
  end
72
70
 
73
71
  def advisory_lock!
@@ -85,11 +83,11 @@ module GoodJob
85
83
  end
86
84
 
87
85
  def advisory_locked?
88
- self.class.advisory_locked.where(id: send(self.class.primary_key)).any?
86
+ self.class.unscoped.advisory_locked.where(id: send(self.class.primary_key)).exists?
89
87
  end
90
88
 
91
89
  def owns_advisory_lock?
92
- self.class.owns_advisory_locked.where(id: send(self.class.primary_key)).any?
90
+ self.class.unscoped.owns_advisory_locked.where(id: send(self.class.primary_key)).exists?
93
91
  end
94
92
 
95
93
  def advisory_unlock!
@@ -7,6 +7,7 @@ module GoodJob # :nodoc:
7
7
  class Notifier
8
8
  CHANNEL = 'good_job'.freeze
9
9
  POOL_OPTIONS = {
10
+ name: name,
10
11
  min_threads: 0,
11
12
  max_threads: 1,
12
13
  auto_terminate: true,
@@ -69,13 +70,12 @@ module GoodJob # :nodoc:
69
70
 
70
71
  def listen
71
72
  future = Concurrent::Future.new(args: [@recipients, @pool, @listening], executor: @pool) do |recipients, pool, listening|
72
- Rails.application.reloader.wrap do
73
- conn = ActiveRecord::Base.connection.raw_connection
74
- ActiveSupport::Notifications.instrument("notifier_listen.good_job") do
75
- conn.async_exec "LISTEN #{CHANNEL}"
76
- end
73
+ begin
74
+ with_listen_connection do |conn|
75
+ ActiveSupport::Notifications.instrument("notifier_listen.good_job") do
76
+ conn.async_exec "LISTEN #{CHANNEL}"
77
+ end
77
78
 
78
- begin
79
79
  ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
80
80
  while pool.running?
81
81
  listening.make_true
@@ -93,14 +93,14 @@ module GoodJob # :nodoc:
93
93
  listening.make_false
94
94
  end
95
95
  end
96
- rescue StandardError => e
97
- ActiveSupport::Notifications.instrument("notifier_notify_error.good_job", { error: e })
98
- raise
99
- ensure
100
- @listening.make_false
101
- ActiveSupport::Notifications.instrument("notifier_unlisten.good_job") do
102
- conn.async_exec "UNLISTEN *"
103
- end
96
+ end
97
+ rescue StandardError => e
98
+ ActiveSupport::Notifications.instrument("notifier_notify_error.good_job", { error: e })
99
+ raise
100
+ ensure
101
+ @listening.make_false
102
+ ActiveSupport::Notifications.instrument("notifier_unlisten.good_job") do
103
+ conn.async_exec "UNLISTEN *"
104
104
  end
105
105
  end
106
106
  end
@@ -112,5 +112,16 @@ module GoodJob # :nodoc:
112
112
  def listen_observer(_time, _result, _thread_error)
113
113
  listen unless shutdown?
114
114
  end
115
+
116
+ def with_listen_connection
117
+ ar_conn = ActiveRecord::Base.connection_pool.checkout.tap do |conn|
118
+ ActiveRecord::Base.connection_pool.remove(conn)
119
+ end
120
+ pg_conn = ar_conn.raw_connection
121
+ pg_conn.exec("SET application_name = #{pg_conn.escape_identifier(self.class.name)}")
122
+ yield pg_conn
123
+ ensure
124
+ ar_conn.disconnect!
125
+ end
115
126
  end
116
127
  end
@@ -21,6 +21,7 @@ module GoodJob # :nodoc:
21
21
 
22
22
  # Defaults for instance of Concurrent::ThreadPoolExecutor
23
23
  DEFAULT_POOL_OPTIONS = {
24
+ name: name,
24
25
  min_threads: 0,
25
26
  max_threads: Concurrent.processor_count,
26
27
  auto_terminate: true,
@@ -1,3 +1,3 @@
1
1
  module GoodJob
2
- VERSION = '1.2.1'.freeze
2
+ VERSION = '1.2.2'.freeze
3
3
  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.2.1
4
+ version: 1.2.2
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-08-21 00:00:00.000000000 Z
11
+ date: 2020-08-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby