lock-smith 0.0.4 → 0.0.5

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.
@@ -15,45 +15,53 @@ module Locksmith
15
15
 
16
16
  def lock(name)
17
17
  lock = fetch_lock(name)
18
- last_rev = lock[:Locked] || 0
18
+ last_rev = (lock["Locked"] || 0).to_i
19
19
  new_rev = Time.now.to_i
20
20
  attempts = 0
21
21
  while attempts < MAX_LOCK_ATTEMPTS
22
22
  begin
23
23
  Timeout::timeout(LOCK_TIMEOUT) do
24
- release_lock(name, last_rev) if last_rev < (Time.now.to_i - TTL)
24
+ if last_rev != 0 && last_rev < (Time.now.to_i - TTL)
25
+ log(:at => "lock-expired", :lock => name, :last_rev => last_rev)
26
+ release_lock!(name)
27
+ end
25
28
  write_lock(name, 0, new_rev)
26
- log(at: "lock-acquired", lock: name, rev: new_rev)
29
+ log(:at => "lock-acquired", :lock => name, :rev => new_rev)
27
30
  result = yield
28
31
  release_lock(name, new_rev)
29
- log(at: "lock-released", lock: name, rev: new_rev)
32
+ log(:at => "lock-released", :lock => name, :rev => new_rev)
30
33
  return result
31
34
  end
32
35
  rescue AWS::DynamoDB::Errors::ConditionalCheckFailedException
36
+ log(:at => "lock-not-acquired", :lock => name, :last_rev => last_rev, :new_rev => new_rev)
33
37
  attempts += 1
34
38
  rescue Timeout::Error
35
39
  attempts += 1
36
40
  release_lock(name, new_rev)
37
- log(at: "timeout-lock-released", lock: name, rev: new_rev)
41
+ log(:at => "timeout-lock-released", :lock => name, :rev => new_rev)
38
42
  end
39
43
  end
40
44
  end
41
45
 
42
46
  def write_lock(name, rev, new_rev)
43
- locks.put({Name: name, Locked: new_rev},
47
+ locks.put({:Name => name, :Locked => new_rev},
44
48
  :if => {:Locked => rev})
45
49
  end
46
50
 
47
51
  def release_lock(name, rev)
48
- locks.put({Name: name, Locked: 0},
52
+ locks.put({:Name => name, :Locked => 0},
49
53
  :if => {:Locked => rev})
50
54
  end
51
55
 
56
+ def release_lock!(name)
57
+ locks.put({:Name => name, :Locked => 0})
58
+ end
59
+
52
60
  def fetch_lock(name)
53
61
  if locks.at(name).exists?(consistent_read: true)
54
62
  locks[name].attributes.to_h(consistent_read: true)
55
63
  else
56
- locks.put(Name: name, Locked: 0).attributes.to_h(consistent_read: true)
64
+ locks.put(:Name => name, :Locked => 0).attributes.to_h(consistent_read: true)
57
65
  end
58
66
  end
59
67
 
@@ -73,8 +81,8 @@ module Locksmith
73
81
 
74
82
  def dynamo
75
83
  @dynamo_lock.synchronize do
76
- @db ||= AWS::DynamoDB.new(access_key_id: Config.aws_id,
77
- secret_access_key: Config.aws_secret)
84
+ @db ||= AWS::DynamoDB.new(:access_key_id => Config.aws_id,
85
+ :secret_access_key => Config.aws_secret)
78
86
  end
79
87
  end
80
88
 
@@ -4,11 +4,11 @@ module Locksmith
4
4
 
5
5
  def log(data)
6
6
  result = nil
7
- data = {lib: "locksmith"}.merge(data)
7
+ data = {:lib => "locksmith"}.merge(data)
8
8
  if block_given?
9
9
  start = Time.now
10
10
  result = yield
11
- data.merge(elapsed: Time.now - start)
11
+ data.merge(:elapsed => Time.now - start)
12
12
  end
13
13
  data.reduce(out=String.new) do |s, tup|
14
14
  s << [tup.first, tup.last].join("=") << " "
@@ -28,8 +28,12 @@ module Locksmith
28
28
  conn.exec("select pg_advisory_unlock($1)", [i])
29
29
  end
30
30
 
31
+ def conn=(conn)
32
+ @conn = conn
33
+ end
34
+
31
35
  def conn
32
- @con ||= PG::Connection.open(
36
+ @conn ||= PG::Connection.open(
33
37
  dburl.host,
34
38
  dburl.port || 5432,
35
39
  nil, '', #opts, tty
@@ -44,7 +48,7 @@ module Locksmith
44
48
  end
45
49
 
46
50
  def log(data, &blk)
47
- Log.log({ns: "postgresql-lock"}.merge(data), &blk)
51
+ Log.log({:ns => "postgresql-lock"}.merge(data), &blk)
48
52
  end
49
53
 
50
54
  end
data/readme.md CHANGED
@@ -1,13 +1,11 @@
1
1
  # Locksmith
2
2
 
3
- **This software is beta quality. Check back later to hear battle testing results**
3
+ **This software is beta quality. Check back later for production quality.**
4
4
 
5
5
  A library of locking algorithms for a variety of data stores. Supported Data Stores:
6
6
 
7
7
  * DynamoDB
8
8
  * PostgreSQL
9
- * TODO: Memcached
10
- * TODO: Redis
11
9
  * TODO: Doozerd
12
10
  * TODO: Zookeeper
13
11
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lock-smith
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: