diff options
author | Eric Wong <normalperson@yhbt.net> | 2012-10-24 07:27:18 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2012-10-24 07:27:18 +0000 |
commit | 2cbeef0f29be4de815b802e705528b6f05d1bb29 (patch) | |
tree | 856b6bb39f6813074c6a3856ccb2cdb0e56275bc /lib/mogilefs | |
parent | 231d1a91292f39d42df2317a2fe4eaa96fd68f41 (diff) | |
download | mogilefs-client-2cbeef0f29be4de815b802e705528b6f05d1bb29.tar.gz |
Given StringIO objects are already in memory, NHP can make small uploads which fit into memory faster. Large uploads (using big_io or :largefile => :stream still go through IO.copy_stream for now)
Diffstat (limited to 'lib/mogilefs')
-rw-r--r-- | lib/mogilefs/http_file.rb | 31 | ||||
-rw-r--r-- | lib/mogilefs/new_file/content_range.rb | 15 |
2 files changed, 31 insertions, 15 deletions
diff --git a/lib/mogilefs/http_file.rb b/lib/mogilefs/http_file.rb index 7871940..c96e695 100644 --- a/lib/mogilefs/http_file.rb +++ b/lib/mogilefs/http_file.rb @@ -136,14 +136,41 @@ class MogileFS::HTTPFile < StringIO sock.close if sock end + def nhp_put(devid, uri) + clen = @opts[:content_length] + if clen && clen != size + raise MogileFS::SizeMismatchError, + ":content_length expected: #{clen.inspect}, actual: #{size}" + end + + put = Net::HTTP::Put.new(uri.path) + put["Content-Type"] = "application/octet-stream" + if md5 = @opts[:content_md5] + if md5.respond_to?(:call) + md5 = md5.call.strip + elsif md5 == :trailer + md5 = [ Digest::MD5.digest(string) ].pack("m").chomp! + end + put["Content-MD5"] = md5 + end + put.body = string + res = MogileFS::NHP.request(uri, put) + return size if Net::HTTPSuccess === res + raise BadResponseError, "#{res.code} #{res.message}" + rescue => e + /\ANet::/ =~ "#{e.class}" and + raise RetryableError, "#{e.message} (#{e.class})", e.backtrace + raise + end + def commit errors = nil @dests.each do |devid, path| begin uri = URI.parse(path) - bytes_uploaded = upload(devid, uri) + bytes_uploaded = size > 0 ? nhp_put(devid, uri) : upload(devid, uri) return create_close(devid, uri, bytes_uploaded) - rescue SystemCallError, RetryableError => e + rescue Timeout::Error, SystemCallError, RetryableError => e errors ||= [] errors << "#{path} - #{e.message} (#{e.class})" end diff --git a/lib/mogilefs/new_file/content_range.rb b/lib/mogilefs/new_file/content_range.rb index 8dd4725..757fccc 100644 --- a/lib/mogilefs/new_file/content_range.rb +++ b/lib/mogilefs/new_file/content_range.rb @@ -1,6 +1,5 @@ # -*- encoding: binary -*- # here are internal implementation details, do not rely on them in your code -require 'net/http' require 'mogilefs/new_file/writer' # an IO-like object @@ -9,18 +8,8 @@ class MogileFS::NewFile::ContentRange include MogileFS::NewFile::Common attr_reader :md5 - # :stopdoc: - begin - require 'net/http/persistent' - NHP = Net::HTTP::Persistent.new('mogilefs') - - def hit(uri, req) - NHP.request(uri, req).value - end - rescue LoadError - def hit(uri, req) - Net::HTTP.start(uri.host, uri.port) { |h| h.request(req).value } - end + def hit(uri, req) + MogileFS::NHP.request(uri, req).value end # :startdoc: |