master_lock 0.8.0 → 0.9.0

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: 321dbc834c9f475dac38543343c696ae1eafda08
4
- data.tar.gz: 5f764d38a83de5434bf318944de4dc4b478202e1
3
+ metadata.gz: 1ab9ca1ac176e6f632f6c3d71ed4008bec96df23
4
+ data.tar.gz: 43f2c87012e46141d08990ae8e5ce4badfba36e5
5
5
  SHA512:
6
- metadata.gz: 67f9681ccef00d1fa3e4956524fc419dbb097b770ebb985cbdf16a4f584ecdaaee7220ff4ab68d9699723ebef24131002ee5cc0ec4b42338e79114618c4c145a
7
- data.tar.gz: e6b55e755805fc89ad8c26a942e3d6be4770631285d1ed207ad250c2dc5ad95c7d3b77315ec48035e1cd2a317e8dae4235f87f340af349eebe1ea938a4e9bfe9
6
+ metadata.gz: 4f5a952ef00b065ef69563acdb808a2921726229be3ea9c78bf15b6070804ae8d8020f3cea5fd2e27f6ce52ae69d7bc13c4ec1d1a7dc6d9072cee626af4c4a19
7
+ data.tar.gz: 82d2e7768c6d528d211f53870b06296194b328fb0ce4f703cfdd6e31287a1a8514a73c0f9a0db4776b194b9c32b1f0296d73738b9eeb83b20dfaa89e3548917f
data/README.md CHANGED
@@ -24,7 +24,19 @@ Or install it yourself as:
24
24
 
25
25
  ## Usage
26
26
 
27
- TODO: Write usage instructions here
27
+ ```ruby
28
+ def perform_safe_operation
29
+ MasterLock.synchronize("perform_safe_operation") do
30
+ # Code executes within locked context
31
+ end
32
+ end
33
+
34
+ # Call MasterLock.start when your application boots up.
35
+ # This starts a background thread to prevent locks from expiring.
36
+ MasterLock.start
37
+ ```
38
+
39
+ See [documentation](http://www.rubydoc.info/gems/master_lock) for advanced usage.
28
40
 
29
41
  ## Development
30
42
 
@@ -44,7 +44,7 @@ module MasterLock
44
44
  def acquire(timeout:)
45
45
  timeout_time = Time.now + timeout
46
46
  loop do
47
- locked = redis.set(key, owner, nx: true, px: ttl_ms)
47
+ locked = redis.set(redis_key, owner, nx: true, px: ttl_ms)
48
48
  return true if locked
49
49
  return false if Time.now >= timeout_time
50
50
  sleep(@sleep_interval)
@@ -60,7 +60,7 @@ module MasterLock
60
60
  result = eval_script(
61
61
  RedisScripts::EXTEND_SCRIPT,
62
62
  RedisScripts::EXTEND_SCRIPT_HASH,
63
- keys: [key],
63
+ keys: [redis_key],
64
64
  argv: [owner, ttl_ms]
65
65
  )
66
66
  result != 0
@@ -74,7 +74,7 @@ module MasterLock
74
74
  result = eval_script(
75
75
  RedisScripts::RELEASE_SCRIPT,
76
76
  RedisScripts::RELEASE_SCRIPT_HASH,
77
- keys: [key],
77
+ keys: [redis_key],
78
78
  argv: [owner]
79
79
  )
80
80
  result != 0
@@ -93,5 +93,9 @@ module MasterLock
93
93
  redis.eval(script, keys: keys, argv: argv)
94
94
  end
95
95
  end
96
+
97
+ def redis_key
98
+ "#{MasterLock.config.key_prefix}:#{key}"
99
+ end
96
100
  end
97
101
  end
@@ -69,15 +69,21 @@ module MasterLock
69
69
  def extend_lock(registration)
70
70
  registration.mutex.synchronize do
71
71
  time = Time.now
72
+ lock_key = registration.lock.key
72
73
  if !registration.thread.alive?
73
74
  registration.released = true
75
+ MasterLock.logger.info(
76
+ "Releasing lock #{lock_key} after owning thread terminated"
77
+ )
74
78
  elsif !registration.released &&
75
79
  registration.acquired_at + registration.extend_interval < time
80
+ lock_key = registration.lock.key
76
81
  if registration.lock.extend
77
82
  registration.acquired_at = time
83
+ MasterLock.logger.debug("Renewed lease on lock #{lock_key}")
78
84
  else
79
85
  registration.released = true
80
- # TODO: Notify of failure somehow
86
+ MasterLock.logger.warn("Could not renew lease on lock #{lock_key}")
81
87
  end
82
88
  end
83
89
  end
@@ -1,3 +1,3 @@
1
1
  module MasterLock
2
- VERSION = "0.8.0"
2
+ VERSION = "0.9.0"
3
3
  end
data/lib/master_lock.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'master_lock/version'
2
2
 
3
+ require 'logger'
3
4
  require 'socket'
4
5
 
5
6
  # MasterLock is a system for interprocess locking. Resources can be locked by a
@@ -27,6 +28,7 @@ module MasterLock
27
28
  :acquire_timeout,
28
29
  :extend_interval,
29
30
  :hostname,
31
+ :logger,
30
32
  :key_prefix,
31
33
  :process_id,
32
34
  :redis,
@@ -72,7 +74,7 @@ module MasterLock
72
74
 
73
75
  lock = RedisLock.new(
74
76
  redis: config.redis,
75
- key: redis_key(key),
77
+ key: key,
76
78
  ttl: ttl,
77
79
  owner: generate_owner
78
80
  )
@@ -82,11 +84,16 @@ module MasterLock
82
84
 
83
85
  registration =
84
86
  @registry.register(lock, extend_interval)
87
+ logger.debug("Acquired lock #{key}")
85
88
  begin
86
89
  yield
87
90
  ensure
88
91
  @registry.unregister(registration)
89
- lock.release # TODO: Check result of this
92
+ if lock.release
93
+ logger.debug("Released lock #{key}")
94
+ else
95
+ logger.warn("Failed to release lock #{key}")
96
+ end
90
97
  end
91
98
  end
92
99
 
@@ -103,6 +110,13 @@ module MasterLock
103
110
  end
104
111
  end
105
112
 
113
+ # Get the configured logger.
114
+ #
115
+ # @return [Logger]
116
+ def logger
117
+ config.logger
118
+ end
119
+
106
120
  # @return [Config] MasterLock configuration settings
107
121
  def config
108
122
  if !defined?(@config)
@@ -110,6 +124,8 @@ module MasterLock
110
124
  @config.acquire_timeout = DEFAULT_ACQUIRE_TIMEOUT
111
125
  @config.extend_interval = DEFAULT_EXTEND_INTERVAL
112
126
  @config.hostname = Socket.gethostname
127
+ @config.logger = Logger.new(STDOUT)
128
+ @config.logger.progname = name
113
129
  @config.key_prefix = DEFAULT_KEY_PREFIX
114
130
  @config.process_id = Process.pid
115
131
  @config.sleep_time = DEFAULT_SLEEP_TIME
@@ -135,10 +151,6 @@ module MasterLock
135
151
  def generate_owner
136
152
  "#{config.hostname}:#{config.process_id}:#{Thread.current.object_id}"
137
153
  end
138
-
139
- def redis_key(key)
140
- "#{config.key_prefix}:#{key}"
141
- end
142
154
  end
143
155
  end
144
156
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: master_lock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jim Posen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-03 00:00:00.000000000 Z
11
+ date: 2016-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis