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: 4937ef3a7fc3cc932e53c070779e4111f570003c
4
- data.tar.gz: ea8133464f2c73a36ca2688676908ece989dfc06
3
+ metadata.gz: c1eea1d62a00244a155a4d9f7502ade102188875
4
+ data.tar.gz: 651af54cd59d0a4ad7a706e4e8ef99153ea70972
5
5
  SHA512:
6
- metadata.gz: 64e5152770347cf2cbcfa4f74f0b60e6c882b74bf9239bd5b0da689dbbfddad25e3efb9275f5c9b5079d1da74e60e73ba0b509b3edc0d078cdc588187a8c6f06
7
- data.tar.gz: 16afb06e26f1f7c7dc85e3ba0850fc3183feb42eaa744d1492596e1c981402733e7463c8b769dbc101458f325f57748691df4a5c35017585ef0ee4652bc072fe
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
- LockPair = Struct.new(:object, :lock_info, :status)
8
+ attr_reader :objects, :options, :redlock_pool
9
9
 
10
- attr_reader :objects, :options, :pool
11
-
12
- def initialize(objects, options, pool)
10
+ def initialize(objects, options, redlock_pool)
13
11
  @objects = objects
14
12
  @options = options
15
- @pool = pool
13
+ @redlock_pool = redlock_pool
14
+
15
+ set_default_options
16
+ end
16
17
 
17
- init_options
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
- lock_pairs = []
26
+ locked_objects = []
22
27
 
23
- start_time = (Time.now.to_f * 1000).to_i
28
+ start_time = time_now
24
29
  @objects.each do |object|
25
- @pool.with do |redlock|
26
- lock_info = redlock.lock(build_key_for(object), @options[:ttl])
27
- lock_pairs << LockPair.new(object, lock_info)
28
- end
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 = (Time.now.to_f * 1000).to_i
35
+ end_time = time_now
31
36
 
32
- separated_pairs = separate_expired_pairs(lock_pairs, end_time - start_time)
37
+ separated_expired_objects = separate_expired_objects(locked_objects, end_time - start_time)
33
38
 
34
39
  begin
35
- separated_pairs[:valid].map(&:object)
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
- # Release the all acquired locks
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 init_options
47
- @options[:key_prefix] ||= DEFAULT_KEY_PREFIX
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
- def build_key_for(object)
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 separate_expired_pairs(lock_pairs, elapsed)
70
- expired_pairs = []
71
- valid_pairs = []
72
-
73
- lock_pairs.each do |lock_pair|
74
- if lock_pair.lock_info && ((lock_pair.lock_info[:validity] - elapsed) > (@options[:min_validity]))
75
- lock_pair.status = :valid
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
- lock_pair.status= :expired
79
- expired_pairs << lock_pair
63
+ expired_locked_objects << locked_object
80
64
  end
81
65
  end
82
66
 
83
- { valid: valid_pairs, expired: expired_pairs }
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,3 +1,3 @@
1
1
  module RedlockForCollection
2
- VERSION = '0.1.2'.freeze
2
+ VERSION = '0.1.3'.freeze
3
3
  end
@@ -1,6 +1,7 @@
1
- require_relative 'redlock_for_collection/version'
2
- require_relative 'redlock_for_collection/configuration'
3
- require_relative 'redlock_for_collection/collection'
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.2
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-04-28 00:00:00.000000000 Z
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