redlock_for_collection 0.1.2 → 0.1.3

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 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