uncomplicated_mutex 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/uncomplicated_mutex.rb +38 -13
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9253fa85b32dc4ab8c5f27a02b005842fc64f9da
4
- data.tar.gz: 7afc45c5489ed54b5994174a813fb909688687a6
3
+ metadata.gz: ef209e4d08baa69dfded75606346ec2da70471de
4
+ data.tar.gz: da46ce0c406935be7ca4a472d7d9a33739b8d59e
5
5
  SHA512:
6
- metadata.gz: ab31143080b09789dcb5dc7f37b3be17c67be615e607310df5ea3788bdf5e69347021315b9dda2b9f9d9a6748ea42e374f5065ffb96f127ada2088ea10cbfde8
7
- data.tar.gz: 7656e966695b403fec1261a0d5efe2c1e7de460e94864b2fc7e8700ce000f2f32635530585c2a6ca68b31ceddb29919429bfd5e7e4f236f0c0a42aa7e8aa52fe
6
+ metadata.gz: 5cc35a073f8b4a114328323ae4da7b0d944cd905bf39220b23ef2fe2ccc4c67a846f5ba9683daebdb9e359f8d52794cfd216f4e1aea4b2da7b5833a6eaf5766f
7
+ data.tar.gz: ca51e08793f7496088a3523f34019b486f40a7462ac726bade21e56b232001567671d5893e2803a4d5dd7924ecae335e5ff559e468767de41823f950051fdd0b
@@ -12,12 +12,10 @@ class UncomplicatedMutex
12
12
  def initialize(obj, opts = {})
13
13
  @verbose = opts[:verbose]
14
14
  @timeout = opts[:timeout] || 300
15
- @fail_on_timeout = opts[:fail_on_timeout]
16
- @ticks = opts[:ticks] || 100
17
- @wait_tick = @timeout.to_f / @ticks.to_f
18
15
  @redis = opts[:redis] || Redis.new
19
16
  @lock_name = "lock:#{obj.class.name}:#{obj.id}".squeeze(":")
20
17
  @token = Digest::MD5.new.hexdigest("#{@lock_name}_#{Time.now.to_f}")
18
+ set_expiration_time
21
19
  end
22
20
 
23
21
  def acquire_mutex
@@ -25,6 +23,10 @@ class UncomplicatedMutex
25
23
  @redis.eval(LUA_ACQUIRE, [ @lock_name ], [ @timeout, @token ]) == 1
26
24
  end
27
25
 
26
+ def current_token_value
27
+ @redis.get(@lock_name)
28
+ end
29
+
28
30
  def destroy_mutex
29
31
  puts("Destroying the lock #{@lock_name}") if @verbose
30
32
  @redis.del(@lock_name)
@@ -39,13 +41,9 @@ class UncomplicatedMutex
39
41
  end
40
42
  end
41
43
 
42
- def overwrite_mutex
43
- puts("Replacing the lock #{@lock_name} with #{@token}") if @verbose
44
- @redis.set(@lock_name, @token)
45
- end
46
-
47
44
  def recurse_until_ready(depth = 1)
48
- return false if depth == @ticks
45
+ return false if time_has_expired
46
+ @initial_token = current_token_value if depth == 1
49
47
  wait_a_tick if depth > 1
50
48
  acquire_mutex || recurse_until_ready(depth + 1)
51
49
  end
@@ -55,9 +53,37 @@ class UncomplicatedMutex
55
53
  @redis.eval(LUA_RELEASE, [ @lock_name ], [ @token ])
56
54
  end
57
55
 
56
+ def same_token_as_before
57
+ new_token = current_token_value
58
+ if new_token == @initial_token
59
+ true
60
+ else
61
+ @initial_token = new_token
62
+ false
63
+ end
64
+ end
65
+
66
+ def set_expiration_time
67
+ @expiration_time = Time.now.to_i + @timeout
68
+ end
69
+
70
+ def time_has_expired
71
+ if Time.now.to_i > @expiration_time
72
+ if same_token_as_before
73
+ true
74
+ else
75
+ set_expiration_time
76
+ false
77
+ end
78
+ else
79
+ false
80
+ end
81
+ end
82
+
58
83
  def wait_a_tick
59
- puts("Sleeping #{@wait_tick} for the lock #{@lock_name} to become available") if @verbose
60
- sleep(@wait_tick)
84
+ sleep_time = rand(100).to_f / 100.0
85
+ puts("Sleeping #{sleep_time} for the lock #{@lock_name} to become available") if @verbose
86
+ sleep(sleep_time)
61
87
  end
62
88
 
63
89
  def wait_for_mutex
@@ -65,8 +91,7 @@ class UncomplicatedMutex
65
91
  puts("Acquired lock #{@lock_name}") if @verbose
66
92
  else
67
93
  puts("Failed to acquire the lock") if @verbose
68
- raise MutexTimeout.new("Failed to acquire the lock") if @fail_on_timeout
69
- overwrite_mutex
94
+ raise MutexTimeout.new("Failed to acquire the lock")
70
95
  end
71
96
  end
72
97
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uncomplicated_mutex
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Coleman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-22 00:00:00.000000000 Z
11
+ date: 2015-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis