about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2012-10-30 23:12:10 +0000
committerEric Wong <normalperson@yhbt.net>2012-10-30 23:12:10 +0000
commit9b1339dfe76e04e4a21d39301d2236859dc03bfd (patch)
treea8bc5998b08b3ed4eb2ef0f21703e7bb1d4fbffa
parent42abd93b948881afe5c3e9d04ceb5f40fda4472c (diff)
downloadmogilefs-client-9b1339dfe76e04e4a21d39301d2236859dc03bfd.tar.gz
This lets us send unsupported/new arguments to plugins
and matches the functionality of the Perl client library.
-rw-r--r--lib/mogilefs/mogilefs.rb3
-rw-r--r--lib/mogilefs/new_file/common.rb4
-rw-r--r--test/test_fresh.rb26
3 files changed, 31 insertions, 2 deletions
diff --git a/lib/mogilefs/mogilefs.rb b/lib/mogilefs/mogilefs.rb
index 76325cb..7503bba 100644
--- a/lib/mogilefs/mogilefs.rb
+++ b/lib/mogilefs/mogilefs.rb
@@ -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}"]] }
diff --git a/lib/mogilefs/new_file/common.rb b/lib/mogilefs/new_file/common.rb
index 1d2b1a0..b901f67 100644
--- a/lib/mogilefs/new_file/common.rb
+++ b/lib/mogilefs/new_file/common.rb
@@ -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)
diff --git a/test/test_fresh.rb b/test/test_fresh.rb
index 369e363..a87ebd5 100644
--- a/test/test_fresh.rb
+++ b/test/test_fresh.rb
@@ -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