new_file: support create_open_args and create_close_args
authorEric Wong <normalperson@yhbt.net>
Tue, 30 Oct 2012 23:12:10 +0000 (30 23:12 +0000)
committerEric Wong <normalperson@yhbt.net>
Tue, 30 Oct 2012 23:12:10 +0000 (30 23:12 +0000)
This lets us send unsupported/new arguments to plugins
and matches the functionality of the Perl client library.

lib/mogilefs/mogilefs.rb
lib/mogilefs/new_file/common.rb
test/test_fresh.rb

index 76325cb..7503bba 100644 (file)
@@ -257,12 +257,13 @@ class MogileFS::MogileFS < MogileFS::Client
     case args
     when Hash
       opts[:domain] = args[:domain]
+      open_args = args[:create_open_args]
       klass = args[:class] and "default" != klass and opts[:class] = klass
     when String
       opts[:class] = args if "default" != args
     end
     opts[:domain] ||= @domain
-    res = @backend.create_open(opts)
+    res = @backend.create_open(open_args ? open_args.merge(opts) : opts)
 
     dests = if dev_count = res['dev_count'] # multi_dest succeeded
       (1..dev_count.to_i).map { |i| [res["devid_#{i}"], res["path_#{i}"]] }
index 1d2b1a0..b901f67 100644 (file)
@@ -35,6 +35,8 @@ module MogileFS::NewFile::Common
   end
 
   def create_close(devid, uri, bytes_uploaded)
+    close_args = @opts[:create_close_args]
+
     dest_info = @opts[:info] ||= {}
     dest_info["fid"] = @opts[:fid].to_i
     dest_info["key"] = @opts[:key]
@@ -62,7 +64,7 @@ module MogileFS::NewFile::Common
     # twice will hurt us...
     backend.noop
 
-    backend.create_close(dest_info)
+    backend.create_close(close_args ? close_args.merge(dest_info) : dest_info)
 
     # make this look like file_info + get_uris
     dest_info.delete(:checksumverify)
index 369e363..a87ebd5 100644 (file)
@@ -90,4 +90,30 @@ class TestMogFresh < Test::Unit::TestCase
   ensure
     @admin.delete_class @domain, "check"
   end
+
+  def test_create_open_close_opts
+    add_host_device_domain
+    client = MogileFS::MogileFS.new :hosts => @hosts, :domain => @domain
+    socket = client.backend.socket
+    args = {
+      :create_open_args => { :hello => "world" },
+      :create_close_args => { :farewell => "goodnight" },
+    }
+    io = client.new_file("foo", args)
+    socket.write "!recent\n"
+    buf = ""
+    buf << socket.readpartial(666) until buf =~ /\.\r?\n\z/
+    line = buf.split(/\r?\n/).grep(/\screate_open\s/)[0]
+    assert_equal 0, buf.split(/\r?\n/).grep(/\screate_close\s/).size
+    assert_equal 0, buf.split(/\r?\n/).grep(/\sfarewell\s/).size
+    assert_match /\bhello=world\b/, line
+    assert_equal 1, io.write('.')
+    assert_nil io.close
+
+    socket.write "!recent\n"
+    buf = ""
+    buf << socket.readpartial(666) until buf =~ /\.\r?\n\z/
+    line = buf.split(/\r?\n/).grep(/\screate_close\s/)[0]
+    assert_match /\bfarewell=goodnight\b/, line
+  end
 end