Yasuhiro Horimoto
null+****@clear*****
Wed Jan 10 16:31:22 JST 2018
Yasuhiro Horimoto 2018-01-10 16:31:22 +0900 (Wed, 10 Jan 2018) New Revision: bfb2b702f2980c5f585398c43d376142ebfe3303 https://github.com/groonga/groonga/commit/bfb2b702f2980c5f585398c43d376142ebfe3303 Merged f6ed615: Merge pull request #807 from komainu8/add_force_lock_clear Message: grndb: add --force-lock-clear option This option force to clear lock of object(Database, Column, Table). You can use if you want to database recover even if remain locked of database. But this option very risky. Because can not safty recover database if remain locked of database. Modified files: lib/mrb/mrb_column.c lib/mrb/mrb_database.c lib/mrb/mrb_table.c lib/mrb/scripts/command_line/grndb.rb Modified: lib/mrb/mrb_column.c (+13 -0) =================================================================== --- lib/mrb/mrb_column.c 2018-01-10 10:26:08 +0900 (268558dd3) +++ lib/mrb/mrb_column.c 2018-01-10 16:31:22 +0900 (4c0b190a4) @@ -111,6 +111,16 @@ mrb_grn_column_is_locked(mrb_state *mrb, mrb_value self) } static mrb_value +mrb_grn_column_unlock(mrb_state *mrb, mrb_value self) +{ + grn_ctx *ctx = (grn_ctx *)mrb->ud; + + grn_obj_clear_lock(ctx, DATA_PTR(self)); + grn_mrb_ctx_check(mrb); + return mrb_nil_value(); +} + +static mrb_value mrb_grn_column_get_table(mrb_state *mrb, mrb_value self) { grn_ctx *ctx = (grn_ctx *)mrb->ud; @@ -163,11 +173,14 @@ grn_mrb_column_init(grn_ctx *ctx) mrb_define_method(mrb, klass, "locked?", mrb_grn_column_is_locked, MRB_ARGS_NONE()); + mrb_define_method(mrb, klass, "unlock", + mrb_grn_column_unlock, MRB_ARGS_NONE()); mrb_define_method(mrb, klass, "table", mrb_grn_column_get_table, MRB_ARGS_NONE()); mrb_define_method(mrb, klass, "truncate", mrb_grn_column_truncate, MRB_ARGS_NONE()); + } #endif Modified: lib/mrb/mrb_database.c (+13 -0) =================================================================== --- lib/mrb/mrb_database.c 2018-01-10 10:26:08 +0900 (f9133167a) +++ lib/mrb/mrb_database.c 2018-01-10 16:31:22 +0900 (3671f6168) @@ -97,6 +97,17 @@ mrb_grn_database_is_locked(mrb_state *mrb, mrb_value self) } static mrb_value +mrb_grn_database_unlock(mrb_state *mrb, mrb_value self) +{ + grn_ctx *ctx = (grn_ctx *)mrb->ud; + + grn_obj_clear_lock(ctx, DATA_PTR(self)); + grn_mrb_ctx_check(mrb); + + return mrb_nil_value(); +} + +static mrb_value mrb_grn_database_get_last_modified(mrb_state *mrb, mrb_value self) { grn_ctx *ctx = (grn_ctx *)mrb->ud; @@ -196,6 +207,8 @@ grn_mrb_database_init(grn_ctx *ctx) mrb_grn_database_recover, MRB_ARGS_NONE()); mrb_define_method(mrb, klass, "locked?", mrb_grn_database_is_locked, MRB_ARGS_NONE()); + mrb_define_method(mrb, klass, "unlock", + mrb_grn_database_unlock, MRB_ARGS_NONE()); mrb_define_method(mrb, klass, "last_modified", mrb_grn_database_get_last_modified, MRB_ARGS_NONE()); mrb_define_method(mrb, klass, "dirty?", Modified: lib/mrb/mrb_table.c (+12 -0) =================================================================== --- lib/mrb/mrb_table.c 2018-01-10 10:26:08 +0900 (baf110ad6) +++ lib/mrb/mrb_table.c 2018-01-10 16:31:22 +0900 (01ce605cc) @@ -177,6 +177,16 @@ mrb_grn_table_is_locked(mrb_state *mrb, mrb_value self) } static mrb_value +mrb_grn_table_unlock(mrb_state *mrb, mrb_value self) +{ + grn_ctx *ctx = (grn_ctx *)mrb->ud; + grn_obj_clear_lock(ctx, DATA_PTR(self)); + grn_mrb_ctx_check(mrb); + + return mrb_nil_value(); +} + +static mrb_value mrb_grn_table_get_size(mrb_state *mrb, mrb_value self) { grn_ctx *ctx = (grn_ctx *)mrb->ud; @@ -466,6 +476,8 @@ grn_mrb_table_init(grn_ctx *ctx) mrb_define_method(mrb, klass, "locked?", mrb_grn_table_is_locked, MRB_ARGS_NONE()); + mrb_define_method(mrb, klass, "unlock", + mrb_grn_table_unlock, MRB_ARGS_NONE()); mrb_define_method(mrb, klass, "size", mrb_grn_table_get_size, MRB_ARGS_NONE()); Modified: lib/mrb/scripts/command_line/grndb.rb (+19 -0) =================================================================== --- lib/mrb/scripts/command_line/grndb.rb 2018-01-10 10:26:08 +0900 (ca4957572) +++ lib/mrb/scripts/command_line/grndb.rb 2018-01-10 16:31:22 +0900 (79d5afe94) @@ -51,6 +51,7 @@ module Groonga options = command.options options.banner += " DB_PATH" options.boolean("--force-truncate", "Force to truncate corrupted objects.") + options.boolean("--force-lock-clear", "Force to clear lock with objects.") command.add_action do |options| open_database(command, options) do |database, rest_arguments| @@ -101,6 +102,7 @@ module Groonga recoverer = Recoverer.new recoverer.database = database recoverer.force_truncate = options[:force_truncate] + recoverer.force_lock_clear = options[:force_lock_clear] begin recoverer.recover rescue Error => error @@ -445,6 +447,7 @@ module Groonga class Recoverer attr_writer :database attr_writer :force_truncate + attr_writer :force_lock_clear def initialize @context = Context.instance @@ -454,6 +457,9 @@ module Groonga if @force_truncate truncate_corrupt_objects end + if @force_lock_clear + lock_clear_objects + end @database.recover end @@ -481,6 +487,19 @@ module Groonga end end end + + def lock_clear_objects + if****@datab*****? + @database.unlock + end + @database.each do |object| + case object + when Column, Table + next unless object.locked? + object.unlock + end + end + end end end end -------------- next part -------------- HTML����������������������������... URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20180110/15e55f7d/attachment-0001.htm