regurgitator 0.8.0 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e25137895b8a81aec30d1df214183867db1814e5
4
- data.tar.gz: 64d515de854a2f3acfc53b7bd752abe0c71000f4
3
+ metadata.gz: a2d383effa64f09d324b76580dd3f4c2750759b6
4
+ data.tar.gz: ff6b44450160b68be22d4b86304e5589f77ffa3a
5
5
  SHA512:
6
- metadata.gz: e19aa4469529c3c1a4a4ac16212dd6594155c040017e56c0a0f092f92cd2777338e42e86c88f7bf687fac1d86224059725542291841384c935a1e53fa0706643
7
- data.tar.gz: ca163773416ad27217eaaecab8e0ab8a3c39652397e0e317020772da23615a1178ccf994ea147c2f2ff7e237f771c457283b63097ce9263acb6ddbedd83a5daf
6
+ metadata.gz: f1a18579be3d5a719e6fb212c1d246fcdf0c693a7e8a85df87fd8763b550e58f92454accd35bb6d261adcacf3bcee7a44a66ad0b879161edb147df84ea6d1fb2
7
+ data.tar.gz: cd56b2b2b5ec792d89763fceb8b0e6eac7550431053e740cbe193687be3a6bde57c84ada185a46d37a8cc826bee0db6df839ece9da521a4c0fe65de81b25ceb1
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
3
  GVF=GIT-VERSION-FILE
4
- DEF_VER=v0.8.0
4
+ DEF_VER=v0.9.0
5
5
 
6
6
  LF='
7
7
  '
@@ -6,15 +6,6 @@ require_relative 'server_settings'
6
6
  module Regurgitator::Device # :nodoc:
7
7
  include Regurgitator::ServerSettings
8
8
 
9
- REFRESH_DEVICE = <<-EOS
10
- SELECT d.devid, h.hostip, h.http_port, h.http_get_port
11
- FROM device d
12
- LEFT JOIN host h ON d.hostid = h.hostid
13
- WHERE d.status IN ('readonly','alive','drain') AND h.status = 'alive'
14
- EOS
15
-
16
- DEVICES_ON = 'SELECT devid FROM file_on WHERE fid = ?'
17
-
18
9
  def device_init
19
10
  server_settings_init
20
11
  @dev_cache_mtime = 0
@@ -41,7 +32,14 @@ module Regurgitator::Device # :nodoc:
41
32
  return @dev_cache if !force && ((Regurgitator.now - @dev_cache_mtime) < 60)
42
33
  tmp = {}.compare_by_identity
43
34
  refresh_zone(force)
44
- @db[REFRESH_DEVICE].each do |x|
35
+
36
+ sql = <<-EOS.freeze
37
+ SELECT d.devid, h.hostip, h.http_port, h.http_get_port
38
+ FROM device d
39
+ LEFT JOIN host h ON d.hostid = h.hostid
40
+ WHERE d.status IN ('readonly','alive','drain') AND h.status = 'alive'
41
+ EOS
42
+ @db[sql].each do |x|
45
43
  # devices in "drain" status may hit raciness try those as a last resort
46
44
  x[:preferred] = !!(x[:d_status] =~ %r{\A(?:readonly|alive)\z})
47
45
  hostip = x[:hostip]
@@ -2,8 +2,6 @@
2
2
  # helpers for domain lookups
3
3
  module Regurgitator::Domain # :nodoc:
4
4
 
5
- REFRESH_DOMAIN = 'SELECT dmid,namespace FROM domain' # :nodoc:
6
-
7
5
  def domain_init
8
6
  @domain_lock = Mutex.new
9
7
  @domain_cache_mtime = 0
@@ -26,7 +24,9 @@ module Regurgitator::Domain # :nodoc:
26
24
  def refresh_domain_unlocked # :nodoc:
27
25
  return @domain_cache if ((Regurgitator.now - @domain_cache_mtime) < 15)
28
26
  tmp = {}
29
- @db[REFRESH_DOMAIN].each { |x| tmp[x[:namespace].freeze] = x[:dmid] }
27
+ @db['SELECT dmid,namespace FROM domain'.freeze].each do |x|
28
+ tmp[x[:namespace].freeze] = x[:dmid]
29
+ end
30
30
  @domain_cache_mtime = Regurgitator.now
31
31
  @domain_cache = tmp
32
32
  end
@@ -71,6 +71,7 @@ module Regurgitator::Endpoint # :nodoc:
71
71
  status, headers, body = r = Regurgitator::FileRequest.run(env, uris)
72
72
  filename!(env, headers, dkey)
73
73
  headers['ETag'] = %("#{info[:fid]}")
74
+ headers.delete('Connection'.freeze)
74
75
 
75
76
  case env["REQUEST_METHOD"]
76
77
  when "GET"
@@ -7,8 +7,6 @@ module Regurgitator::FileInfo # :nodoc:
7
7
  include Regurgitator::Domain
8
8
  include Regurgitator::Device
9
9
 
10
- FILE_INFO = 'SELECT fid,length FROM file WHERE dmid = ? AND dkey = ? LIMIT 1'
11
-
12
10
  def file_info_init
13
11
  domain_init
14
12
  device_init
@@ -27,7 +25,11 @@ module Regurgitator::FileInfo # :nodoc:
27
25
  def file_info(env, domain, dkey, update = false)
28
26
  dmid = get_dmid(domain) or return
29
27
  devices = refresh_device(update)
30
- info = @db[FILE_INFO, dmid, dkey].first or return
28
+
29
+ info = @db[
30
+ 'SELECT fid,length FROM file WHERE dmid = ? AND dkey = ? LIMIT 1'.freeze,
31
+ dmid, dkey
32
+ ].first or return
31
33
  0 == info[:length] and return info
32
34
  fid = info[:fid]
33
35
  read_uris = Hash.new { |h,k| h[k] = [] }
@@ -35,12 +37,12 @@ module Regurgitator::FileInfo # :nodoc:
35
37
 
36
38
  zone = env['regurgitator.zone']
37
39
 
38
- @db[DEVICES_ON, fid].each do |x|
40
+ @db['SELECT devid FROM file_on WHERE fid = ?'.freeze, fid].each do |x|
39
41
  devinfo = devices[x[:devid]] or next
40
42
  fid >= 10_000_000_000 and next # TODO: support larger FIDs
41
43
 
42
44
  uris = devinfo[:uris][:pri]
43
- nfid = sprintf('%010u', fid)
45
+ nfid = sprintf('%010u'.freeze, fid)
44
46
  /\A(\d)(\d{3})(\d{3})(?:\d{3})\z/ =~ nfid
45
47
  fid_path = "/#$1/#$2/#$3/#{nfid}.fid"
46
48
  uris = uris.map do |u|
@@ -38,9 +38,9 @@ class Regurgitator::FileRequest < HTTP_Spew::Request # :nodoc:
38
38
  }
39
39
  PASS_HEADERS.each { |k| pass = env[k] and req[k] = pass }
40
40
  tmp = HTTP_Spew.wait(1, uri_group.map { |uris| new(req, uris) }, timeout)
41
- tmp.delete_if { |t| t.error }
41
+ tmp.delete_if(&:error)
42
42
  ready = tmp.shift or raise Regurgitator::NoDevices, "no readable devices"
43
- tmp.each { |t| t.close }
43
+ tmp.each(&:close)
44
44
  ready.response
45
45
  end
46
46
  end
@@ -19,7 +19,8 @@ module Regurgitator::ListKeys # :nodoc:
19
19
  limit = LIST_KEYS_MAX if limit > LIST_KEYS_MAX
20
20
  sql = "SELECT fid,dkey,length,devcount,classid " \
21
21
  "FROM file WHERE dmid = #{dmid}"
22
- sql << " AND dkey LIKE /*! BINARY */ #{@db.literal(prefix+'%')}" if prefix
22
+ prefix and
23
+ sql << " AND dkey LIKE /*! BINARY */ #{@db.literal(prefix+'%'.freeze)}"
23
24
  sql << " AND dkey > #{@db.literal(after)}" if after
24
25
  sql << " ORDER BY dkey LIMIT #{limit}"
25
26
 
@@ -21,10 +21,10 @@ class Regurgitator::LocalFile # :nodoc:
21
21
  size = stat.size
22
22
 
23
23
  headers = {
24
- "Content-Type" => "application/octet-stream", # always ".fid"
24
+ "Content-Type" => "application/octet-stream".freeze, # always ".fid"
25
25
  "Content-Length" => size.to_s,
26
26
  "Last-Modified" => stat.mtime.httpdate,
27
- "Accept-Ranges" => "bytes",
27
+ "Accept-Ranges" => "bytes".freeze,
28
28
  }
29
29
  @response = [ 200, headers ]
30
30
 
@@ -38,7 +38,7 @@ class Regurgitator::LocalFile # :nodoc:
38
38
  else
39
39
  @response[0] = 416
40
40
  headers["Content-Range"] = "bytes */#{size}"
41
- headers["Content-Length"] = '0'
41
+ headers["Content-Length"] = '0'.freeze
42
42
  @response << []
43
43
  return
44
44
  end
@@ -72,6 +72,7 @@ class Regurgitator::LocalFile # :nodoc:
72
72
  yield buf
73
73
  end
74
74
  end
75
+ buf.clear
75
76
  end
76
77
  end
77
78
 
@@ -4,8 +4,6 @@
4
4
  require_relative 'local'
5
5
  module Regurgitator::ServerSettings # :nodoc:
6
6
 
7
- SETTINGS_LOOKUP = 'SELECT value FROM server_settings WHERE field = ? LIMIT 1'
8
-
9
7
  def server_settings_init
10
8
  @zone_cache_mtime = 0
11
9
  @zone_cache = nil
@@ -23,10 +21,12 @@ module Regurgitator::ServerSettings # :nodoc:
23
21
  def refresh_zone_unlocked(force)
24
22
  return @zone_cache if !force && ((Regurgitator.now-@zone_cache_mtime) < 60)
25
23
  tmp = Patricia.new
24
+ sql = 'SELECT value FROM server_settings WHERE field = ? LIMIT 1'.freeze
25
+
26
26
  begin
27
- row = @db[SETTINGS_LOOKUP, 'network_zones'].first or return tmp
27
+ row = @db[sql, 'network_zones'.freeze].first or return tmp
28
28
  row[:value].split(/\s*,\s*/).each do |zone|
29
- row = @db[SETTINGS_LOOKUP, "zone_#{zone}"].first or next
29
+ row = @db[sql, "zone_#{zone}"].first or next
30
30
  begin
31
31
  tmp.add(row[:value], zone)
32
32
  rescue ArgumentError
@@ -1,29 +1,24 @@
1
1
  # -*- encoding: binary -*-
2
- ENV["VERSION"] or abort "VERSION= must be specified"
3
- manifest = File.readlines('.manifest').map! { |x| x.chomp! }
4
- require 'olddoc'
5
- extend Olddoc::Gemspec
6
- name, summary, title = readme_metadata
2
+ manifest = File.exist?('.manifest') ?
3
+ IO.readlines('.manifest').map!(&:chomp!) : `git ls-files`.split("\n")
7
4
 
8
5
  Gem::Specification.new do |s|
9
6
  s.name = %q{regurgitator}
10
- s.version = ENV["VERSION"].dup
11
-
12
- s.authors = ["Regurgitators"]
13
- s.description = readme_description
14
- s.email = %q{e@80x24.org}
15
- s.extra_rdoc_files = extra_rdoc_files(manifest)
7
+ s.version = (ENV['VERSION'].dup || '0.9.0')
8
+ s.authors = ['regurgitator hackers']
9
+ s.description = File.read('README').split("\n\n")[1]
10
+ s.email = %q{regurgitator-public@bogomips.org}
11
+ s.extra_rdoc_files = IO.readlines('.document').map!(&:chomp!).keep_if do |f|
12
+ File.exist?(f)
13
+ end
16
14
  s.files = manifest
17
- s.homepage = Olddoc.config['rdoc_url']
18
- s.summary = summary
15
+ s.homepage = 'https://bogomips.org/regurgitator/'
16
+ s.summary = 'regurgitator - read-only Rack endpoints for MogileFS'
19
17
  s.test_files = Dir["test/test_*.rb"]
20
-
21
18
  s.add_dependency("rack", ['~> 2.0'])
22
19
  s.add_dependency("sequel", ["~> 4.0"])
23
20
  s.add_dependency("http_spew", ['~> 0.5'])
24
21
  s.add_dependency("rpatricia", ["~> 1.0"])
25
- s.add_development_dependency('olddoc', "~> 1.0")
26
-
27
22
  s.required_ruby_version = '>= 2.1'
28
23
  s.licenses = %w(GPL-2.0+)
29
24
  end
@@ -1,6 +1,6 @@
1
1
  #!/bin/sh
2
2
  . ./test-lib.sh
3
- t_plan 7 "DomainHost tests"
3
+ t_plan 8 "DomainHost tests"
4
4
 
5
5
  t_begin "setup" && {
6
6
  setup domain_host.ru
@@ -50,11 +50,14 @@ t_begin "reproxy existing file" && {
50
50
  grep '^< Etag: "1"' $curl_err
51
51
  }
52
52
 
53
- t_begin "using CNAME host name" && {
53
+ t_begin "update host name and sleep 16s for cache refresh" && {
54
54
  sqlite3 $db <<EOF
55
55
  UPDATE domain SET namespace = 'i-have-a-cname.example.org'
56
56
  WHERE namespace = 'd';
57
57
  EOF
58
+ }
59
+
60
+ t_begin 'retry using CNAME host name' && {
58
61
  sleep 16
59
62
  cksum="$(curl -sSvf 2> $curl_err \
60
63
  -H Host:i-have-a-cname.example.org \
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: regurgitator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
- - Regurgitators
7
+ - regurgitator hackers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-02 00:00:00.000000000 Z
11
+ date: 2017-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -66,41 +66,14 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.0'
69
- - !ruby/object:Gem::Dependency
70
- name: olddoc
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.0'
83
69
  description: |-
84
70
  regurgitator is a GPL-licensed library and Rack middleware for
85
71
  serving files stored in MogileFS. It can be embedded inside
86
72
  any existing Rack application or be used as a standalone Rack app.
87
- email: e@80x24.org
73
+ email: regurgitator-public@bogomips.org
88
74
  executables: []
89
75
  extensions: []
90
76
  extra_rdoc_files:
91
- - lib/regurgitator.rb
92
- - lib/regurgitator/device.rb
93
- - lib/regurgitator/domain.rb
94
- - lib/regurgitator/domain_host.rb
95
- - lib/regurgitator/domain_path.rb
96
- - lib/regurgitator/endpoint.rb
97
- - lib/regurgitator/file_info.rb
98
- - lib/regurgitator/file_request.rb
99
- - lib/regurgitator/list_keys.rb
100
- - lib/regurgitator/local.rb
101
- - lib/regurgitator/local_file.rb
102
- - lib/regurgitator/one_domain.rb
103
- - lib/regurgitator/server_settings.rb
104
77
  - NEWS
105
78
  - README
106
79
  - LICENSE
@@ -172,10 +145,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
172
145
  version: '0'
173
146
  requirements: []
174
147
  rubyforge_project:
175
- rubygems_version: 2.6.7
148
+ rubygems_version: 2.6.12
176
149
  signing_key:
177
150
  specification_version: 4
178
- summary: read-only Rack endpoints for MogileFS
151
+ summary: regurgitator - read-only Rack endpoints for MogileFS
179
152
  test_files:
180
153
  - test/test_local.rb
181
154
  - test/test_server_settings.rb