about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2011-11-08 01:53:06 +0000
committerEric Wong <normalperson@yhbt.net>2011-11-08 01:53:06 +0000
commitfd5098ba0825d5ee603265a40e8c62b97191b7b6 (patch)
tree6505d865bfd2c5db1000b31c7d3bb2ed87892d75
parent088d88332564a5d09cf8a57695a53453ab59f686 (diff)
downloadmogilefs-client-fd5098ba0825d5ee603265a40e8c62b97191b7b6.tar.gz
This is a command added in MogileFS 2.45
-rw-r--r--lib/mogilefs/backend.rb1
-rw-r--r--lib/mogilefs/mogilefs.rb15
-rw-r--r--test/test_mogilefs_integration.rb18
3 files changed, 34 insertions, 0 deletions
diff --git a/lib/mogilefs/backend.rb b/lib/mogilefs/backend.rb
index ba9a398..7b52939 100644
--- a/lib/mogilefs/backend.rb
+++ b/lib/mogilefs/backend.rb
@@ -85,6 +85,7 @@ class MogileFS::Backend
   add_command :sleep
   add_command :rename
   add_command :list_keys
+  add_command :file_info
 
   # MogileFS::Backend commands
 
diff --git a/lib/mogilefs/mogilefs.rb b/lib/mogilefs/mogilefs.rb
index 97e07e2..ef01f5b 100644
--- a/lib/mogilefs/mogilefs.rb
+++ b/lib/mogilefs/mogilefs.rb
@@ -218,4 +218,19 @@ class MogileFS::MogileFS < MogileFS::Client
 
     [ keys, res['next_after'] ]
   end
+
+  # Used to return metadata about a file. Returns the domain, class, expected
+  # length, devcount, etc. Optionally device ids (not paths) can be returned as
+  # well if :devices is specified.
+  #
+  # Should be used for informational purposes, and not usually for dynamically
+  # serving files.
+  def file_info(key, args = nil)
+    opts = { :domain => @domain, :key => key }
+    args and devices = args[:devices] and opts[:devices] = devices ? 1 : 0
+    rv = @backend.file_info(opts)
+    %w(fid length devcount).each { |f| rv[f] = rv[f].to_i }
+    devids = rv["devids"] and rv["devids"] = devids.split(/,/).map! { |x| x.to_i }
+    rv
+  end
 end
diff --git a/test/test_mogilefs_integration.rb b/test/test_mogilefs_integration.rb
index 5f36404..cf8d178 100644
--- a/test/test_mogilefs_integration.rb
+++ b/test/test_mogilefs_integration.rb
@@ -61,4 +61,22 @@ class TestMogileFSIntegration < TestMogIntegration
       @client.store_file("non_rewindable", nil, tmp)
     end
   end
+
+  def test_file_info
+    assert_equal 3, @client.store_content("file_info", "default", "FOO")
+    res = @client.file_info("file_info")
+    assert_kind_of Integer, res["fid"]
+    assert_equal 3, res["length"]
+    assert ! res.include?("devids")
+    assert_kind_of Integer, res["devcount"]
+
+    res = @client.file_info("file_info", :devices => true)
+    assert_kind_of Integer, res["fid"]
+    assert_equal 3, res["length"]
+    assert_kind_of Integer, res["devcount"]
+    devids = res.delete("devids")
+    assert_instance_of Array, devids
+    devids.each { |devid| assert_kind_of Integer, devid }
+    assert_equal res["devcount"], devids.size
+  end
 end