[Groonga-commit] groonga/groonga at 838b6c7 [master] grndb: implement --force-truncate option

Back to archive index

Kentaro Hayashi null+****@clear*****
Tue Jun 20 15:27:14 JST 2017


Kentaro Hayashi	2017-06-20 15:27:14 +0900 (Tue, 20 Jun 2017)

  New Revision: 838b6c74a20744bc332ac957092be35e3171b21c
  https://github.com/groonga/groonga/commit/838b6c74a20744bc332ac957092be35e3171b21c

  Merged 4ee26f7: Merge pull request #714 from kenhys/grndb-force-truncate

  Message:
    grndb: implement --force-truncate option
    
    In the previous versions, when some database files are missing, there
    is no way to recover from it (manual operation is required)
    --force-truncate option enables to remove such database files.

  Modified files:
    lib/mrb/scripts/command_line/grndb.rb

  Modified: lib/mrb/scripts/command_line/grndb.rb (+34 -0)
===================================================================
--- lib/mrb/scripts/command_line/grndb.rb    2017-06-19 16:54:55 +0900 (5d03cc5)
+++ lib/mrb/scripts/command_line/grndb.rb    2017-06-20 15:27:14 +0900 (964ce59)
@@ -95,6 +95,7 @@ module Groonga
       def recover(database, options, arguments)
         recoverer = Recoverer.new
         recoverer.database = database
+        recoverer.force_truncate = options[:force_truncate]
         begin
           recoverer.recover
         rescue Error => error
@@ -408,9 +409,42 @@ module Groonga
 
       class Recoverer
         attr_writer :database
+        attr_writer :force_truncate
+
+        def initialize
+          @context = Context.instance
+        end
 
         def recover
           @database.recover
+          if @force_truncate
+            truncate_corrupt_objects
+          end
+        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(Logger::Level::INFO.to_i, __FILE__, __LINE__, "truncate_corrupt_objects", 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
+              end
+            end
+          end
         end
       end
     end
-------------- next part --------------
HTML����������������������������...
Download 



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