Kouhei Sutou
null+****@clear*****
Thu Aug 24 12:03:41 JST 2017
Kouhei Sutou 2017-08-24 12:03:41 +0900 (Thu, 24 Aug 2017) New Revision: 97d42792da78b7148ee82ec6ab1d062cfc5d62ab https://github.com/groonga/groonga/commit/97d42792da78b7148ee82ec6ab1d062cfc5d62ab Message: Improve performance to remove table Referenced table existence check is improved. grn_db::specs is used to check existence instead of opening objects. It doesn't open files for objects. It improves performance. thread_limit=1 isn't needed for reducing opening objects. Modified files: lib/db.c test/command/suite/sharding/logical_table_remove/broken/column/default.expected test/command/suite/sharding/logical_table_remove/broken/column/force.expected test/command/suite/sharding/logical_table_remove/broken/index_column/default.expected test/command/suite/sharding/logical_table_remove/broken/index_column/force.expected test/command/suite/sharding/logical_table_remove/broken/lexicon/default.expected test/command/suite/sharding/logical_table_remove/broken/lexicon/force.expected test/command/suite/sharding/logical_table_remove/broken/referenced_table/default.expected test/command/suite/sharding/logical_table_remove/broken/referenced_table/force.expected test/command/suite/sharding/logical_table_remove/broken/shard_key_column/force.expected test/command/suite/sharding/logical_table_remove/broken/table_and_reference_table/force.expected Modified: lib/db.c (+43 -84) =================================================================== --- lib/db.c 2017-08-24 12:01:25 +0900 (3b40f49f6) +++ lib/db.c 2017-08-24 12:03:41 +0900 (cf7fc4c37) @@ -9409,103 +9409,62 @@ remove_reference_tables(grn_ctx *ctx, grn_obj *table, grn_obj *db) static grn_bool is_removable_table(grn_ctx *ctx, grn_obj *table, grn_obj *db) { - grn_bool removable = GRN_TRUE; grn_id table_id; - grn_bool is_close_opened_object_mode = GRN_FALSE; - char table_name[GRN_TABLE_MAX_KEY_SIZE]; - int table_name_size; - grn_table_cursor *cursor; + grn_id reference_object_id; table_id = DB_OBJ(table)->id; if (table_id & GRN_OBJ_TMP_OBJECT) { return GRN_TRUE; } - if (grn_thread_get_limit() == 1) { - is_close_opened_object_mode = GRN_TRUE; + reference_object_id = grn_table_find_reference_object(ctx, table); + if (reference_object_id == GRN_ID_NIL) { + return GRN_TRUE; } - table_name_size = grn_obj_name(ctx, table, table_name, GRN_TABLE_MAX_KEY_SIZE); - if ((cursor = grn_table_cursor_open(ctx, db, NULL, 0, NULL, 0, 0, -1, - GRN_CURSOR_BY_ID))) { - grn_id id; - while ((id = grn_table_cursor_next(ctx, cursor)) != GRN_ID_NIL) { - grn_obj *object; - - if (is_close_opened_object_mode) { - grn_ctx_push_temporary_open_space(ctx); - } - - object = grn_ctx_at(ctx, id); - if (!object) { - ERRCLR(ctx); - if (is_close_opened_object_mode) { - grn_ctx_pop_temporary_open_space(ctx); - } - continue; - } - - switch (object->header.type) { - case GRN_TABLE_HASH_KEY : - case GRN_TABLE_PAT_KEY : - case GRN_TABLE_DAT_KEY : - if (DB_OBJ(object)->id == table_id) { - break; - } - - if (object->header.domain == table_id) { - char reference_table_name[GRN_TABLE_MAX_KEY_SIZE]; - int reference_table_name_size; - reference_table_name_size = - grn_obj_name(ctx, object, reference_table_name, - GRN_TABLE_MAX_KEY_SIZE); - ERR(GRN_OPERATION_NOT_PERMITTED, - "[table][remove] a table that references the table exists: " - "<%.*s._key> -> <%.*s>", - reference_table_name_size, reference_table_name, - table_name_size, table_name); - removable = GRN_FALSE; - } - break; - case GRN_TABLE_NO_KEY : - break; - case GRN_COLUMN_VAR_SIZE : - case GRN_COLUMN_FIX_SIZE : - if (object->header.domain == table_id) { - break; - } - if (DB_OBJ(object)->range == table_id) { - char column_name[GRN_TABLE_MAX_KEY_SIZE]; - int column_name_size; - column_name_size = grn_obj_name(ctx, object, column_name, - GRN_TABLE_MAX_KEY_SIZE); - ERR(GRN_OPERATION_NOT_PERMITTED, - "[table][remove] a column that references the table exists: " - "<%.*s> -> <%.*s>", - column_name_size, column_name, - table_name_size, table_name); - removable = GRN_FALSE; - } - break; - case GRN_COLUMN_INDEX : - break; - default: - break; - } - grn_obj_unlink(ctx, object); - - if (is_close_opened_object_mode) { - grn_ctx_pop_temporary_open_space(ctx); - } - - if (!removable) { - break; + { + grn_obj *db; + const char *table_name; + int table_name_size; + grn_obj *reference_object; + const char *reference_object_name; + int reference_object_name_size; + + db = grn_ctx_db(ctx); + + table_name = _grn_table_key(ctx, db, table_id,&table_name_size); + + reference_object = grn_ctx_at(ctx, reference_object_id); + reference_object_name = _grn_table_key(ctx, + db, + reference_object_id, + &reference_object_name_size); + if (reference_object) { + if (grn_obj_is_table(ctx, reference_object)) { + ERR(GRN_OPERATION_NOT_PERMITTED, + "[table][remove] a table that references the table exists: " + "<%.*s._key> -> <%.*s>", + reference_object_name_size, reference_object_name, + table_name_size, table_name); + } else { + ERR(GRN_OPERATION_NOT_PERMITTED, + "[table][remove] a column that references the table exists: " + "<%.*s> -> <%.*s>", + reference_object_name_size, reference_object_name, + table_name_size, table_name); } + } else { + ERR(GRN_OPERATION_NOT_PERMITTED, + "[table][remove] a dangling object that references the table exists: " + "<%.*s(%u)> -> <%.*s>", + reference_object_name_size, + reference_object_name, + reference_object_id, + table_name_size, table_name); } - grn_table_cursor_close(ctx, cursor); } - return removable; + return GRN_FALSE; } static inline grn_rc Modified: test/command/suite/sharding/logical_table_remove/broken/column/default.expected (+0 -1) =================================================================== --- test/command/suite/sharding/logical_table_remove/broken/column/default.expected 2017-08-24 12:01:25 +0900 (d9175b4a7) +++ test/command/suite/sharding/logical_table_remove/broken/column/default.expected 2017-08-24 12:03:41 +0900 (a0bcf1fc3) @@ -60,7 +60,6 @@ logical_table_remove Logs timestamp --min "2015-02-04 00:00:00" --min_border ] #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000112> #|e| grn_ctx_at: failed to open object: <274>(<Logs_20150204.path>):<64>(<column:fix_size>) -#|e| grn_ctx_at: failed to open object: <274>(<Logs_20150204.path>):<64>(<column:fix_size>) #|e| [object][remove] column is broken: <Logs_20150204.path>: [object][remove] column is broken: <Logs_20150204.path>: [io][open] file size is too small: <8>(required: >= 64): <db/db.000011 dump plugin_register sharding Modified: test/command/suite/sharding/logical_table_remove/broken/column/force.expected (+0 -1) =================================================================== --- test/command/suite/sharding/logical_table_remove/broken/column/force.expected 2017-08-24 12:01:25 +0900 (2c6b66f2e) +++ test/command/suite/sharding/logical_table_remove/broken/column/force.expected 2017-08-24 12:03:41 +0900 (ea0537342) @@ -51,7 +51,6 @@ logical_table_remove Logs timestamp --min "2015-02-04 00:00:00" --min_border [[0,0.0,0.0],true] #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000112> #|e| grn_ctx_at: failed to open object: <274>(<Logs_20150204.path>):<64>(<column:fix_size>) -#|e| grn_ctx_at: failed to open object: <274>(<Logs_20150204.path>):<64>(<column:fix_size>) #|e| [object][remove] column is broken: <Logs_20150204.path>: [object][remove] column is broken: <Logs_20150204.path>: [io][open] file size is too small: <8>(required: >= 64): <db/db.000011 #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000112> #|e| grn_ctx_at: failed to open object: <274>(<Logs_20150204.path>):<64>(<column:fix_size>) Modified: test/command/suite/sharding/logical_table_remove/broken/index_column/default.expected (+0 -1) =================================================================== --- test/command/suite/sharding/logical_table_remove/broken/index_column/default.expected 2017-08-24 12:01:25 +0900 (ac9baf73f) +++ test/command/suite/sharding/logical_table_remove/broken/index_column/default.expected 2017-08-24 12:03:41 +0900 (d98e8fe16) @@ -60,7 +60,6 @@ logical_table_remove Logs timestamp --min "2015-02-04 00:00:00" --min_border ] #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000114> #|e| grn_ctx_at: failed to open object: <276>(<Times_20150204.timestamp_index>):<72>(<column:index>) -#|e| grn_ctx_at: failed to open object: <276>(<Times_20150204.timestamp_index>):<72>(<column:index>) #|e| [column][remove][index] hook has a dangling reference: <Logs_20150204.timestamp> -> <Times_20150204.timestamp_index> object_exist Times_20150204.timestamp_index [[0,0.0,0.0],true] Modified: test/command/suite/sharding/logical_table_remove/broken/index_column/force.expected (+0 -1) =================================================================== --- test/command/suite/sharding/logical_table_remove/broken/index_column/force.expected 2017-08-24 12:01:25 +0900 (9d3fed982) +++ test/command/suite/sharding/logical_table_remove/broken/index_column/force.expected 2017-08-24 12:03:41 +0900 (4d0ecb1f0) @@ -51,7 +51,6 @@ logical_table_remove Logs timestamp --min "2015-02-04 00:00:00" --min_border [[0,0.0,0.0],true] #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000114> #|e| grn_ctx_at: failed to open object: <276>(<Times_20150204.timestamp_index>):<72>(<column:index>) -#|e| grn_ctx_at: failed to open object: <276>(<Times_20150204.timestamp_index>):<72>(<column:index>) #|e| [column][remove][index] hook has a dangling reference: <Logs_20150204.timestamp> -> <Times_20150204.timestamp_index> #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000114> #|e| grn_ctx_at: failed to open object: <276>(<Times_20150204.timestamp_index>):<72>(<column:index>) Modified: test/command/suite/sharding/logical_table_remove/broken/lexicon/default.expected (+0 -3) =================================================================== --- test/command/suite/sharding/logical_table_remove/broken/lexicon/default.expected 2017-08-24 12:01:25 +0900 (886ac44f0) +++ test/command/suite/sharding/logical_table_remove/broken/lexicon/default.expected 2017-08-24 12:03:41 +0900 (c02a81259) @@ -60,9 +60,6 @@ logical_table_remove Logs timestamp --min "2015-02-04 00:00:00" --min_border ] #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000113> #|e| grn_ctx_at: failed to open object: <275>(<Times_20150204>):<49>(<table:pat_key>) -#|e| grn_ctx_at: failed to open object: <275>(<Times_20150204>):<49>(<table:pat_key>) -#|e| grn_ctx_at: failed to open object: <276>(<Times_20150204.timestamp_index>):<72>(<column:index>) -#|e| grn_ctx_at: failed to open object: <275>(<Times_20150204>):<49>(<table:pat_key>) #|e| grn_ctx_at: failed to open object: <276>(<Times_20150204.timestamp_index>):<72>(<column:index>) #|e| [column][remove][index] hook has a dangling reference: <Logs_20150204.timestamp> -> <Times_20150204.timestamp_index> dump Modified: test/command/suite/sharding/logical_table_remove/broken/lexicon/force.expected (+0 -3) =================================================================== --- test/command/suite/sharding/logical_table_remove/broken/lexicon/force.expected 2017-08-24 12:01:25 +0900 (9d12e558b) +++ test/command/suite/sharding/logical_table_remove/broken/lexicon/force.expected 2017-08-24 12:03:41 +0900 (961f17969) @@ -51,9 +51,6 @@ logical_table_remove Logs timestamp --min "2015-02-04 00:00:00" --min_border [[0,0.0,0.0],true] #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000113> #|e| grn_ctx_at: failed to open object: <275>(<Times_20150204>):<49>(<table:pat_key>) -#|e| grn_ctx_at: failed to open object: <275>(<Times_20150204>):<49>(<table:pat_key>) -#|e| grn_ctx_at: failed to open object: <276>(<Times_20150204.timestamp_index>):<72>(<column:index>) -#|e| grn_ctx_at: failed to open object: <275>(<Times_20150204>):<49>(<table:pat_key>) #|e| grn_ctx_at: failed to open object: <276>(<Times_20150204.timestamp_index>):<72>(<column:index>) #|e| [column][remove][index] hook has a dangling reference: <Logs_20150204.timestamp> -> <Times_20150204.timestamp_index> #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000113> Modified: test/command/suite/sharding/logical_table_remove/broken/referenced_table/default.expected (+1 -2) =================================================================== --- test/command/suite/sharding/logical_table_remove/broken/referenced_table/default.expected 2017-08-24 12:01:25 +0900 (b8b2cebf1) +++ test/command/suite/sharding/logical_table_remove/broken/referenced_table/default.expected 2017-08-24 12:03:41 +0900 (c221d46b3) @@ -49,8 +49,6 @@ load --table Logs_20150204 [[0,0.0,0.0],3] logical_table_remove Logs timestamp --min "2015-02-04 00:00:00" --min_border "include" [[0,0.0,0.0],true] -#|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.000010F> -#|e| grn_ctx_at: failed to open object: <271>(<Paths_20150204>):<48>(<table:hash_key>) dump plugin_register sharding @@ -95,6 +93,7 @@ load --table Times_20150204 column_create PathTerms_20150203 index COLUMN_INDEX|WITH_POSITION Paths_20150203 _key column_create Times_20150203 timestamp_index COLUMN_INDEX Logs_20150203 timestamp +#|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.000010F> #|e| grn_ctx_at: failed to open object: <271>(<Paths_20150204>):<48>(<table:hash_key>) #|e| grn_ctx_at: failed to open object: <271>(<Paths_20150204>):<48>(<table:hash_key>) #|e| grn_ctx_at: failed to open object: <271>(<Paths_20150204>):<48>(<table:hash_key>) Modified: test/command/suite/sharding/logical_table_remove/broken/referenced_table/force.expected (+1 -2) =================================================================== --- test/command/suite/sharding/logical_table_remove/broken/referenced_table/force.expected 2017-08-24 12:01:25 +0900 (abc045365) +++ test/command/suite/sharding/logical_table_remove/broken/referenced_table/force.expected 2017-08-24 12:03:41 +0900 (9dc67804c) @@ -49,8 +49,6 @@ load --table Logs_20150204 [[0,0.0,0.0],3] logical_table_remove Logs timestamp --min "2015-02-04 00:00:00" --min_border "include" --force yes [[0,0.0,0.0],true] -#|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.000010F> -#|e| grn_ctx_at: failed to open object: <271>(<Paths_20150204>):<48>(<table:hash_key>) dump plugin_register sharding @@ -95,6 +93,7 @@ load --table Times_20150204 column_create PathTerms_20150203 index COLUMN_INDEX|WITH_POSITION Paths_20150203 _key column_create Times_20150203 timestamp_index COLUMN_INDEX Logs_20150203 timestamp +#|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.000010F> #|e| grn_ctx_at: failed to open object: <271>(<Paths_20150204>):<48>(<table:hash_key>) #|e| grn_ctx_at: failed to open object: <271>(<Paths_20150204>):<48>(<table:hash_key>) #|e| grn_ctx_at: failed to open object: <271>(<Paths_20150204>):<48>(<table:hash_key>) Modified: test/command/suite/sharding/logical_table_remove/broken/shard_key_column/force.expected (+0 -1) =================================================================== --- test/command/suite/sharding/logical_table_remove/broken/shard_key_column/force.expected 2017-08-24 12:01:25 +0900 (5ddd8c4e2) +++ test/command/suite/sharding/logical_table_remove/broken/shard_key_column/force.expected 2017-08-24 12:03:41 +0900 (145988ee7) @@ -52,7 +52,6 @@ logical_table_remove Logs timestamp --min "2015-02-04 00:00:00" --min_border #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000111> #|e| grn_ctx_at: failed to open object: <273>(<Logs_20150204.timestamp>):<64>(<column:fix_size>) #|e| grn_ctx_at: failed to open object: <273>(<Logs_20150204.timestamp>):<64>(<column:fix_size>) -#|e| grn_ctx_at: failed to open object: <273>(<Logs_20150204.timestamp>):<64>(<column:fix_size>) #|e| [object][remove] column is broken: <Logs_20150204.timestamp>: [object][remove] column is broken: <Logs_20150204.timestamp>: [io][open] file size is too small: <8>(required: >= 64): <db/db.0 #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000111> #|e| grn_ctx_at: failed to open object: <273>(<Logs_20150204.timestamp>):<64>(<column:fix_size>) Modified: test/command/suite/sharding/logical_table_remove/broken/table_and_reference_table/force.expected (+0 -2) =================================================================== --- test/command/suite/sharding/logical_table_remove/broken/table_and_reference_table/force.expected 2017-08-24 12:01:25 +0900 (cd8827047) +++ test/command/suite/sharding/logical_table_remove/broken/table_and_reference_table/force.expected 2017-08-24 12:03:41 +0900 (6b44283a8) @@ -55,10 +55,8 @@ logical_table_remove Logs timestamp --min "2015-02-04 00:00:00" --min_border [[0,0.0,0.0],true] #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000110> #|e| grn_ctx_at: failed to open object: <272>(<Logs_20150204>):<51>(<table:no_key>) -#|e| grn_ctx_at: failed to open object: <272>(<Logs_20150204>):<51>(<table:no_key>) #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000118> #|e| grn_ctx_at: failed to open object: <280>(<Reference_20150204.data>):<65>(<column:var_size>) -#|e| grn_ctx_at: failed to open object: <280>(<Reference_20150204.data>):<65>(<column:var_size>) #|e| [object][remove] column is broken: <Reference_20150204.data>: [object][remove] column is broken: <Reference_20150204.data>: [io][open] file size is too small: <8>(required: >= 64): <db/db.0 #|e| [io][open] file size is too small: <8>(required: >= 64): <db/db.0000118> #|e| grn_ctx_at: failed to open object: <280>(<Reference_20150204.data>):<65>(<column:var_size>) -------------- next part -------------- HTML����������������������������...Download