redlock_for_collection 0.1.2 → 0.1.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
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1eea1d62a00244a155a4d9f7502ade102188875
|
4
|
+
data.tar.gz: 651af54cd59d0a4ad7a706e4e8ef99153ea70972
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe231c2d1455388728ce33968a4dee6d1f67cb9a7a7fc53e1fc3d51a9fbb07ac9b1c968fc6c16a0cdba46e9b61ed1f9aa139494b89ee49d830a388c5b33f878b
|
7
|
+
data.tar.gz: 52af4480ba1074f2ae4f44e9ea9720aead773628216dcb769dc29e5c193d75ec532892d62be5ac4b8b045c3be95061eba34d640a1bf0963f3fc38b1357ddf25c
|
@@ -5,82 +5,66 @@ module RedlockForCollection
|
|
5
5
|
DEFAULT_KEY_METHOD = 'key'.freeze
|
6
6
|
DEFAULT_KEY_PREFIX = 'prefix'.freeze
|
7
7
|
|
8
|
-
|
8
|
+
attr_reader :objects, :options, :redlock_pool
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
def initialize(objects, options, pool)
|
10
|
+
def initialize(objects, options, redlock_pool)
|
13
11
|
@objects = objects
|
14
12
|
@options = options
|
15
|
-
@
|
13
|
+
@redlock_pool = redlock_pool
|
14
|
+
|
15
|
+
set_default_options
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
+
def set_default_options
|
19
|
+
@options[:key_prefix] ||= DEFAULT_KEY_PREFIX
|
20
|
+
@options[:key_method] ||= DEFAULT_KEY_METHOD
|
21
|
+
@options[:min_validity] ||= DEFAULT_MIN_VALIDITY
|
22
|
+
@options[:ttl] ||= DEFAULT_TTL
|
18
23
|
end
|
19
24
|
|
20
25
|
def lock(&block)
|
21
|
-
|
26
|
+
locked_objects = []
|
22
27
|
|
23
|
-
start_time =
|
28
|
+
start_time = time_now
|
24
29
|
@objects.each do |object|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
30
|
+
locked_object = LockedObject.new(object, @options , @redlock_pool)
|
31
|
+
locked_object.lock
|
32
|
+
|
33
|
+
locked_objects << locked_object
|
29
34
|
end
|
30
|
-
end_time =
|
35
|
+
end_time = time_now
|
31
36
|
|
32
|
-
|
37
|
+
separated_expired_objects = separate_expired_objects(locked_objects, end_time - start_time)
|
33
38
|
|
34
39
|
begin
|
35
|
-
|
36
|
-
separated_pairs[:expired].map(&:object)
|
37
|
-
block.yield(separated_pairs[:valid].map(&:object), separated_pairs[:expired].map(&:object))
|
40
|
+
block.yield(separated_expired_objects[:valid].map(&:object), separated_expired_objects[:expired].map(&:object))
|
38
41
|
ensure
|
39
|
-
|
40
|
-
unlock(lock_pairs)
|
42
|
+
locked_objects.each { |locked_object| locked_object.unlock }
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
46
|
protected
|
45
47
|
|
46
|
-
def
|
47
|
-
|
48
|
-
@options[:key_method] ||= DEFAULT_KEY_METHOD
|
49
|
-
@options[:min_validity] ||= DEFAULT_MIN_VALIDITY
|
50
|
-
@options[:ttl] ||= DEFAULT_TTL
|
51
|
-
end
|
52
|
-
|
53
|
-
# @param lock_pairs [Array<LockPair>]
|
54
|
-
def unlock(lock_pairs)
|
55
|
-
@pool.with do |redlock|
|
56
|
-
lock_pairs.each do |lock_pair|
|
57
|
-
redlock.unlock(lock_pair.lock_info) if lock_pair.lock_info
|
58
|
-
end
|
59
|
-
end
|
48
|
+
def time_now
|
49
|
+
(Time.now.to_f * 1000).to_i
|
60
50
|
end
|
61
51
|
|
62
|
-
|
63
|
-
(@options[:key_prefix]) + object.send(@options[:key_method]).to_s
|
64
|
-
end
|
65
|
-
|
66
|
-
# @param lock_pairs [Array<LockPair>]
|
52
|
+
# @param locked_objects [Array<LockedObject>]
|
67
53
|
# @param elapsed [Integer]
|
68
54
|
# @return [Hash]
|
69
|
-
def
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
if
|
75
|
-
|
76
|
-
valid_pairs << lock_pair
|
55
|
+
def separate_expired_objects(locked_objects, elapsed)
|
56
|
+
expired_locked_objects = []
|
57
|
+
valid_locked_objects = []
|
58
|
+
|
59
|
+
locked_objects.each do |locked_object|
|
60
|
+
if locked_object.valid?(elapsed)
|
61
|
+
valid_locked_objects << locked_object
|
77
62
|
else
|
78
|
-
|
79
|
-
expired_pairs << lock_pair
|
63
|
+
expired_locked_objects << locked_object
|
80
64
|
end
|
81
65
|
end
|
82
66
|
|
83
|
-
{ valid:
|
67
|
+
{ valid: valid_locked_objects, expired: expired_locked_objects }
|
84
68
|
end
|
85
69
|
|
86
70
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module RedlockForCollection
|
2
|
+
class LockedObject
|
3
|
+
attr_reader :object,
|
4
|
+
:lock_info,
|
5
|
+
:redlock_pool,
|
6
|
+
:key
|
7
|
+
|
8
|
+
def initialize(object, options, redlock_pool)
|
9
|
+
@object = object
|
10
|
+
@options = options
|
11
|
+
@redlock_pool = redlock_pool
|
12
|
+
build_key
|
13
|
+
end
|
14
|
+
|
15
|
+
def lock
|
16
|
+
@redlock_pool.with do |redlock|
|
17
|
+
@lock_info = redlock.lock(@key, @options[:ttl])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def unlock
|
22
|
+
if @lock_info
|
23
|
+
@redlock_pool.with do |redlock|
|
24
|
+
redlock.unlock(@lock_info)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def expired?(elapsed_time)
|
30
|
+
!valid?(elapsed_time)
|
31
|
+
end
|
32
|
+
|
33
|
+
def valid?(elapsed_time)
|
34
|
+
@lock_info && ((@lock_info[:validity] - elapsed_time) > (@options[:min_validity]))
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def build_key
|
40
|
+
@key = (@options[:key_prefix]) + @object.send(@options[:key_method]).to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require 'redlock_for_collection/version'
|
2
|
+
require 'redlock_for_collection/configuration'
|
3
|
+
require 'redlock_for_collection/locked_object'
|
4
|
+
require 'redlock_for_collection/collection'
|
4
5
|
|
5
6
|
module RedlockForCollection
|
6
7
|
class Manager
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redlock_for_collection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CoolElvis
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- lib/redlock_for_collection.rb
|
88
88
|
- lib/redlock_for_collection/collection.rb
|
89
89
|
- lib/redlock_for_collection/configuration.rb
|
90
|
+
- lib/redlock_for_collection/locked_object.rb
|
90
91
|
- lib/redlock_for_collection/version.rb
|
91
92
|
- redlock_for_collection.gemspec
|
92
93
|
homepage: https://github.com/CoolElvis/redlock_for_collection
|