From df2af32f01bc995e9f311b51d3351ee042e23483 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 18 Dec 2008 20:52:24 -0800 Subject: [PATCH] Allow MogileFS::MogileFS to use :db_backend => MogileFS::Mysql This should complete the integration of the read-only Mysql backend into MogileFS::MogileFS. --- lib/mogilefs/mogilefs.rb | 21 ++++++++++-- test/test_mogilefs.rb | 22 ++++++++++++ test/test_mogilefs_db_backend.rb | 73 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 test/test_mogilefs_db_backend.rb diff --git a/lib/mogilefs/mogilefs.rb b/lib/mogilefs/mogilefs.rb index 00149ec..2901213 100644 --- a/lib/mogilefs/mogilefs.rb +++ b/lib/mogilefs/mogilefs.rb @@ -46,7 +46,11 @@ class MogileFS::MogileFS < MogileFS::Client raise ArgumentError, "you must specify a domain" unless @domain - super + if @backend = args[:db_backend] + @readonly = true + else + super + end end ## @@ -210,6 +214,7 @@ class MogileFS::MogileFS < MogileFS::Client ## # Returns the size of +key+. def size(key) + @backend.respond_to?(:_size) and return @backend._size(domain, key) paths = get_paths(key) or return nil paths_size(paths) end @@ -248,7 +253,11 @@ class MogileFS::MogileFS < MogileFS::Client # Lists keys starting with +prefix+ follwing +after+ up to +limit+. If # +after+ is nil the list starts at the beginning. - def list_keys(prefix, after = nil, limit = 1000) + def list_keys(prefix, after = nil, limit = 1000, &block) + if @backend.respond_to?(:_list_keys) + return @backend._list_keys(domain, prefix, after, limit, &block) + end + res = begin @backend.list_keys(:domain => domain, :prefix => prefix, :after => after, :limit => limit) @@ -257,6 +266,14 @@ class MogileFS::MogileFS < MogileFS::Client end keys = (1..res['key_count'].to_i).map { |i| res["key_#{i}"] } + if block_given? + # emulate the MogileFS::Mysql interface, slowly... + keys.each do |key| + paths = get_paths(key) or next + length = paths_size(paths) or next + yield key, length, paths.size + end + end return keys, res['next_after'] end diff --git a/test/test_mogilefs.rb b/test/test_mogilefs.rb index fafb9cf..6765452 100644 --- a/test/test_mogilefs.rb +++ b/test/test_mogilefs.rb @@ -132,6 +132,28 @@ class TestMogileFS__MogileFS < TestMogileFS assert_equal 'new_key_2', next_after end + def test_list_keys_block + @backend.list_keys = { 'key_count' => 2, 'next_after' => 'new_key_2', + 'key_1' => 'new_key_1', 'key_2' => 'new_key_2' } + http_resp = "HTTP/1.0 200 OK\r\nContent-Length: %u\r\n" + TCPSocket.sockets << FakeSocket.new(http_resp % 10) + TCPSocket.sockets << FakeSocket.new(http_resp % 5) + + @backend.get_paths = { 'paths' => 2, 'path1' => 'http://a', + 'path2' => 'http://b' } + @backend.get_paths = { 'paths' => 1, 'path1' => 'http://c' } + + res = [] + keys, next_after = @client.list_keys('new') do |key,length,devcount| + res << [ key, length, devcount ] + end + + expect_res = [ [ 'new_key_1', 5, 2 ], [ 'new_key_2', 10, 1 ] ] + assert_equal expect_res, res + assert_equal ['new_key_1', 'new_key_2'], keys.sort + assert_equal 'new_key_2', next_after + end + def test_new_file_http @client.readonly = true assert_raises MogileFS::ReadOnlyError do diff --git a/test/test_mogilefs_db_backend.rb b/test/test_mogilefs_db_backend.rb new file mode 100644 index 0000000..29c78e8 --- /dev/null +++ b/test/test_mogilefs_db_backend.rb @@ -0,0 +1,73 @@ +require 'test/setup' +require 'mogilefs/mysql' + +class TestMogileFS__MogileFS_Db_Backend < Test::Unit::TestCase + def setup + @my = FakeMysql.new + @mgmy = MogileFS::Mysql.new(:mysql => @my) + @mg = MogileFS::MogileFS.new(:db_backend => @mgmy, :domain => 'test') + end + + def test_initialize + assert_equal 'test', @mg.domain + assert @mg.readonly? + end + + def test_list_keys_block + expect_full = [ [ 'foo', 123, 2 ], [ 'bar', 456, 1 ] ] + expect_keys = [ [ 'foo', 'bar' ], 'bar' ] + @my.expect << expect_full + full = [] + keys = @mg.list_keys('test') do |dkey,length,devcount| + full << [ dkey, length, devcount ] + end + assert_equal expect_keys, keys + assert_equal expect_full, full + end + + def test_list_keys + expect_full = [ [ 'foo', 123, 2 ], [ 'bar', 456, 1 ] ] + expect_keys = [ [ 'foo', 'bar' ], 'bar' ] + @my.expect << expect_full + keys = @mg.list_keys('test') + assert_equal expect_keys, keys + end + + def test_size + @my.expect << [ [ '123' ] ] + assert_equal 123, @mg.size('foo') + + @my.expect << [ [ '456' ] ] + assert_equal 456, @mg.size('foo') + end + + def test_store_file_readonly + assert_raises(MogileFS::ReadOnlyError) do + @mg.store_file 'new_key', 'test', '/dev/null' + end + end + + def test_store_content_readonly + assert_raises(MogileFS::ReadOnlyError) do + @mg.store_content 'new_key', 'test', 'data' + end + end + + def test_new_file_readonly + assert_raises(MogileFS::ReadOnlyError) { @mg.new_file 'new_key', 'test' } + end + + def test_rename_readonly + assert_raises(MogileFS::ReadOnlyError) { @mg.rename 'a', 'b' } + end + + def test_delete_readonly + assert_raises(MogileFS::ReadOnlyError) { @mg.delete 'no_such_key' } + end + + def test_sleep + assert_nothing_raised { assert_equal({}, @mg.sleep(1)) } + end + +end + -- 2.11.4.GIT