suo 0.3.2 → 0.3.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
- SHA1:
3
- metadata.gz: 20c696b1f0967a3f064e80bb245266608465aa17
4
- data.tar.gz: f5da2c07382f9a0ce9779e13cd508d0044d8f4c1
2
+ SHA256:
3
+ metadata.gz: 497f8d8c0021138da005c4ec8283a0f71d0b82120af2ffdf6bf0530c199c36b5
4
+ data.tar.gz: aae8820a1c19d314d1154960a7e09157b8094d89a13a9ae72d3842b332b7460f
5
5
  SHA512:
6
- metadata.gz: 8651a6d683fea5f48b89fbd1d7d101b8627a7475bc9ac17dfe4d1c48c2725a4d28428661ab05682b13721c694343960574cfde5511ce4f1e79812ec078b2a4f6
7
- data.tar.gz: 274fe4e9a3d2048e33276502c15fe9cee6e33e2fbaeec59e70845e8a0783d1df6cbf5cbab7883e9cc2b3be36d885bb03f8cae0276537f4e5bb83134555cd67be
6
+ metadata.gz: c20da62ec8742cac1a622f54d841564921522ddda67cbc4cd2e9609aaa5440a392803e547bb4c19cab8243c70a244768935b0498e0bfdce2b59b92bb845c9079
7
+ data.tar.gz: de71d8bc43ad0396ec9d60ab76bc63836fcc75a8d0edb89a4b1de45d72dc0d2449ffd9a09cc3fe7b81d64ab7d3324e6f30df5f8dd1620f232d0886e28c9865ec
@@ -1,7 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.0
4
- - 2.3.1
3
+ - 2.2.6
4
+ - 2.3.7
5
+ - 2.4.4
6
+ - 2.5.1
5
7
  services:
6
8
  - memcached
7
9
  - redis-server
@@ -1,3 +1,8 @@
1
+ ## 0.3.3
2
+
3
+ - Default TTL for keys to allow for short-lived locking keys (thanks to Ian Remillard) without leaking memory.
4
+ - Vastly improve initial lock acquisition, especially on Redis (thanks to Jeremy Wadscak).
5
+
1
6
  ## 0.3.2
2
7
 
3
8
  - Custom lock tokens (thanks to avokhmin).
data/README.md CHANGED
@@ -72,6 +72,15 @@ suo.lock do |token|
72
72
  end
73
73
  ```
74
74
 
75
+ ### Time To Live
76
+
77
+ ```ruby
78
+ Suo::Client::Redis.new("bar_resource", ttl: 60) #ttl in seconds
79
+ ```
80
+
81
+ A key representing a set of lockable resources is removed once the last resource lock is released and the `ttl` time runs out. When another lock is acquired and the key has been removed the key has to be recreated.
82
+
83
+
75
84
  ## TODO
76
85
  - more race condition tests
77
86
 
@@ -5,7 +5,8 @@ module Suo
5
5
  acquisition_timeout: 0.1,
6
6
  acquisition_delay: 0.01,
7
7
  stale_lock_expiration: 3600,
8
- resources: 1
8
+ resources: 1,
9
+ ttl: 60,
9
10
  }.freeze
10
11
 
11
12
  BLANK_STR = "".freeze
@@ -55,16 +56,13 @@ module Suo
55
56
  retry_with_timeout do
56
57
  val, cas = get
57
58
 
58
- if val.nil?
59
- initial_set
60
- next
61
- end
59
+ cas = initial_set if val.nil?
62
60
 
63
61
  cleared_locks = deserialize_and_clear_locks(val)
64
62
 
65
63
  refresh_lock(cleared_locks, token)
66
64
 
67
- break if set(serialize_locks(cleared_locks), cas)
65
+ break if set(serialize_locks(cleared_locks), cas, expire: cleared_locks.empty?)
68
66
  end
69
67
  end
70
68
 
@@ -81,7 +79,7 @@ module Suo
81
79
  acquisition_lock = remove_lock(cleared_locks, token)
82
80
 
83
81
  break unless acquisition_lock
84
- break if set(serialize_locks(cleared_locks), cas)
82
+ break if set(serialize_locks(cleared_locks), cas, expire: cleared_locks.empty?)
85
83
  end
86
84
  rescue LockClientError => _ # rubocop:disable Lint/HandleExceptions
87
85
  # ignore - assume success due to optimistic locking
@@ -101,10 +99,7 @@ module Suo
101
99
  retry_with_timeout do
102
100
  val, cas = get
103
101
 
104
- if val.nil?
105
- initial_set
106
- next
107
- end
102
+ cas = initial_set if val.nil?
108
103
 
109
104
  cleared_locks = deserialize_and_clear_locks(val)
110
105
 
@@ -16,12 +16,18 @@ module Suo
16
16
  @client.get_cas(@key)
17
17
  end
18
18
 
19
- def set(newval, cas)
20
- @client.set_cas(@key, newval, cas)
19
+ def set(newval, cas, expire: false)
20
+ if expire
21
+ @client.set_cas(@key, newval, cas, @options[:ttl])
22
+ else
23
+ @client.set_cas(@key, newval, cas)
24
+ end
21
25
  end
22
26
 
23
27
  def initial_set(val = BLANK_STR)
24
28
  @client.set(@key, val)
29
+ _val, cas = @client.get_cas(@key)
30
+ cas
25
31
  end
26
32
  end
27
33
  end
@@ -18,9 +18,13 @@ module Suo
18
18
  [@client.get(@key), nil]
19
19
  end
20
20
 
21
- def set(newval, _)
21
+ def set(newval, _, expire: false)
22
22
  ret = @client.multi do |multi|
23
- multi.set(@key, newval)
23
+ if expire
24
+ multi.setex(@key, @options[:ttl], newval)
25
+ else
26
+ multi.set(@key, newval)
27
+ end
24
28
  end
25
29
 
26
30
  ret && ret[0] == OK_STR
@@ -35,7 +39,8 @@ module Suo
35
39
  end
36
40
 
37
41
  def initial_set(val = BLANK_STR)
38
- @client.set(@key, val)
42
+ set(val, nil)
43
+ nil
39
44
  end
40
45
  end
41
46
  end
@@ -1,3 +1,3 @@
1
1
  module Suo
2
- VERSION = "0.3.2".freeze
2
+ VERSION = "0.3.3".freeze
3
3
  end
@@ -16,7 +16,6 @@ Gem::Specification.new do |spec|
16
16
 
17
17
  spec.files = `git ls-files -z`.split("\x0")
18
18
  spec.bindir = "bin"
19
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
20
  spec.require_paths = ["lib"]
22
21
 
@@ -28,7 +27,7 @@ Gem::Specification.new do |spec|
28
27
 
29
28
  spec.add_development_dependency "bundler", "~> 1.5"
30
29
  spec.add_development_dependency "rake", "~> 10.0"
31
- spec.add_development_dependency "rubocop", "~> 0.30.0"
30
+ spec.add_development_dependency "rubocop", "~> 0.49.0"
32
31
  spec.add_development_dependency "minitest", "~> 5.5.0"
33
32
  spec.add_development_dependency "codeclimate-test-reporter", "~> 0.4.7"
34
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: suo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Elser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-06 00:00:00.000000000 Z
11
+ date: 2018-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dalli
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.30.0
89
+ version: 0.49.0
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.30.0
96
+ version: 0.49.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: minitest
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -125,9 +125,7 @@ dependencies:
125
125
  description: Distributed locks (mutexes & semaphores) using Memcached or Redis.
126
126
  email:
127
127
  - nick.elser@gmail.com
128
- executables:
129
- - console
130
- - setup
128
+ executables: []
131
129
  extensions: []
132
130
  extra_rdoc_files: []
133
131
  files:
@@ -170,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
168
  version: '0'
171
169
  requirements: []
172
170
  rubyforge_project:
173
- rubygems_version: 2.5.1
171
+ rubygems_version: 2.7.6
174
172
  signing_key:
175
173
  specification_version: 4
176
174
  summary: Distributed locks (mutexes & semaphores) using Memcached or Redis.