about summary refs log tree commit homepage
path: root/lib/mogilefs
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2012-10-24 07:27:18 +0000
committerEric Wong <normalperson@yhbt.net>2012-10-24 07:27:18 +0000
commit2cbeef0f29be4de815b802e705528b6f05d1bb29 (patch)
tree856b6bb39f6813074c6a3856ccb2cdb0e56275bc /lib/mogilefs
parent231d1a91292f39d42df2317a2fe4eaa96fd68f41 (diff)
downloadmogilefs-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.rb31
-rw-r--r--lib/mogilefs/new_file/content_range.rb15
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: