[Groonga-commit] groonga/groonga at f5b5f9d [master] grndb recover: --force-truncate removes locked table and data columns

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index