From fd5098ba0825d5ee603265a40e8c62b97191b7b6 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 8 Nov 2011 01:53:06 +0000 Subject: [PATCH] add file_info command support and test This is a command added in MogileFS 2.45 --- lib/mogilefs/backend.rb | 1 + lib/mogilefs/mogilefs.rb | 15 +++++++++++++++ test/test_mogilefs_integration.rb | 18 ++++++++++++++++++ 3 files changed, 34 insertions(+) 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 -- 2.11.4.GIT