lockistics 0.1.0 → 0.1.1
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.
- data/README.md +16 -5
- data/lib/lockistics/configuration.rb +7 -5
- data/lib/lockistics/lock.rb +2 -0
- data/lib/lockistics/meter.rb +14 -4
- data/lib/lockistics/version.rb +1 -1
- data/lib/lockistics.rb +5 -4
- data/lockistics.gemspec +1 -1
- metadata +5 -5
data/README.md
CHANGED
@@ -4,7 +4,7 @@ Lockistics is basically a distributed mutex on Redis with statistics collecting
|
|
4
4
|
|
5
5
|
The likely use case for locking would be something like a Raketask that you don't want running multiple instances at once.
|
6
6
|
|
7
|
-
The likely use case for the statistics part would be that you want to how often something is being called or if a certain Raketask has been run today or not. You can also use it to find memory leaks or slow methods, kind of private NewRelic with zero features.
|
7
|
+
The likely use case for the statistics part would be that you want to know how often something is being called or if a certain Raketask has been run today or not. You can also use it to find memory leaks or slow methods, kind of private NewRelic with zero features.
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -51,10 +51,11 @@ These are the default settings :
|
|
51
51
|
Lockistics.configure do |config|
|
52
52
|
config.redis = Redis.new
|
53
53
|
config.namespace = "lockistics"
|
54
|
-
config.expire = 300
|
55
|
-
config.sleep = 0.5
|
56
|
-
config.retries = 10
|
57
|
-
config.raise = true
|
54
|
+
config.expire = 300 # seconds
|
55
|
+
config.sleep = 0.5 # seconds to sleep between retries
|
56
|
+
config.retries = 10 # retry times
|
57
|
+
config.raise = true # raise Lockistics::TimeoutException when lock fails
|
58
|
+
config.pass_through = false # don't do anything, let everything pass through
|
58
59
|
end
|
59
60
|
```
|
60
61
|
|
@@ -161,6 +162,16 @@ You can query statistics for locking/metering keys.
|
|
161
162
|
:last_run:time => #<Time..>}
|
162
163
|
```
|
163
164
|
|
165
|
+
## Storage
|
166
|
+
|
167
|
+
- All keys are prefixed with the `configuration.namespace`
|
168
|
+
- namespace.KEY_NAME.lock for lock
|
169
|
+
- namespace.KEY_NAME.dailies is a sorted set with timestamps
|
170
|
+
- namespace.KEY_NAME.daily.TIMESTAMP is a hash with keys like "invocations", "max.time"
|
171
|
+
- same goes for hourlies (but with hourly + hourlies in the key)
|
172
|
+
- namespace.KEY_NAME.total has all time stats for the key
|
173
|
+
- namespace.known_keys is a sorted set of known keys
|
174
|
+
|
164
175
|
## Contributing
|
165
176
|
|
166
177
|
1. Fork it
|
@@ -10,13 +10,15 @@ module Lockistics
|
|
10
10
|
attr_accessor :sleep
|
11
11
|
attr_accessor :retries
|
12
12
|
attr_accessor :raise
|
13
|
+
attr_accessor :pass_through
|
13
14
|
|
14
15
|
def initialize
|
15
|
-
@redis
|
16
|
-
@namespace
|
17
|
-
@expire
|
18
|
-
@sleep
|
19
|
-
@retries
|
16
|
+
@redis = Redis.new
|
17
|
+
@namespace = 'lockistics'
|
18
|
+
@expire = 10
|
19
|
+
@sleep = 0.5
|
20
|
+
@retries = 10
|
21
|
+
@pass_through = false
|
20
22
|
end
|
21
23
|
|
22
24
|
def lock_defaults
|
data/lib/lockistics/lock.rb
CHANGED
@@ -17,6 +17,7 @@ module Lockistics
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def acquire_lock
|
20
|
+
return true if options[:pass_through]
|
20
21
|
Lockistics.known_keys(key)
|
21
22
|
if got_lock?
|
22
23
|
true
|
@@ -46,6 +47,7 @@ module Lockistics
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def release_lock
|
50
|
+
return true if options[:pass_through]
|
49
51
|
@exceeded_before_release = redis.del(namespaced_key) == 0
|
50
52
|
end
|
51
53
|
|
data/lib/lockistics/meter.rb
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
require 'os'
|
2
2
|
|
3
3
|
module Lockistics
|
4
|
+
class DummyMeter
|
5
|
+
def method_missing(*args, &block)
|
6
|
+
# do nothing
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
4
10
|
class Meter
|
5
11
|
|
6
12
|
attr_accessor :key, :options
|
@@ -27,7 +33,7 @@ module Lockistics
|
|
27
33
|
|
28
34
|
def initialize(key, options={})
|
29
35
|
@key = key
|
30
|
-
@options = options
|
36
|
+
@options = {:pass_through => Lockistics.configuration.pass_through}.merge(options)
|
31
37
|
@lock_timeouts = 0
|
32
38
|
end
|
33
39
|
|
@@ -42,13 +48,17 @@ module Lockistics
|
|
42
48
|
|
43
49
|
def perform(&block)
|
44
50
|
raise ArgumentError, "perform called without block" unless block_given?
|
45
|
-
|
46
|
-
|
51
|
+
if options[:pass_through]
|
52
|
+
yield DummyMeter.new
|
53
|
+
else
|
54
|
+
before_perform
|
55
|
+
lock.nil? ? yield(self) : with_lock(&block)
|
56
|
+
end
|
47
57
|
rescue Lockistics::LockTimeout
|
48
58
|
@lock_timeouts = 1
|
49
59
|
raise
|
50
60
|
ensure
|
51
|
-
after_perform
|
61
|
+
after_perform unless options[:pass_through]
|
52
62
|
end
|
53
63
|
|
54
64
|
# You can add custom metrics during runtime
|
data/lib/lockistics/version.rb
CHANGED
data/lib/lockistics.rb
CHANGED
@@ -27,10 +27,11 @@ module Lockistics
|
|
27
27
|
# Lockistics.configure do |config|
|
28
28
|
# config.redis = Redis.new
|
29
29
|
# config.namespace = "production.locks"
|
30
|
-
# config.expire = 300
|
31
|
-
# config.sleep = 0.5
|
32
|
-
# config.retries = 10
|
33
|
-
# config.raise = true
|
30
|
+
# config.expire = 300 # seconds
|
31
|
+
# config.sleep = 0.5 # seconds to sleep between retries
|
32
|
+
# config.retries = 10 # retry times
|
33
|
+
# config.raise = true # raise Lockistics::TimeoutException when lock fails
|
34
|
+
# config.pass_through = false # don't do anything, just pass everything through
|
34
35
|
# end
|
35
36
|
def self.configure(&block)
|
36
37
|
yield configuration
|
data/lockistics.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Lockistics::VERSION
|
9
9
|
spec.authors = ["Kimmo Lehto"]
|
10
10
|
spec.email = ["kimmo.lehto@gmail.com"]
|
11
|
-
spec.description = %q{Statsistics collecting
|
11
|
+
spec.description = %q{Statsistics collecting shared mutex on Redis}
|
12
12
|
spec.summary = %q{With lockistics you can use Redis to create distributed locks and collect statistics how often and how long your locks are held}
|
13
13
|
spec.homepage = "https://github.com/kke/lockistics"
|
14
14
|
spec.license = "MIT"
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lockistics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kimmo Lehto
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2014-05-
|
18
|
+
date: 2014-05-20 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
@@ -102,7 +102,7 @@ dependencies:
|
|
102
102
|
prerelease: false
|
103
103
|
type: :development
|
104
104
|
requirement: *id006
|
105
|
-
description: Statsistics collecting
|
105
|
+
description: Statsistics collecting shared mutex on Redis
|
106
106
|
email:
|
107
107
|
- kimmo.lehto@gmail.com
|
108
108
|
executables: []
|