dynamodb-mutex 0.0.3 → 0.0.4
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 +7 -0
- data/lib/dynamodb_mutex/lock.rb +52 -28
- data/lib/dynamodb_mutex/version.rb +1 -1
- data/spec/spec_helper.rb +10 -8
- metadata +21 -39
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6021f2684e6d453eec6b6c571dc9579680720e09
|
4
|
+
data.tar.gz: 73721ae381b3f05c1de835ceb819ee60ae5eeff3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6eec01b731fb9afa95fcd1352555f0be5bdd65bf141c94f6aadbe4509bc15ea04d1f67f18ea8b8aae1734753b6bfe6d6d7dd658eff979a3f932395a1f6da4122
|
7
|
+
data.tar.gz: 0ccadf258c6e395214cf9e47e85beeef348351018a480acb9348d4cbdcdcfc8e8960fbd58bf75d7a46e04c4d1a6d886afe89fea05a1753ffbb78e14b412393c0
|
data/lib/dynamodb_mutex/lock.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require 'aws-sdk
|
1
|
+
require 'aws-sdk'
|
2
|
+
require 'socket'
|
2
3
|
require_relative 'logging'
|
3
4
|
|
4
5
|
module DynamoDBMutex
|
@@ -24,7 +25,8 @@ module DynamoDBMutex
|
|
24
25
|
ensure delete(name)
|
25
26
|
end
|
26
27
|
else
|
27
|
-
raise LockError,
|
28
|
+
raise LockError,
|
29
|
+
"Unable to acquire #{name} after #{opts[:wait_for_other]} seconds"
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
@@ -41,11 +43,14 @@ module DynamoDBMutex
|
|
41
43
|
end
|
42
44
|
|
43
45
|
begin
|
44
|
-
|
45
|
-
:
|
46
|
+
dynamodb_client.put_item(
|
47
|
+
table_name: TABLE_NAME,
|
48
|
+
item: { :id => name, :created => Time.now.to_i },
|
49
|
+
condition_expression: 'attribute_not_exists(id)'
|
50
|
+
)
|
46
51
|
logger.info "#{pid} acquired #{name}"
|
47
52
|
return true
|
48
|
-
rescue
|
53
|
+
rescue Aws::DynamoDB::Errors::ConditionalCheckFailedException
|
49
54
|
logger.info "#{pid} is waiting for #{name}"
|
50
55
|
sleep opts[:polling_interval]
|
51
56
|
end
|
@@ -56,7 +61,10 @@ module DynamoDBMutex
|
|
56
61
|
end
|
57
62
|
|
58
63
|
def delete(name)
|
59
|
-
|
64
|
+
dynamodb_client.delete_item(
|
65
|
+
table_name: TABLE_NAME,
|
66
|
+
key: { :id => name }
|
67
|
+
)
|
60
68
|
logger.info "#{pid} released lock #{name}"
|
61
69
|
end
|
62
70
|
|
@@ -69,34 +77,50 @@ module DynamoDBMutex
|
|
69
77
|
def stale?(name, ttl)
|
70
78
|
return false unless ttl
|
71
79
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
80
|
+
item = dynamodb_client.get_item(
|
81
|
+
table_name: TABLE_NAME,
|
82
|
+
key: { :id => name },
|
83
|
+
consistent_read: true
|
84
|
+
).item
|
85
|
+
|
86
|
+
not item.nil? and Time.now.to_i > item['created'].to_i + ttl
|
77
87
|
end
|
78
88
|
|
79
|
-
def
|
80
|
-
return @
|
81
|
-
|
89
|
+
def dynamodb_client
|
90
|
+
return @dynamodb_client if @dynamodb_client
|
91
|
+
@dynamodb_client = Aws::DynamoDB::Client.new
|
82
92
|
|
83
93
|
begin
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
94
|
+
@dynamodb_client.describe_table(table_name: TABLE_NAME)
|
95
|
+
rescue Aws::DynamoDB::Errors::ResourceNotFoundException
|
96
|
+
logger.info "Table #{TABLE_NAME} not found; creating it."
|
97
|
+
@dynamodb_client.create_table(
|
98
|
+
table_name: TABLE_NAME,
|
99
|
+
attribute_definitions: [
|
100
|
+
{ attribute_name: 'id', attribute_type: 'S' }
|
101
|
+
],
|
102
|
+
key_schema: [
|
103
|
+
{ attribute_name: 'id', key_type: 'HASH' }
|
104
|
+
],
|
105
|
+
provisioned_throughput: {
|
106
|
+
read_capacity_units: 5,
|
107
|
+
write_capacity_units: 5
|
108
|
+
}
|
109
|
+
)
|
110
|
+
logger.info "Waiting for table #{TABLE_NAME} to be created."
|
111
|
+
begin
|
112
|
+
@dynamodb_client.wait_until(:table_exists,
|
113
|
+
table_name: TABLE_NAME) do |w|
|
114
|
+
w.max_attempts = 10
|
115
|
+
w.delay = 1
|
116
|
+
end
|
117
|
+
rescue Aws::Waiters::Errors::WaiterFailed => e
|
118
|
+
raise LockError, "Cannot create table #{TABLE_NAME}: #{e.message}"
|
119
|
+
end
|
120
|
+
logger.info "Table #{TABLE_NAME} has been created."
|
97
121
|
end
|
98
122
|
|
99
|
-
@
|
123
|
+
@dynamodb_client
|
100
124
|
end
|
101
125
|
end
|
102
126
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,14 +2,15 @@ require 'rubygems'
|
|
2
2
|
require 'bundler/setup'
|
3
3
|
require 'rspec'
|
4
4
|
require 'fake_dynamo'
|
5
|
-
require 'aws-sdk
|
5
|
+
require 'aws-sdk'
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
Aws.config.update({
|
8
|
+
credentials: Aws::Credentials.new(
|
9
|
+
'your_access_key_id',
|
10
|
+
'your_secret_access_key'
|
11
|
+
),
|
12
|
+
endpoint: 'http://localhost:4567'
|
13
|
+
})
|
13
14
|
|
14
15
|
require 'dynamodb-mutex'
|
15
16
|
|
@@ -21,7 +22,8 @@ RSpec.configure do |config|
|
|
21
22
|
dynamo_thread = nil
|
22
23
|
|
23
24
|
config.before(:suite) do
|
24
|
-
FakeDynamo::
|
25
|
+
FakeDynamo::Logger.setup(:debug)
|
26
|
+
FakeDynamo::Storage.instance.init_db('test.fdb')
|
25
27
|
FakeDynamo::Storage.instance.load_aof
|
26
28
|
|
27
29
|
dynamo_thread = Thread.new do
|
metadata
CHANGED
@@ -1,96 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamodb-mutex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Dinesh Yadav
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2015-
|
11
|
+
date: 2015-12-16 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
name: aws-sdk
|
14
|
+
name: aws-sdk
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: 2.0.0
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: 2.0.0
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec-mocks
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rake
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: fake_dynamo
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - '='
|
84
74
|
- !ruby/object:Gem::Version
|
85
|
-
version: 0.
|
75
|
+
version: 0.2.5
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - '='
|
92
81
|
- !ruby/object:Gem::Version
|
93
|
-
version: 0.
|
82
|
+
version: 0.2.5
|
94
83
|
description: dynamodb-mutex implements a simple mutex that can be used to coordinate
|
95
84
|
access to shared data from multiple concurrent hosts
|
96
85
|
email: dy@clearhaus.com
|
@@ -98,45 +87,38 @@ executables: []
|
|
98
87
|
extensions: []
|
99
88
|
extra_rdoc_files: []
|
100
89
|
files:
|
90
|
+
- LICENSE
|
91
|
+
- README.rst
|
101
92
|
- Rakefile
|
102
93
|
- lib/dynamodb-mutex.rb
|
94
|
+
- lib/dynamodb_mutex.rb
|
103
95
|
- lib/dynamodb_mutex/lock.rb
|
104
96
|
- lib/dynamodb_mutex/logging.rb
|
105
97
|
- lib/dynamodb_mutex/version.rb
|
106
|
-
- lib/dynamodb_mutex.rb
|
107
98
|
- spec/dynamodb_mutex_spec.rb
|
108
99
|
- spec/spec_helper.rb
|
109
|
-
- README.rst
|
110
|
-
- LICENSE
|
111
100
|
homepage: http://github.com/clearhaus/dynamodb-mutex
|
112
101
|
licenses:
|
113
102
|
- MIT
|
103
|
+
metadata: {}
|
114
104
|
post_install_message:
|
115
105
|
rdoc_options: []
|
116
106
|
require_paths:
|
117
107
|
- lib
|
118
108
|
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
109
|
requirements:
|
121
|
-
- -
|
110
|
+
- - '>='
|
122
111
|
- !ruby/object:Gem::Version
|
123
112
|
version: '0'
|
124
|
-
segments:
|
125
|
-
- 0
|
126
|
-
hash: 409537590926897434
|
127
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
-
none: false
|
129
114
|
requirements:
|
130
|
-
- -
|
115
|
+
- - '>='
|
131
116
|
- !ruby/object:Gem::Version
|
132
117
|
version: '0'
|
133
|
-
segments:
|
134
|
-
- 0
|
135
|
-
hash: 409537590926897434
|
136
118
|
requirements: []
|
137
119
|
rubyforge_project:
|
138
|
-
rubygems_version:
|
120
|
+
rubygems_version: 2.4.2
|
139
121
|
signing_key:
|
140
|
-
specification_version:
|
122
|
+
specification_version: 4
|
141
123
|
summary: Distributed mutex based on AWS DynamoDB
|
142
124
|
test_files: []
|