[Groonga-commit] groonga/groonga at 97d4279 [master] Improve performance to remove table

Zurück zum Archiv-Index

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 



More information about the Groonga-commit mailing list
Zurück zum Archiv-Index