omgf 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@
2
2
  CONSTANT = "OMGF::VERSION"
3
3
  RVF = "lib/omgf/version.rb"
4
4
  GVF = "GIT-VERSION-FILE"
5
- DEF_VER = "v0.0.5"
5
+ DEF_VER = "v0.0.6"
6
6
  vn = DEF_VER
7
7
 
8
8
  # First see if there is a version file (included in release tarballs),
@@ -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
@@ -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
@@ -15,28 +15,42 @@ module OMGF::Regurgitator
15
15
  get_dmid(domain) or raise MogileFS::Backend::UnregDomainError
16
16
  end
17
17
 
18
- def mg_list_keys(domain, prefix, after, limit)
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
@@ -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
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-03-13 00:00:00.000000000 Z
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.23
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: