about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2011-12-06 13:25:22 -0800
committerEric Wong <normalperson@yhbt.net>2011-12-06 16:49:18 -0800
commitd74fad403f23c1ee36b9fbf276d12b12ef5d92d1 (patch)
treea8f806c30a552d42364a7be119f5f6a197247ee4
parent296977523d04e184b954f5a00e9463dea0d8e8d6 (diff)
downloadmogilefs-client-d74fad403f23c1ee36b9fbf276d12b12ef5d92d1.tar.gz
Users will be able to tweak these themselves in OS-dependent
ways.  It's probably better to rely on protocol-level timeouts
when the HTTP server should be on a trusted network.
-rw-r--r--lib/mogilefs/http_file.rb37
1 files changed, 4 insertions, 33 deletions
diff --git a/lib/mogilefs/http_file.rb b/lib/mogilefs/http_file.rb
index 4d88c78..b8bfd48 100644
--- a/lib/mogilefs/http_file.rb
+++ b/lib/mogilefs/http_file.rb
@@ -22,34 +22,7 @@ class MogileFS::HTTPFile < StringIO
   end
   class NonRetryableError < MogileFS::Error; end
 
-  class HTTPSock < MogileFS::Socket
-    attr_accessor :start
-
-    # Increase timeout as we become more invested in uploading with
-    # this socket.  The server could be experiencing I/O delays
-    # from large uploads because the sysadmin forgot to tune the
-    # VM sysctls for handling large files.
-    def write(buf)
-      timed_write(buf, Time.now - @start + 5.0)
-    end
-  end
-
-  # :stopdoc:
   MD5_TRAILER_NODES = {} # :nodoc: # EXPERIMENTAL
-  class << self
-    attr_accessor :response_timeout_cb
-  end
-
-  # temporary directories (nginx) may not be configured on the
-  # same device, necessitating a time-consuming full file copy
-  # instead of a quick rename(2)/link(2) operation
-  @response_timeout_cb = lambda do |elapsed_time, bytes_uploaded|
-    mbytes_uploaded = bytes_uploaded / (1024.0 * 1024.0)
-    # assumes worst case is 10M/s on the remote storage disk
-    t = mbytes_uploaded * 10 + elapsed_time
-    t < 5 ? 5 : t
-  end
-  # :startdoc:
 
   ##
   # The big_io name in case we have file > 256M
@@ -132,9 +105,8 @@ class MogileFS::HTTPFile < StringIO
   # Writes an HTTP PUT request to +sock+ to upload the file and
   # returns file size if the socket finished writing
   def upload(devid, uri) # :nodoc:
-    start = Time.now
-    sock = HTTPSock.tcp(uri.host, uri.port)
-    sock.start = start
+    sock = MogileFS::Socket.tcp(uri.host, uri.port)
+    sock.setsockopt(Socket::IPPROTO_TCP, Socket::SO_KEEPALIVE, 1)
     file_size = length
 
     if @streaming_io
@@ -159,9 +131,8 @@ class MogileFS::HTTPFile < StringIO
       request_put(sock, uri, file_size, self)
     end
 
-    tout = self.class.response_timeout_cb.call(Time.now - start, file_size)
-
-    case line = sock.timed_read(23, "", tout)
+    # mostly relying on SO_KEEPALIVE to timeout
+    case line = sock.timed_read(23, "", 7200)
     when %r{^HTTP/\d\.\d\s+(2\d\d)\s} # success!
       file_size
     when nil