with_advisory_lock 3.0.0 → 4.6.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 +5 -5
- data/.gitignore +2 -0
- data/.tool-versions +1 -0
- data/.travis.yml +27 -20
- data/Appraisals +22 -9
- data/CHANGELOG.md +122 -0
- data/README.md +90 -148
- data/gemfiles/activerecord_4.2.gemfile +19 -0
- data/gemfiles/{activerecord_4.0.gemfile → activerecord_5.0.gemfile} +3 -3
- data/gemfiles/{activerecord_4.1.gemfile → activerecord_5.1.gemfile} +3 -3
- data/gemfiles/{activerecord_edge.gemfile → activerecord_5.2.gemfile} +3 -4
- data/gemfiles/{activerecord_3.2.gemfile → activerecord_6.0.gemfile} +2 -2
- data/lib/with_advisory_lock/base.rb +18 -7
- data/lib/with_advisory_lock/concern.rb +19 -7
- data/lib/with_advisory_lock/database_adapter_support.rb +47 -3
- data/lib/with_advisory_lock/flock.rb +4 -2
- data/lib/with_advisory_lock/mysql.rb +5 -10
- data/lib/with_advisory_lock/mysql_no_nesting.rb +20 -0
- data/lib/with_advisory_lock/nested_advisory_lock_error.rb +1 -1
- data/lib/with_advisory_lock/postgresql.rb +15 -4
- data/lib/with_advisory_lock/version.rb +1 -1
- data/lib/with_advisory_lock.rb +3 -1
- data/test/lock_test.rb +9 -1
- data/test/minitest_helper.rb +0 -5
- data/test/nesting_test.rb +46 -13
- data/test/options_test.rb +64 -0
- data/test/parallelism_test.rb +5 -3
- data/test/shared_test.rb +131 -0
- data/test/transaction_test.rb +70 -0
- data/tests.sh +1 -1
- data/with_advisory_lock.gemspec +3 -4
- metadata +54 -60
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
describe 'transaction scoping' do
|
4
|
+
def supported?
|
5
|
+
env_db == :postgresql
|
6
|
+
end
|
7
|
+
|
8
|
+
describe 'not supported' do
|
9
|
+
before do
|
10
|
+
skip if supported?
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'raises an error when attempting to use transaction level locks' do
|
14
|
+
Tag.transaction do
|
15
|
+
exception = proc {
|
16
|
+
Tag.with_advisory_lock 'test', transaction: true do
|
17
|
+
raise 'should not get here'
|
18
|
+
end
|
19
|
+
}.must_raise ArgumentError
|
20
|
+
exception.message.must_include 'not supported'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'supported' do
|
26
|
+
before do
|
27
|
+
skip unless env_db == :postgresql
|
28
|
+
end
|
29
|
+
|
30
|
+
def pg_lock_count
|
31
|
+
ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM pg_locks WHERE locktype = 'advisory';").to_i
|
32
|
+
end
|
33
|
+
|
34
|
+
specify 'session locks release after the block executes' do
|
35
|
+
Tag.transaction do
|
36
|
+
pg_lock_count.must_equal 0
|
37
|
+
Tag.with_advisory_lock 'test' do
|
38
|
+
pg_lock_count.must_equal 1
|
39
|
+
end
|
40
|
+
pg_lock_count.must_equal 0
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
specify 'session locks release when transaction fails inside block' do
|
45
|
+
Tag.transaction do
|
46
|
+
pg_lock_count.must_equal 0
|
47
|
+
|
48
|
+
exception = proc {
|
49
|
+
Tag.with_advisory_lock 'test' do
|
50
|
+
Tag.connection.execute 'SELECT 1/0;'
|
51
|
+
end
|
52
|
+
}.must_raise ActiveRecord::StatementInvalid
|
53
|
+
exception.message.must_include 'division by zero'
|
54
|
+
|
55
|
+
pg_lock_count.must_equal 0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
specify 'transaction level locks hold until the transaction completes' do
|
60
|
+
Tag.transaction do
|
61
|
+
pg_lock_count.must_equal 0
|
62
|
+
Tag.with_advisory_lock 'test', transaction: true do
|
63
|
+
pg_lock_count.must_equal 1
|
64
|
+
end
|
65
|
+
pg_lock_count.must_equal 1
|
66
|
+
end
|
67
|
+
pg_lock_count.must_equal 0
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/tests.sh
CHANGED
data/with_advisory_lock.gemspec
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
lib = File.expand_path('../lib', __FILE__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'with_advisory_lock/version'
|
@@ -14,12 +13,12 @@ Gem::Specification.new do |gem|
|
|
14
13
|
gem.license = 'MIT'
|
15
14
|
|
16
15
|
gem.files = `git ls-files`.split($/)
|
17
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
16
|
gem.test_files = gem.files.grep(%r{^test/})
|
19
17
|
gem.require_paths = %w(lib)
|
18
|
+
gem.required_ruby_version = '>= 2.2.10'
|
19
|
+
|
20
|
+
gem.add_runtime_dependency 'activerecord', '>= 4.2'
|
20
21
|
|
21
|
-
gem.add_runtime_dependency 'activerecord', '>= 3.2'
|
22
|
-
gem.add_runtime_dependency 'thread_safe'
|
23
22
|
|
24
23
|
gem.add_development_dependency 'yard'
|
25
24
|
gem.add_development_dependency 'minitest'
|
metadata
CHANGED
@@ -1,125 +1,111 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: with_advisory_lock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
requirement: !ruby/object:Gem::Requirement
|
15
|
-
requirements:
|
16
|
-
- - '>='
|
17
|
-
- !ruby/object:Gem::Version
|
18
|
-
version: '3.2'
|
19
14
|
name: activerecord
|
20
|
-
prerelease: false
|
21
|
-
type: :runtime
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '3.2'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
15
|
requirement: !ruby/object:Gem::Requirement
|
29
16
|
requirements:
|
30
|
-
- -
|
17
|
+
- - ">="
|
31
18
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
33
|
-
name: thread_safe
|
34
|
-
prerelease: false
|
19
|
+
version: '4.2'
|
35
20
|
type: :runtime
|
21
|
+
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
|
-
- -
|
24
|
+
- - ">="
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
26
|
+
version: '4.2'
|
41
27
|
- !ruby/object:Gem::Dependency
|
28
|
+
name: yard
|
42
29
|
requirement: !ruby/object:Gem::Requirement
|
43
30
|
requirements:
|
44
|
-
- -
|
31
|
+
- - ">="
|
45
32
|
- !ruby/object:Gem::Version
|
46
33
|
version: '0'
|
47
|
-
name: yard
|
48
|
-
prerelease: false
|
49
34
|
type: :development
|
35
|
+
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
|
-
- -
|
38
|
+
- - ">="
|
53
39
|
- !ruby/object:Gem::Version
|
54
40
|
version: '0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
56
43
|
requirement: !ruby/object:Gem::Requirement
|
57
44
|
requirements:
|
58
|
-
- -
|
45
|
+
- - ">="
|
59
46
|
- !ruby/object:Gem::Version
|
60
47
|
version: '0'
|
61
|
-
name: minitest
|
62
|
-
prerelease: false
|
63
48
|
type: :development
|
49
|
+
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
|
-
- -
|
52
|
+
- - ">="
|
67
53
|
- !ruby/object:Gem::Version
|
68
54
|
version: '0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest-great_expectations
|
70
57
|
requirement: !ruby/object:Gem::Requirement
|
71
58
|
requirements:
|
72
|
-
- -
|
59
|
+
- - ">="
|
73
60
|
- !ruby/object:Gem::Version
|
74
61
|
version: '0'
|
75
|
-
name: minitest-great_expectations
|
76
|
-
prerelease: false
|
77
62
|
type: :development
|
63
|
+
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
|
-
- -
|
66
|
+
- - ">="
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '0'
|
83
69
|
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest-reporters
|
84
71
|
requirement: !ruby/object:Gem::Requirement
|
85
72
|
requirements:
|
86
|
-
- -
|
73
|
+
- - ">="
|
87
74
|
- !ruby/object:Gem::Version
|
88
75
|
version: '0'
|
89
|
-
name: minitest-reporters
|
90
|
-
prerelease: false
|
91
76
|
type: :development
|
77
|
+
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
|
-
- -
|
80
|
+
- - ">="
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: '0'
|
97
83
|
- !ruby/object:Gem::Dependency
|
84
|
+
name: mocha
|
98
85
|
requirement: !ruby/object:Gem::Requirement
|
99
86
|
requirements:
|
100
|
-
- -
|
87
|
+
- - ">="
|
101
88
|
- !ruby/object:Gem::Version
|
102
89
|
version: '0'
|
103
|
-
name: mocha
|
104
|
-
prerelease: false
|
105
90
|
type: :development
|
91
|
+
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
|
-
- -
|
94
|
+
- - ">="
|
109
95
|
- !ruby/object:Gem::Version
|
110
96
|
version: '0'
|
111
97
|
- !ruby/object:Gem::Dependency
|
98
|
+
name: appraisal
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
100
|
requirements:
|
114
|
-
- -
|
101
|
+
- - ">="
|
115
102
|
- !ruby/object:Gem::Version
|
116
103
|
version: '0'
|
117
|
-
name: appraisal
|
118
|
-
prerelease: false
|
119
104
|
type: :development
|
105
|
+
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
107
|
requirements:
|
122
|
-
- -
|
108
|
+
- - ">="
|
123
109
|
- !ruby/object:Gem::Version
|
124
110
|
version: '0'
|
125
111
|
description: Advisory locking for ActiveRecord
|
@@ -129,23 +115,27 @@ executables: []
|
|
129
115
|
extensions: []
|
130
116
|
extra_rdoc_files: []
|
131
117
|
files:
|
132
|
-
- .gitignore
|
133
|
-
- .
|
118
|
+
- ".gitignore"
|
119
|
+
- ".tool-versions"
|
120
|
+
- ".travis.yml"
|
134
121
|
- Appraisals
|
122
|
+
- CHANGELOG.md
|
135
123
|
- Gemfile
|
136
124
|
- LICENSE.txt
|
137
125
|
- README.md
|
138
126
|
- Rakefile
|
139
|
-
- gemfiles/
|
140
|
-
- gemfiles/
|
141
|
-
- gemfiles/
|
142
|
-
- gemfiles/
|
127
|
+
- gemfiles/activerecord_4.2.gemfile
|
128
|
+
- gemfiles/activerecord_5.0.gemfile
|
129
|
+
- gemfiles/activerecord_5.1.gemfile
|
130
|
+
- gemfiles/activerecord_5.2.gemfile
|
131
|
+
- gemfiles/activerecord_6.0.gemfile
|
143
132
|
- lib/with_advisory_lock.rb
|
144
133
|
- lib/with_advisory_lock/base.rb
|
145
134
|
- lib/with_advisory_lock/concern.rb
|
146
135
|
- lib/with_advisory_lock/database_adapter_support.rb
|
147
136
|
- lib/with_advisory_lock/flock.rb
|
148
137
|
- lib/with_advisory_lock/mysql.rb
|
138
|
+
- lib/with_advisory_lock/mysql_no_nesting.rb
|
149
139
|
- lib/with_advisory_lock/nested_advisory_lock_error.rb
|
150
140
|
- lib/with_advisory_lock/postgresql.rb
|
151
141
|
- lib/with_advisory_lock/version.rb
|
@@ -154,33 +144,35 @@ files:
|
|
154
144
|
- test/lock_test.rb
|
155
145
|
- test/minitest_helper.rb
|
156
146
|
- test/nesting_test.rb
|
147
|
+
- test/options_test.rb
|
157
148
|
- test/parallelism_test.rb
|
149
|
+
- test/shared_test.rb
|
158
150
|
- test/test_models.rb
|
159
151
|
- test/thread_test.rb
|
152
|
+
- test/transaction_test.rb
|
160
153
|
- tests.sh
|
161
154
|
- with_advisory_lock.gemspec
|
162
155
|
homepage: https://github.com/mceachen/with_advisory_lock
|
163
156
|
licenses:
|
164
157
|
- MIT
|
165
158
|
metadata: {}
|
166
|
-
post_install_message:
|
159
|
+
post_install_message:
|
167
160
|
rdoc_options: []
|
168
161
|
require_paths:
|
169
162
|
- lib
|
170
163
|
required_ruby_version: !ruby/object:Gem::Requirement
|
171
164
|
requirements:
|
172
|
-
- -
|
165
|
+
- - ">="
|
173
166
|
- !ruby/object:Gem::Version
|
174
|
-
version:
|
167
|
+
version: 2.2.10
|
175
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
176
169
|
requirements:
|
177
|
-
- -
|
170
|
+
- - ">="
|
178
171
|
- !ruby/object:Gem::Version
|
179
172
|
version: '0'
|
180
173
|
requirements: []
|
181
|
-
|
182
|
-
|
183
|
-
signing_key:
|
174
|
+
rubygems_version: 3.0.3
|
175
|
+
signing_key:
|
184
176
|
specification_version: 4
|
185
177
|
summary: Advisory locking for ActiveRecord
|
186
178
|
test_files:
|
@@ -189,7 +181,9 @@ test_files:
|
|
189
181
|
- test/lock_test.rb
|
190
182
|
- test/minitest_helper.rb
|
191
183
|
- test/nesting_test.rb
|
184
|
+
- test/options_test.rb
|
192
185
|
- test/parallelism_test.rb
|
186
|
+
- test/shared_test.rb
|
193
187
|
- test/test_models.rb
|
194
188
|
- test/thread_test.rb
|
195
|
-
|
189
|
+
- test/transaction_test.rb
|