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