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.
@@ -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: