Kouhei Sutou
null+****@clear*****
Mon Apr 2 15:06:26 JST 2018
Kouhei Sutou 2018-04-02 15:06:26 +0900 (Mon, 02 Apr 2018) New Revision: f5b5f9dce9f4b93f6530d7df87fe36291ede396e https://github.com/groonga/groonga/commit/f5b5f9dce9f4b93f6530d7df87fe36291ede396e Message: grndb recover: --force-truncate removes locked table and data columns Modified files: lib/mrb/scripts/command_line/grndb.rb test/command_line/suite/grndb/test_recover.rb Modified: lib/mrb/scripts/command_line/grndb.rb (+43 -21) =================================================================== --- lib/mrb/scripts/command_line/grndb.rb 2018-04-02 11:11:38 +0900 (105e7e3a5) +++ lib/mrb/scripts/command_line/grndb.rb 2018-04-02 15:06:26 +0900 (3ac7d0e14) @@ -457,7 +457,10 @@ module Groonga def recover if @force_truncate - truncate_corrupt_objects + @database.each do |object| + next unless truncate_target?(object) + truncate_broken_object(object) + end end if @force_lock_clear clear_locks @@ -465,26 +468,45 @@ module Groonga @database.recover end - def truncate_corrupt_objects - @database.each do |object| - next unless object.corrupt? - logger =****@conte***** - object_path = object.path - object_dirname = File.dirname(object_path) - object_basename = File.basename(object_path) - object.truncate - Dir.foreach(object_dirname) do |path| - if path.start_with?("#{object_basename}.") - begin - File.unlink("#{object_dirname}/#{path}") - message = "Corrupted <#{object_path}> related file is removed: <#{path}>" - $stdout.puts(message) - logger.log(:info, message) - rescue Error => error - message = "Failed to remove file which is related to corrupted <#{object_path}>: <#{path}>" - $stderr.puts(message) - logger.log_error(message) - end + private + def truncate_target?(object) + return true if object.corrupt? + + case object + when IndexColumn + false + when Column, Table + object.locked? + else + false + end + end + + def truncate_broken_object(object) + logger =****@conte***** + name = object.name + object_path = object.path + object_dirname = File.dirname(object_path) + object_basename = File.basename(object_path) + object.truncate + message = "[#{name}] Truncated broken object: <#{object_path}>" + $stderr.puts(message) + logger.log(:info, message) + + Dir.foreach(object_dirname) do |path| + if path.start_with?("#{object_basename}.") + begin + File.unlink("#{object_dirname}/#{path}") + message = + "[#{name}] Removed broken object related file: <#{path}>" + $stdout.puts(message) + logger.log(:info, message) + rescue Error => error + message = + "[#{name}] Failed to remove broken object related file: " + + "<#{path}>: #{error.class}: #{error.message}" + $stderr.puts(message) + logger.log_error(message) end end end Modified: test/command_line/suite/grndb/test_recover.rb (+22 -7) =================================================================== --- test/command_line/suite/grndb/test_recover.rb 2018-04-02 11:11:38 +0900 (faf67094f) +++ test/command_line/suite/grndb/test_recover.rb 2018-04-02 15:06:26 +0900 (452dfb204) @@ -23,16 +23,31 @@ object corrupt: <[db][recover] database may be broken. Please re-create the data MESSAGE end - def test_locked_table - groonga("table_create", "Users", "TABLE_HASH_KEY", "ShortText") - groonga("lock_acquire", "Users") - error = assert_raise(CommandRunner::Error) do - grndb("recover") + sub_test_case("locked table") do + def setup + groonga("table_create", "Users", "TABLE_HASH_KEY", "ShortText") + groonga("lock_acquire", "Users") + + _id, _name, path, *_ = JSON.parse(groonga("table_list").output)[1][1] + @table_path = path end - assert_equal(<<-MESSAGE, error.error_output) + + def test_default + error = assert_raise(CommandRunner::Error) do + grndb("recover") + end + assert_equal(<<-MESSAGE, error.error_output) Failed to recover database: <#{@database_path}> object corrupt: <[db][recover] table may be broken: <Users>: please truncate the table (or clear lock of the table) and load data again>(-55) - MESSAGE + MESSAGE + end + + def test_force_truncate + result = grndb("recover", "--force-truncate") + assert_equal(<<-MESSAGE, result.error_output) +[Users] Truncated broken object: <#{@table_path}> + MESSAGE + end end def test_locked_data_column -------------- next part -------------- HTML����������������������������... URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180402/ffc4f19a/attachment-0001.htm