omgf 0.0.5 → 0.0.6
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/GIT-VERSION-GEN +1 -1
- data/lib/omgf/hysterical_raisins.rb +4 -4
- data/lib/omgf/pool.rb +3 -3
- data/lib/omgf/regurgitator.rb +17 -3
- data/omgf.gemspec +2 -0
- data/test/test_regurgitator.rb +69 -0
- metadata +43 -5
data/GIT-VERSION-GEN
CHANGED
@@ -114,7 +114,7 @@ class OMGF::HystericalRaisins
|
|
114
114
|
|
115
115
|
# HEAD /$DOMAIN/$KEY
|
116
116
|
def stat_key(env, domain, key)
|
117
|
-
size, uris = mg_size_and_uris(domain, key, @get_paths_opts)
|
117
|
+
size, uris = mg_size_and_uris(env, domain, key, @get_paths_opts)
|
118
118
|
uris = @vp.verify(uris, 1, @verify_timeout).flatten!
|
119
119
|
|
120
120
|
return r(503, "") unless uris && uris[0]
|
@@ -130,7 +130,7 @@ class OMGF::HystericalRaisins
|
|
130
130
|
|
131
131
|
# GET /$DOMAIN/$KEY
|
132
132
|
def redirect_key(env, domain, key)
|
133
|
-
uris = mg_get_uris(domain, key, @get_paths_opts)
|
133
|
+
uris = mg_get_uris(env, domain, key, @get_paths_opts)
|
134
134
|
uris = @vp.verify(uris, 1, @verify_timeout).flatten!
|
135
135
|
|
136
136
|
return r(503, "") unless uris && dest = uris.shift
|
@@ -159,12 +159,12 @@ class OMGF::HystericalRaisins
|
|
159
159
|
when "application/json"
|
160
160
|
tmp = []
|
161
161
|
h = { "Content-Type" => "application/json" }
|
162
|
-
mg_list_keys(domain, prefix, after, limit) { |*x| tmp << x }
|
162
|
+
mg_list_keys(env, domain, prefix, after, limit) { |*x| tmp << x }
|
163
163
|
tmp = tmp.to_json
|
164
164
|
else
|
165
165
|
tmp = ""
|
166
166
|
h = { "Content-Type" => "text/plain" }
|
167
|
-
mg_list_keys(domain, prefix, after, limit) do |dkey,length,devcount|
|
167
|
+
mg_list_keys(env, domain, prefix, after, limit) do |dkey,length,devcount|
|
168
168
|
tmp << "#{dkey}|#{length}|#{devcount}\n"
|
169
169
|
end
|
170
170
|
end
|
data/lib/omgf/pool.rb
CHANGED
@@ -32,15 +32,15 @@ module OMGF::Pool
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
def mg_list_keys(domain, prefix, after, limit, &block) # :nodoc:
|
35
|
+
def mg_list_keys(env, domain, prefix, after, limit, &block) # :nodoc:
|
36
36
|
pool_use(domain) { |mg| mg.list_keys(prefix, after, limit, &block) }
|
37
37
|
end
|
38
38
|
|
39
|
-
def mg_get_uris(domain, key, opts) # :nodoc:
|
39
|
+
def mg_get_uris(env, domain, key, opts) # :nodoc:
|
40
40
|
pool_use(domain) { |mg| mg.get_uris(key, opts) }
|
41
41
|
end
|
42
42
|
|
43
|
-
def mg_size_and_uris(domain, key, opts) # :nodoc:
|
43
|
+
def mg_size_and_uris(env, domain, key, opts) # :nodoc:
|
44
44
|
pool_use(domain) do |mg|
|
45
45
|
[ mg.size(key), mg.get_uris(key, opts) ]
|
46
46
|
end
|
data/lib/omgf/regurgitator.rb
CHANGED
@@ -15,28 +15,42 @@ module OMGF::Regurgitator
|
|
15
15
|
get_dmid(domain) or raise MogileFS::Backend::UnregDomainError
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
18
|
+
def _log_err(env, m, e)
|
19
|
+
l = env["rack.logger"] or return
|
20
|
+
l.error("retrying #{m} against tracker: #{e.message} (#{e.class})")
|
21
|
+
end
|
22
|
+
|
23
|
+
def mg_list_keys(env, domain, prefix, after, limit)
|
19
24
|
check_domain!(domain)
|
20
25
|
list_keys(domain, prefix: prefix, after: after, limit: limit) do |x|
|
21
26
|
yield(x[:dkey], x[:length], x[:devcount])
|
22
27
|
end
|
28
|
+
rescue Sequel::Error => e
|
29
|
+
_log_err(env, "mg_list_keys", e)
|
30
|
+
super
|
23
31
|
end
|
24
32
|
|
25
33
|
def _uris!(info)
|
26
34
|
info[:uris].values.flatten!
|
27
35
|
end
|
28
36
|
|
29
|
-
def mg_get_uris(domain, key, get_path_opts = {})
|
37
|
+
def mg_get_uris(env, domain, key, get_path_opts = {})
|
30
38
|
check_domain!(domain)
|
31
39
|
info = file_info({}, domain, key) or
|
32
40
|
raise MogileFS::Backend::UnknownKeyError
|
33
41
|
_uris!(info)
|
42
|
+
rescue Sequel::Error => e
|
43
|
+
_log_err(env, "mg_get_uris", e)
|
44
|
+
super
|
34
45
|
end
|
35
46
|
|
36
|
-
def mg_size_and_uris(domain, key, get_path_opts = {})
|
47
|
+
def mg_size_and_uris(env, domain, key, get_path_opts = {})
|
37
48
|
check_domain!(domain)
|
38
49
|
info = file_info({}, domain, key) or
|
39
50
|
raise MogileFS::Backend::UnknownKeyError
|
40
51
|
[ info[:length], _uris!(info) ]
|
52
|
+
rescue Sequel::Error => e
|
53
|
+
_log_err(env, "mg_size_and_uris", e)
|
54
|
+
super
|
41
55
|
end
|
42
56
|
end
|
data/omgf.gemspec
CHANGED
@@ -23,6 +23,8 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_dependency('kgio', ['~> 2.7'])
|
24
24
|
s.add_dependency('kcar', ['~> 0.3'])
|
25
25
|
s.add_dependency('mogilefs-client', ['~> 3.1'])
|
26
|
+
s.add_development_dependency('regurgitator')
|
27
|
+
s.add_development_dependency('sqlite3')
|
26
28
|
|
27
29
|
s.licenses = %w(AGPLv3+)
|
28
30
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Copyright (C) 2008-2013, Eric Wong <normalperson@yhbt.net>
|
2
|
+
# License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
|
3
|
+
require './test/integration'
|
4
|
+
require 'rack/mock'
|
5
|
+
require 'open-uri'
|
6
|
+
require 'omgf/hysterical_raisins'
|
7
|
+
require 'digest/md5'
|
8
|
+
require 'sequel' # regurgitator uses sequel
|
9
|
+
Sequel.extension :migration, :schema_dumper
|
10
|
+
|
11
|
+
class TestRegurgitator < Test::Unit::TestCase
|
12
|
+
include TestMogileFSIntegration
|
13
|
+
def setup
|
14
|
+
setup_mogilefs
|
15
|
+
@admin.create_domain("testdom")
|
16
|
+
@err = StringIO.new
|
17
|
+
@mirror = Tempfile.new("db.mirror")
|
18
|
+
logger = Logger.new(@err)
|
19
|
+
@opts = { "rack.logger" => logger }
|
20
|
+
@orig_db = Sequel.connect("sqlite://#{@dbname.path}")
|
21
|
+
@mirror_db = Sequel.connect("sqlite://#{@mirror.path}")
|
22
|
+
mig = @orig_db.dump_schema_migration(:indexes => false, :same_db => true)
|
23
|
+
mig = eval(mig)
|
24
|
+
mig.apply(@mirror_db, :up)
|
25
|
+
omgf_opts = {
|
26
|
+
:hosts => @hosts,
|
27
|
+
:logger => logger,
|
28
|
+
:db => @mirror_db,
|
29
|
+
}
|
30
|
+
@app = OMGF::HystericalRaisins.new(omgf_opts)
|
31
|
+
@req = Rack::MockRequest.new(@app)
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_recent
|
35
|
+
s = TCPSocket.new(@test_host, @tracker_port)
|
36
|
+
s.write("!recent\r\n")
|
37
|
+
lines = []
|
38
|
+
while line = s.gets
|
39
|
+
break if line =~ /\A\.\r?\n/
|
40
|
+
lines << line
|
41
|
+
end
|
42
|
+
lines
|
43
|
+
ensure
|
44
|
+
s.close if s
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_listing
|
48
|
+
# missing domain
|
49
|
+
resp = @req.get("/non-existent", @opts)
|
50
|
+
assert_equal 0, @err.string.size
|
51
|
+
assert_equal 404, resp.status, "non-existent domain listing gives 404"
|
52
|
+
lines = get_recent
|
53
|
+
assert(/non-existent/ !~ lines.join, lines.inspect)
|
54
|
+
|
55
|
+
# corrupt the mirror
|
56
|
+
@mirror_db.disconnect
|
57
|
+
@mirror.syswrite("\0" * (4096 * 1024))
|
58
|
+
|
59
|
+
resp = @req.get("/non-existant", @opts)
|
60
|
+
assert_match(/retrying mg_list_keys against tracker/, @err.string)
|
61
|
+
assert_equal 404, resp.status, "non-existant domain listing gives 404"
|
62
|
+
lines = get_recent
|
63
|
+
assert_match(/non-existant/, lines.join, lines.inspect)
|
64
|
+
end
|
65
|
+
|
66
|
+
def teardown
|
67
|
+
teardown_mogilefs
|
68
|
+
end
|
69
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: !binary |-
|
3
3
|
b21nZg==
|
4
4
|
version: !ruby/object:Gem::Version
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.6
|
6
6
|
prerelease:
|
7
7
|
platform: ruby
|
8
8
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-
|
14
|
+
date: 2013-05-11 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: !binary |-
|
@@ -97,6 +97,40 @@ dependencies:
|
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: !binary |-
|
99
99
|
My4x
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: !binary |-
|
102
|
+
cmVndXJnaXRhdG9y
|
103
|
+
requirement: !ruby/object:Gem::Requirement
|
104
|
+
none: false
|
105
|
+
requirements:
|
106
|
+
- - ! '>='
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
type: :development
|
110
|
+
prerelease: false
|
111
|
+
version_requirements: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ! '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: !binary |-
|
119
|
+
c3FsaXRlMw==
|
120
|
+
requirement: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
type: :development
|
127
|
+
prerelease: false
|
128
|
+
version_requirements: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
100
134
|
description: ! 'OMGF provides an HTTP interface for {MogileFS}[http://mogilefs.org],
|
101
135
|
|
102
136
|
allowing clients to connect to MogileFS without needing specialized
|
@@ -146,6 +180,7 @@ files:
|
|
146
180
|
- test/test_hyst.rb
|
147
181
|
- test/test_hysterical_raisins.rb
|
148
182
|
- test/test_hysterical_raisins_cmogstored.rb
|
183
|
+
- test/test_regurgitator.rb
|
149
184
|
homepage: http://bogomips.org/omgf/
|
150
185
|
licenses:
|
151
186
|
- !binary |-
|
@@ -172,14 +207,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
207
|
version: '0'
|
173
208
|
requirements: []
|
174
209
|
rubyforge_project:
|
175
|
-
rubygems_version: 1.8.
|
210
|
+
rubygems_version: 1.8.21
|
176
211
|
signing_key:
|
177
212
|
specification_version: 3
|
178
213
|
summary: hysterical REST API for MogileFS using Rack
|
179
214
|
test_files:
|
180
|
-
- !binary |-
|
181
|
-
dGVzdC90ZXN0X2h5c3RlcmljYWxfcmFpc2lucy5yYg==
|
182
215
|
- !binary |-
|
183
216
|
dGVzdC90ZXN0X2h5c3RlcmljYWxfcmFpc2luc19jbW9nc3RvcmVkLnJi
|
184
217
|
- !binary |-
|
185
218
|
dGVzdC90ZXN0X2h5c3QucmI=
|
219
|
+
- !binary |-
|
220
|
+
dGVzdC90ZXN0X3JlZ3VyZ2l0YXRvci5yYg==
|
221
|
+
- !binary |-
|
222
|
+
dGVzdC90ZXN0X2h5c3RlcmljYWxfcmFpc2lucy5yYg==
|
223
|
+
has_rdoc:
|