about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2012-10-22 20:18:06 +0000
committerEric Wong <normalperson@yhbt.net>2012-10-22 21:02:43 +0000
commit231d1a91292f39d42df2317a2fe4eaa96fd68f41 (patch)
tree5a8d0a396448f0df28cdbf3b6293c7b51d18044e /lib
parentc5d000337cdcbb15827258d6fd6b6830e8afcd59 (diff)
downloadmogilefs-client-231d1a91292f39d42df2317a2fe4eaa96fd68f41.tar.gz
This allows clients to avoid calling #file_info or #get_uris
immediate after uploading a file to MogileFS.  This can speed
things up for cache-using clients with write-through caching.
Diffstat (limited to 'lib')
-rw-r--r--lib/mogilefs/mogilefs.rb8
-rw-r--r--lib/mogilefs/new_file/common.rb33
2 files changed, 29 insertions, 12 deletions
diff --git a/lib/mogilefs/mogilefs.rb b/lib/mogilefs/mogilefs.rb
index f5cb096..76325cb 100644
--- a/lib/mogilefs/mogilefs.rb
+++ b/lib/mogilefs/mogilefs.rb
@@ -244,6 +244,13 @@ class MogileFS::MogileFS < MogileFS::Client
   #   Keep in mind most HTTP servers do not support HTTP trailers, so
   #   passing a String is usually the safest way to use this.
   #
+  # [:info => Hash]
+  #
+  #   This is an empty hash that will be filled the same information
+  #   MogileFS::MogileFS#file_info.
+  #
+  #   Additionally, it contains one additional key: :uris,
+  #   an array of URI::HTTP objects to the stored destinations
   def new_file(key, args = nil, bytes = nil) # :yields: file
     raise MogileFS::ReadOnlyError if readonly?
     opts = { :key => key, :multi_dest => 1 }
@@ -275,6 +282,7 @@ class MogileFS::MogileFS < MogileFS::Client
     opts[:content_length] ||= bytes if bytes
     opts[:new_file_max_time] ||= @new_file_max_time
     opts[:start_time] = Time.now
+    info = opts[:info] and info["class"] = klass || "default"
 
     case (dests[0][1] rescue nil)
     when %r{\Ahttp://}
diff --git a/lib/mogilefs/new_file/common.rb b/lib/mogilefs/new_file/common.rb
index e959a21..9b6511d 100644
--- a/lib/mogilefs/new_file/common.rb
+++ b/lib/mogilefs/new_file/common.rb
@@ -34,21 +34,21 @@ module MogileFS::NewFile::Common
   end
 
   def create_close(devid, uri, bytes_uploaded)
-    args = {
-      :fid => @opts[:fid],
-      :devid => devid,
-      :key => @opts[:key],
-      :domain => @opts[:domain],
-      :size => bytes_uploaded,
-      :path => uri.to_s,
-    }
+    dest_info = @opts[:info] ||= {}
+    dest_info["fid"] = @opts[:fid].to_i
+    dest_info["key"] = @opts[:key]
+    dest_info["domain"] = @opts[:domain]
+    dest_info[:devid] = devid
+    dest_info[:path] = uri.to_s
+    dest_info[:size] = bytes_uploaded
     if @md5
-      args[:checksum] = "MD5:#{@md5.hexdigest}"
+      dest_info["checksum"] = "MD5:#{@md5.hexdigest}"
     elsif String === @opts[:content_md5]
       hex = @opts[:content_md5].unpack('m')[0].unpack('H*')[0]
-      args[:checksum] = "MD5:#{hex}"
+      dest_info["checksum"] = "MD5:#{hex}"
     end
-    args[:checksumverify] = 1 if @opts[:checksumverify]
+
+    dest_info[:checksumverify] = 1 if @opts[:checksumverify]
     backend = @opts[:backend]
 
     # upload could've taken a long time, ping and try to ensure socket
@@ -61,7 +61,16 @@ module MogileFS::NewFile::Common
     # twice will hurt us...
     backend.noop
 
-    backend.create_close(args)
+    backend.create_close(dest_info)
+
+    # make this look like file_info + get_uris
+    dest_info.delete(:checksumverify)
+    dest_info.delete(:path)
+    dest_info[:uris] = [ uri ]
+    dest_info["devcount"] = 1
+    dest_info["devids"] = [ dest_info.delete(:devid).to_i ]
+    dest_info["length"] = dest_info.delete(:size)
+
     bytes_uploaded
   end