good_job 1.11.0 → 1.11.1
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 +4 -4
- data/CHANGELOG.md +12 -0
- data/lib/good_job/lockable.rb +21 -15
- data/lib/good_job/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 91a09f77d3cb46eb91c4673732e1c52ea752f8d94f95c23c81d3457dc63aa051
|
|
4
|
+
data.tar.gz: ef21168d4aa96f3dfbf50ebed2339132bea52542209d5732d84ac23028227537
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8140a558ee43eeb2e3673462b7279f25cbed256bac385b131aa48c2f0ff59106d2038a39c65f3f1fd11f65cbcf7d3fb232bbfd20c790e7de629047a8eaed742b
|
|
7
|
+
data.tar.gz: 9daf8d432f5a013fbe5af10176b788c6c2e8c89e0f9b5e12568cbef7a7ecddda2b9296968e1076f71e5f26ed35a2f37d987227e7ad260030807f95404c7dbdeb
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [v1.11.1](https://github.com/bensheldon/good_job/tree/v1.11.1) (2021-07-07)
|
|
4
|
+
|
|
5
|
+
[Full Changelog](https://github.com/bensheldon/good_job/compare/v1.11.0...v1.11.1)
|
|
6
|
+
|
|
7
|
+
**Closed issues:**
|
|
8
|
+
|
|
9
|
+
- Database connection required while loading the code on 1.10.x [\#291](https://github.com/bensheldon/good_job/issues/291)
|
|
10
|
+
|
|
11
|
+
**Merged pull requests:**
|
|
12
|
+
|
|
13
|
+
- Defer accessing ActiveRecord `primary_key` in Lockable [\#293](https://github.com/bensheldon/good_job/pull/293) ([bensheldon](https://github.com/bensheldon))
|
|
14
|
+
|
|
3
15
|
## [v1.11.0](https://github.com/bensheldon/good_job/tree/v1.11.0) (2021-07-07)
|
|
4
16
|
|
|
5
17
|
[Full Changelog](https://github.com/bensheldon/good_job/compare/v1.10.1...v1.11.0)
|
data/lib/good_job/lockable.rb
CHANGED
|
@@ -23,20 +23,20 @@ module GoodJob
|
|
|
23
23
|
|
|
24
24
|
included do
|
|
25
25
|
# Default column to be used when creating Advisory Locks
|
|
26
|
-
|
|
26
|
+
class_attribute :advisory_lockable_column, instance_accessor: false, default: Concurrent::Delay.new { primary_key }
|
|
27
27
|
|
|
28
28
|
# Default Postgres function to be used for Advisory Locks
|
|
29
|
-
|
|
29
|
+
class_attribute :advisory_lockable_function, default: "pg_try_advisory_lock"
|
|
30
30
|
|
|
31
31
|
# Attempt to acquire an advisory lock on the selected records and
|
|
32
32
|
# return only those records for which a lock could be acquired.
|
|
33
|
-
# @!method advisory_lock(column:
|
|
33
|
+
# @!method advisory_lock(column: _advisory_lockable_column, function: advisory_lockable_function)
|
|
34
34
|
# @!scope class
|
|
35
35
|
# @param column [String, Symbol] column values to Advisory Lock against
|
|
36
36
|
# @param function [String, Symbol] Postgres Advisory Lock function name to use
|
|
37
37
|
# @return [ActiveRecord::Relation]
|
|
38
38
|
# A relation selecting only the records that were locked.
|
|
39
|
-
scope :advisory_lock, (lambda do |column:
|
|
39
|
+
scope :advisory_lock, (lambda do |column: _advisory_lockable_column, function: advisory_lockable_function|
|
|
40
40
|
original_query = self
|
|
41
41
|
|
|
42
42
|
cte_table = Arel::Table.new(:rows)
|
|
@@ -64,13 +64,13 @@ module GoodJob
|
|
|
64
64
|
#
|
|
65
65
|
# For details on +pg_locks+, see
|
|
66
66
|
# {https://www.postgresql.org/docs/current/view-pg-locks.html}.
|
|
67
|
-
# @!method joins_advisory_locks(column:
|
|
67
|
+
# @!method joins_advisory_locks(column: _advisory_lockable_column)
|
|
68
68
|
# @!scope class
|
|
69
69
|
# @param column [String, Symbol] column values to Advisory Lock against
|
|
70
70
|
# @return [ActiveRecord::Relation]
|
|
71
71
|
# @example Get the records that have a session awaiting a lock:
|
|
72
72
|
# MyLockableRecord.joins_advisory_locks.where("pg_locks.granted = ?", false)
|
|
73
|
-
scope :joins_advisory_locks, (lambda do |column:
|
|
73
|
+
scope :joins_advisory_locks, (lambda do |column: _advisory_lockable_column|
|
|
74
74
|
join_sql = <<~SQL.squish
|
|
75
75
|
LEFT JOIN pg_locks ON pg_locks.locktype = 'advisory'
|
|
76
76
|
AND pg_locks.objsubid = 1
|
|
@@ -82,26 +82,26 @@ module GoodJob
|
|
|
82
82
|
end)
|
|
83
83
|
|
|
84
84
|
# Find records that do not have an advisory lock on them.
|
|
85
|
-
# @!method advisory_unlocked(column:
|
|
85
|
+
# @!method advisory_unlocked(column: _advisory_lockable_column)
|
|
86
86
|
# @!scope class
|
|
87
87
|
# @param column [String, Symbol] column values to Advisory Lock against
|
|
88
88
|
# @return [ActiveRecord::Relation]
|
|
89
|
-
scope :advisory_unlocked, ->(column:
|
|
89
|
+
scope :advisory_unlocked, ->(column: _advisory_lockable_column) { joins_advisory_locks(column: column).where(pg_locks: { locktype: nil }) }
|
|
90
90
|
|
|
91
91
|
# Find records that have an advisory lock on them.
|
|
92
|
-
# @!method advisory_locked(column:
|
|
92
|
+
# @!method advisory_locked(column: _advisory_lockable_column)
|
|
93
93
|
# @!scope class
|
|
94
94
|
# @param column [String, Symbol] column values to Advisory Lock against
|
|
95
95
|
# @return [ActiveRecord::Relation]
|
|
96
|
-
scope :advisory_locked, ->(column:
|
|
96
|
+
scope :advisory_locked, ->(column: _advisory_lockable_column) { joins_advisory_locks(column: column).where.not(pg_locks: { locktype: nil }) }
|
|
97
97
|
|
|
98
98
|
# Find records with advisory locks owned by the current Postgres
|
|
99
99
|
# session/connection.
|
|
100
|
-
# @!method advisory_locked(column:
|
|
100
|
+
# @!method advisory_locked(column: _advisory_lockable_column)
|
|
101
101
|
# @!scope class
|
|
102
102
|
# @param column [String, Symbol] column values to Advisory Lock against
|
|
103
103
|
# @return [ActiveRecord::Relation]
|
|
104
|
-
scope :owns_advisory_locked, ->(column:
|
|
104
|
+
scope :owns_advisory_locked, ->(column: _advisory_lockable_column) { joins_advisory_locks(column: column).where('"pg_locks"."pid" = pg_backend_pid()') }
|
|
105
105
|
|
|
106
106
|
# Whether an advisory lock should be acquired in the same transaction
|
|
107
107
|
# that created the record.
|
|
@@ -143,7 +143,7 @@ module GoodJob
|
|
|
143
143
|
# MyLockableRecord.order(created_at: :asc).limit(2).with_advisory_lock do |record|
|
|
144
144
|
# do_something_with record
|
|
145
145
|
# end
|
|
146
|
-
def with_advisory_lock(column:
|
|
146
|
+
def with_advisory_lock(column: _advisory_lockable_column, function: advisory_lockable_function, unlock_session: false)
|
|
147
147
|
raise ArgumentError, "Must provide a block" unless block_given?
|
|
148
148
|
|
|
149
149
|
records = advisory_lock(column: column, function: function).to_a
|
|
@@ -154,13 +154,19 @@ module GoodJob
|
|
|
154
154
|
advisory_unlock_session
|
|
155
155
|
else
|
|
156
156
|
records.each do |record|
|
|
157
|
-
key = [table_name, record[
|
|
157
|
+
key = [table_name, record[_advisory_lockable_column]].join
|
|
158
158
|
record.advisory_unlock(key: key, function: advisory_unlockable_function(function))
|
|
159
159
|
end
|
|
160
160
|
end
|
|
161
161
|
end
|
|
162
162
|
end
|
|
163
163
|
|
|
164
|
+
# Allow advisory_lockable_column to be a `Concurrent::Delay`
|
|
165
|
+
def _advisory_lockable_column
|
|
166
|
+
column = advisory_lockable_column
|
|
167
|
+
column.respond_to?(:value) ? column.value : column
|
|
168
|
+
end
|
|
169
|
+
|
|
164
170
|
def supports_cte_materialization_specifiers?
|
|
165
171
|
return @_supports_cte_materialization_specifiers if defined?(@_supports_cte_materialization_specifiers)
|
|
166
172
|
|
|
@@ -308,7 +314,7 @@ module GoodJob
|
|
|
308
314
|
# Default Advisory Lock key
|
|
309
315
|
# @return [String]
|
|
310
316
|
def lockable_key
|
|
311
|
-
[self.class.table_name, self[self.class.
|
|
317
|
+
[self.class.table_name, self[self.class._advisory_lockable_column]].join
|
|
312
318
|
end
|
|
313
319
|
|
|
314
320
|
delegate :pg_or_jdbc_query, to: :class
|
data/lib/good_job/version.rb
CHANGED