redlock 0.2.0 → 0.2.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/Gemfile.lock +4 -4
- data/Makefile +4 -0
- data/README.md +5 -5
- data/clean_docker.sh +26 -0
- data/docker-compose.yml +27 -0
- data/lib/redlock/client.rb +4 -2
- data/lib/redlock/version.rb +1 -1
- data/redlock.gemspec +1 -1
- data/spec/client_spec.rb +8 -3
- metadata +12 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e34b717846f5f8faa005ab9a8d5cac3c3ea865e
|
4
|
+
data.tar.gz: f7a615768b2fc2746d16128122a69259c252b78f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ced9a5040b0fe2b0d2ea947732495c06a647b8df04cb5cda89b3f82731d76f79446afda7dd86d21b6705c67f6ccfc42f5c44fa16b753d09abd242d590172fe63
|
7
|
+
data.tar.gz: 0ce3c67e5f9b81d2f8381daf9708c728f8ceaa6a3367e3153586c4621748ffcef717595333b184e7da08932be7e023dfab549b78040d064b079d762a173e800b
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
redlock (0.2.
|
5
|
-
redis (
|
4
|
+
redlock (0.2.1)
|
5
|
+
redis (>= 3.0.0, < 5.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
@@ -17,7 +17,7 @@ GEM
|
|
17
17
|
docile (1.1.5)
|
18
18
|
json (2.0.3)
|
19
19
|
rake (11.3.0)
|
20
|
-
redis (
|
20
|
+
redis (4.0.1)
|
21
21
|
rspec (3.5.0)
|
22
22
|
rspec-core (~> 3.5.0)
|
23
23
|
rspec-expectations (~> 3.5.0)
|
@@ -51,4 +51,4 @@ DEPENDENCIES
|
|
51
51
|
rspec (~> 3, >= 3.0.0)
|
52
52
|
|
53
53
|
BUNDLED WITH
|
54
|
-
1.
|
54
|
+
1.16.0
|
data/Makefile
ADDED
data/README.md
CHANGED
@@ -129,22 +129,22 @@ It's possible to customize the retry logic providing the following options:
|
|
129
129
|
retry_count: 3,
|
130
130
|
retry_delay: 200, # milliseconds
|
131
131
|
retry_jitter: 50, # milliseconds
|
132
|
-
|
132
|
+
redis_timeout: 0.1 # seconds
|
133
133
|
})
|
134
134
|
```
|
135
135
|
|
136
|
-
For more information you can check [documentation](
|
136
|
+
For more information you can check [documentation](http://www.rubydoc.info/gems/redlock/Redlock%2FClient:initialize).
|
137
137
|
|
138
138
|
|
139
139
|
## Run tests
|
140
140
|
|
141
|
-
Make sure you have
|
141
|
+
Make sure you have [docker installed](https://docs.docker.com/engine/installation/).
|
142
142
|
|
143
|
-
$
|
143
|
+
$ make
|
144
144
|
|
145
145
|
## Disclaimer
|
146
146
|
|
147
|
-
This code implements an algorithm which is currently a proposal, it was not formally analyzed. Make sure to understand how it works before using it in your production environments. You can see discussion about this approach at [reddit](http://www.reddit.com/r/programming/comments/2nt0nq/distributed_lock_using_redis_implemented_in_ruby/).
|
147
|
+
This code implements an algorithm which is currently a proposal, it was not formally analyzed. Make sure to understand how it works before using it in your production environments. You can see discussion about this approach at [reddit](http://www.reddit.com/r/programming/comments/2nt0nq/distributed_lock_using_redis_implemented_in_ruby/) and also the [Antirez answers](http://antirez.com/news/101) for some critics.
|
148
148
|
|
149
149
|
## Contributing
|
150
150
|
|
data/clean_docker.sh
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
EXITED=$(docker ps -q -f status=exited)
|
2
|
+
DANGLING=$(docker images -q -f "dangling=true")
|
3
|
+
DANGLING_VOLUME=$(docker volume ls -qf "dangling=true")
|
4
|
+
|
5
|
+
if [ "$1" == "--dry-run" ]; then
|
6
|
+
echo "==> Would stop containers:"
|
7
|
+
echo $EXITED
|
8
|
+
echo "==> And images:"
|
9
|
+
echo $DANGLING
|
10
|
+
else
|
11
|
+
if [ -n "$EXITED" ]; then
|
12
|
+
docker rm $EXITED
|
13
|
+
else
|
14
|
+
echo "No containers to remove."
|
15
|
+
fi
|
16
|
+
if [ -n "$DANGLING" ]; then
|
17
|
+
docker rmi $DANGLING
|
18
|
+
else
|
19
|
+
echo "No images to remove."
|
20
|
+
fi
|
21
|
+
if [ -n "$DANGLING_VOLUME" ]; then
|
22
|
+
docker volume rm $DANGLING_VOLUME
|
23
|
+
else
|
24
|
+
echo "No volumes to remove."
|
25
|
+
fi
|
26
|
+
fi
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
version: '2'
|
2
|
+
services:
|
3
|
+
test:
|
4
|
+
image: ruby
|
5
|
+
volumes:
|
6
|
+
- .:/redlock
|
7
|
+
working_dir: /redlock
|
8
|
+
command: bash -c "bundle install && rspec"
|
9
|
+
environment:
|
10
|
+
- REDIS1_HOST=redis1.local.com
|
11
|
+
- REDIS1_PORT=6379
|
12
|
+
- REDIS2_HOST=redis2.local.com
|
13
|
+
- REDIS2_PORT=6379
|
14
|
+
- DEFAULT_REDIS_HOST=redis1.local.com
|
15
|
+
- DEFAULT_REDIS_PORT=6379
|
16
|
+
links:
|
17
|
+
- redis1:redis1.local.com
|
18
|
+
- redis2:redis2.local.com
|
19
|
+
depends_on:
|
20
|
+
- redis1
|
21
|
+
- redis2
|
22
|
+
|
23
|
+
redis1:
|
24
|
+
image: redis
|
25
|
+
redis2:
|
26
|
+
image: redis
|
27
|
+
|
data/lib/redlock/client.rb
CHANGED
@@ -3,7 +3,9 @@ require 'securerandom'
|
|
3
3
|
|
4
4
|
module Redlock
|
5
5
|
class Client
|
6
|
-
|
6
|
+
DEFAULT_REDIS_HOST = ENV["DEFAULT_REDIS_HOST"] || "localhost"
|
7
|
+
DEFAULT_REDIS_PORT = ENV["DEFAULT_REDIS_PORT"] || "6379"
|
8
|
+
DEFAULT_REDIS_URLS = ["redis://#{DEFAULT_REDIS_HOST}:#{DEFAULT_REDIS_PORT}"]
|
7
9
|
DEFAULT_REDIS_TIMEOUT = 0.1
|
8
10
|
DEFAULT_RETRY_COUNT = 3
|
9
11
|
DEFAULT_RETRY_DELAY = 200
|
@@ -27,7 +29,7 @@ module Redlock
|
|
27
29
|
RedisInstance.new(server)
|
28
30
|
end
|
29
31
|
end
|
30
|
-
@quorum = servers.length / 2 + 1
|
32
|
+
@quorum = (servers.length / 2).to_i + 1
|
31
33
|
@retry_count = options[:retry_count] || DEFAULT_RETRY_COUNT
|
32
34
|
@retry_delay = options[:retry_delay] || DEFAULT_RETRY_DELAY
|
33
35
|
@retry_jitter = options[:retry_jitter] || DEFAULT_RETRY_JITTER
|
data/lib/redlock/version.rb
CHANGED
data/redlock.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency 'redis', '
|
21
|
+
spec.add_dependency 'redis', '>= 3.0.0', '< 5.0'
|
22
22
|
|
23
23
|
spec.add_development_dependency "coveralls", "~> 0.8.13"
|
24
24
|
spec.add_development_dependency 'rake', '~> 11.1', '>= 11.1.2'
|
data/spec/client_spec.rb
CHANGED
@@ -7,17 +7,22 @@ RSpec.describe Redlock::Client do
|
|
7
7
|
let(:lock_manager) { Redlock::Client.new(Redlock::Client::DEFAULT_REDIS_URLS, lock_manager_opts) }
|
8
8
|
let(:resource_key) { SecureRandom.hex(3) }
|
9
9
|
let(:ttl) { 1000 }
|
10
|
+
let(:redis1_host) { ENV["REDIS1_HOST"] || "localhost" }
|
11
|
+
let(:redis1_port) { ENV["REDIS1_PORT"] || "6379" }
|
12
|
+
let(:redis2_host) { ENV["REDIS2_HOST"] || "127.0.0.1" }
|
13
|
+
let(:redis2_port) { ENV["REDIS2_PORT"] || "6379" }
|
10
14
|
|
11
15
|
describe 'initialize' do
|
12
16
|
it 'accepts both redis URLs and Redis objects' do
|
13
|
-
|
17
|
+
print redis1_host
|
18
|
+
servers = [ "redis://#{redis1_host}:#{redis1_port}", Redis.new(url: "redis://#{redis2_host}:#{redis2_port}") ]
|
14
19
|
redlock = Redlock::Client.new(servers)
|
15
20
|
|
16
21
|
redlock_servers = redlock.instance_variable_get(:@servers).map do |s|
|
17
|
-
s.instance_variable_get(:@redis).
|
22
|
+
s.instance_variable_get(:@redis).connection[:host]
|
18
23
|
end
|
19
24
|
|
20
|
-
expect(redlock_servers).to match_array(
|
25
|
+
expect(redlock_servers).to match_array([redis1_host, redis2_host])
|
21
26
|
end
|
22
27
|
end
|
23
28
|
|
metadata
CHANGED
@@ -1,35 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redlock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leandro Moreira
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '3'
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: 3.0.0
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '5.0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '3'
|
30
27
|
- - ">="
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: 3.0.0
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '5.0'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: coveralls
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,8 +98,11 @@ files:
|
|
98
98
|
- Gemfile
|
99
99
|
- Gemfile.lock
|
100
100
|
- LICENSE
|
101
|
+
- Makefile
|
101
102
|
- README.md
|
102
103
|
- Rakefile
|
104
|
+
- clean_docker.sh
|
105
|
+
- docker-compose.yml
|
103
106
|
- lib/redlock.rb
|
104
107
|
- lib/redlock/client.rb
|
105
108
|
- lib/redlock/testing.rb
|
@@ -128,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
131
|
version: '0'
|
129
132
|
requirements: []
|
130
133
|
rubyforge_project:
|
131
|
-
rubygems_version: 2.
|
134
|
+
rubygems_version: 2.5.1
|
132
135
|
signing_key:
|
133
136
|
specification_version: 4
|
134
137
|
summary: Distributed lock using Redis written in Ruby.
|