sdb_lock 0.0.2 → 0.1.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 +7 -0
- data/README.md +8 -0
- data/Rakefile +9 -0
- data/lib/sdb_lock/version.rb +1 -1
- data/lib/sdb_lock.rb +58 -23
- data/sdb_lock.gemspec +2 -1
- data/test/{lock_test.rb → test_lock.rb} +2 -5
- metadata +30 -28
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a9b9ebf2fa554880afaa6906692e45d7a04ab855
|
4
|
+
data.tar.gz: 684b125391fb61cb928bf685543ddd66987f7b4d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cdf66afa2420112cdc27aa0b8ef656a926c46ed209b80b000a6ed391d1e76312a44aca1dbd9585b62387ec4c08a47237f04155c70284545e5aa58949241d4912
|
7
|
+
data.tar.gz: 4aae120e31e057fcbddf5411a7ffa363c0416efcf418c3ae0053266ec3a22d16556487770ac71bd4eff97e054b645ec9d456c7ea312e6a381d0050f0d1ab5d08
|
data/README.md
CHANGED
@@ -58,6 +58,14 @@ lock.unlock_old(10)
|
|
58
58
|
|
59
59
|
````
|
60
60
|
|
61
|
+
## Test
|
62
|
+
|
63
|
+
`AWS_REGION` environmental variable is required to run tests.
|
64
|
+
|
65
|
+
```
|
66
|
+
$ AWS_REGION=ap-northeast-1 bundle exec rake
|
67
|
+
```
|
68
|
+
|
61
69
|
## Limitation
|
62
70
|
|
63
71
|
* Lock might remain by network failure or other reason. See `#unlock_old`.
|
data/Rakefile
CHANGED
data/lib/sdb_lock/version.rb
CHANGED
data/lib/sdb_lock.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require "sdb_lock/version"
|
2
|
-
|
3
|
-
require 'aws'
|
2
|
+
require 'aws-sdk'
|
4
3
|
|
5
4
|
# Lock using SimpleDB conditional put.
|
6
5
|
#
|
@@ -35,13 +34,12 @@ class SdbLock
|
|
35
34
|
# @param [String] domain_name SimpleDB domain name
|
36
35
|
# @param [Hash] options
|
37
36
|
def initialize(domain_name, options = {})
|
38
|
-
@sdb =
|
39
|
-
|
40
|
-
|
41
|
-
@sdb.
|
42
|
-
|
37
|
+
@sdb = ::Aws::SimpleDB::Client.new(options)
|
38
|
+
@domain_name = domain_name
|
39
|
+
unless domains.include? @domain_name
|
40
|
+
@sdb.create_domain(domain_name: @domain_name)
|
41
|
+
@domains = @sdb.list_domains.domain_names
|
43
42
|
end
|
44
|
-
@domain = @sdb.domains[domain_name]
|
45
43
|
end
|
46
44
|
|
47
45
|
# Try to lock resource_name
|
@@ -49,8 +47,22 @@ class SdbLock
|
|
49
47
|
# @param [String] resource_name name to lock
|
50
48
|
# @return [TrueClass] true when locked, unless false
|
51
49
|
def try_lock(resource_name)
|
52
|
-
attributes =
|
53
|
-
|
50
|
+
attributes = [
|
51
|
+
{
|
52
|
+
name: LOCK_TIME,
|
53
|
+
value: format_time(Time.now)
|
54
|
+
}
|
55
|
+
]
|
56
|
+
|
57
|
+
@sdb.put_attributes(
|
58
|
+
domain_name: @domain_name,
|
59
|
+
item_name: resource_name,
|
60
|
+
attributes: attributes,
|
61
|
+
expected: {
|
62
|
+
name: LOCK_TIME,
|
63
|
+
exists: false
|
64
|
+
}
|
65
|
+
)
|
54
66
|
if block_given?
|
55
67
|
begin
|
56
68
|
yield
|
@@ -59,7 +71,7 @@ class SdbLock
|
|
59
71
|
end
|
60
72
|
end
|
61
73
|
true
|
62
|
-
rescue
|
74
|
+
rescue ::Aws::SimpleDB::Errors::ConditionalCheckFailed
|
63
75
|
false
|
64
76
|
end
|
65
77
|
|
@@ -90,22 +102,35 @@ class SdbLock
|
|
90
102
|
# Unlock resource_name
|
91
103
|
# @param [String] resource_name name to unlock
|
92
104
|
def unlock(resource_name, expected_lock_time = nil)
|
93
|
-
if expected_lock_time
|
94
|
-
|
105
|
+
expected = if expected_lock_time
|
106
|
+
{
|
107
|
+
name: LOCK_TIME,
|
108
|
+
value: expected_lock_time,
|
109
|
+
exists: true
|
110
|
+
}
|
95
111
|
else
|
96
|
-
|
112
|
+
{}
|
97
113
|
end
|
114
|
+
|
115
|
+
@sdb.delete_attributes(
|
116
|
+
domain_name: @domain_name,
|
117
|
+
item_name: resource_name,
|
118
|
+
expected: expected
|
119
|
+
)
|
98
120
|
true
|
99
|
-
rescue
|
121
|
+
rescue ::Aws::SimpleDB::Errors::ConditionalCheckFailed
|
100
122
|
false
|
101
123
|
end
|
102
124
|
|
103
125
|
# Locked time for resource_name
|
104
126
|
# @return [Time] locked time, nil if it is not locked
|
105
127
|
def locked_time(resource_name)
|
106
|
-
|
107
|
-
|
108
|
-
|
128
|
+
attributes = item(resource_name)
|
129
|
+
unless attributes.empty?
|
130
|
+
attributes.each do |a|
|
131
|
+
break Time.at(a.value.to_i) if a.name == LOCK_TIME
|
132
|
+
end
|
133
|
+
end
|
109
134
|
end
|
110
135
|
|
111
136
|
# All locked resources
|
@@ -117,7 +142,8 @@ class SdbLock
|
|
117
142
|
else
|
118
143
|
cond = "`#{LOCK_TIME}` is not null"
|
119
144
|
end
|
120
|
-
@
|
145
|
+
statement = "SELECT * FROM #{@domain_name} WHERE #{cond}"
|
146
|
+
@sdb.select(select_expression: statement).items.map { |i| i.name }
|
121
147
|
end
|
122
148
|
|
123
149
|
# Unlock old resources.
|
@@ -130,9 +156,11 @@ class SdbLock
|
|
130
156
|
targets = locked_resources(age_in_seconds)
|
131
157
|
unlocked = []
|
132
158
|
targets.each do |resource_name|
|
133
|
-
|
134
|
-
|
135
|
-
|
159
|
+
value = item(resource_name).each do |attribute|
|
160
|
+
break attribute.value if attribute.name == LOCK_TIME
|
161
|
+
end
|
162
|
+
next if !value || value > format_time(Time.now - age_in_seconds)
|
163
|
+
succ = unlock(resource_name, value)
|
136
164
|
unlocked << resource_name if succ
|
137
165
|
end
|
138
166
|
unlocked
|
@@ -140,8 +168,15 @@ class SdbLock
|
|
140
168
|
|
141
169
|
private
|
142
170
|
|
171
|
+
def domains
|
172
|
+
@domains ||= @sdb.list_domains.domain_names
|
173
|
+
end
|
174
|
+
|
143
175
|
def item(resource_name)
|
144
|
-
@
|
176
|
+
@sdb.get_attributes(
|
177
|
+
domain_name: @domain_name,
|
178
|
+
item_name: resource_name
|
179
|
+
).attributes
|
145
180
|
end
|
146
181
|
|
147
182
|
# Format time to compare lexicographically
|
data/sdb_lock.gemspec
CHANGED
@@ -15,7 +15,8 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = SdbLock::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency 'aws-sdk', '~>
|
18
|
+
gem.add_dependency 'aws-sdk', '~> 2'
|
19
19
|
|
20
20
|
gem.add_development_dependency 'rake', '~> 0.9.2.2'
|
21
|
+
gem.add_development_dependency 'minitest'
|
21
22
|
end
|
@@ -1,13 +1,10 @@
|
|
1
|
-
require 'minitest/unit'
|
2
1
|
require 'minitest/autorun'
|
3
2
|
require "sdb_lock"
|
4
3
|
|
5
|
-
class LockTest < MiniTest::
|
4
|
+
class LockTest < MiniTest::Test
|
6
5
|
def setup
|
7
6
|
@lock = SdbLock.new(
|
8
|
-
'lock_test'
|
9
|
-
create_domain: true,
|
10
|
-
simple_db_endpoint: "sdb.ap-northeast-1.amazonaws.com"
|
7
|
+
'lock_test'
|
11
8
|
)
|
12
9
|
@lock.unlock("test")
|
13
10
|
end
|
metadata
CHANGED
@@ -1,48 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sdb_lock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- KAWACHI Takashi
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2016-03-31 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
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
|
-
version:
|
19
|
+
version: '2'
|
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
|
-
version:
|
26
|
+
version: '2'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: 0.9.2.2
|
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: 0.9.2.2
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
46
55
|
description: Lock library using Amazon SimpleDB
|
47
56
|
email:
|
48
57
|
- kawachi@p-lucky.net
|
@@ -50,7 +59,7 @@ executables: []
|
|
50
59
|
extensions: []
|
51
60
|
extra_rdoc_files: []
|
52
61
|
files:
|
53
|
-
- .gitignore
|
62
|
+
- ".gitignore"
|
54
63
|
- Gemfile
|
55
64
|
- LICENSE
|
56
65
|
- README.md
|
@@ -58,36 +67,29 @@ files:
|
|
58
67
|
- lib/sdb_lock.rb
|
59
68
|
- lib/sdb_lock/version.rb
|
60
69
|
- sdb_lock.gemspec
|
61
|
-
- test/
|
70
|
+
- test/test_lock.rb
|
62
71
|
homepage: ''
|
63
72
|
licenses: []
|
73
|
+
metadata: {}
|
64
74
|
post_install_message:
|
65
75
|
rdoc_options: []
|
66
76
|
require_paths:
|
67
77
|
- lib
|
68
78
|
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
79
|
requirements:
|
71
|
-
- -
|
80
|
+
- - ">="
|
72
81
|
- !ruby/object:Gem::Version
|
73
82
|
version: '0'
|
74
|
-
segments:
|
75
|
-
- 0
|
76
|
-
hash: 1769990317450640860
|
77
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
-
none: false
|
79
84
|
requirements:
|
80
|
-
- -
|
85
|
+
- - ">="
|
81
86
|
- !ruby/object:Gem::Version
|
82
87
|
version: '0'
|
83
|
-
segments:
|
84
|
-
- 0
|
85
|
-
hash: 1769990317450640860
|
86
88
|
requirements: []
|
87
89
|
rubyforge_project:
|
88
|
-
rubygems_version:
|
90
|
+
rubygems_version: 2.4.5
|
89
91
|
signing_key:
|
90
|
-
specification_version:
|
92
|
+
specification_version: 4
|
91
93
|
summary: Lock library using Amazon SimpleDB
|
92
94
|
test_files:
|
93
|
-
- test/
|
95
|
+
- test/test_lock.rb
|