Kouhei Sutou
null+****@clear*****
Mon Oct 9 20:18:20 JST 2017
Kouhei Sutou 2017-10-09 20:18:20 +0900 (Mon, 09 Oct 2017) New Revision: 52b00a7fd116fd87d4fd5671891f56d453e6ecdb https://github.com/pgroonga/pgroonga/commit/52b00a7fd116fd87d4fd5671891f56d453e6ecdb Message: Fix removing creating index bug in another way Using "BuildingSourcesXXX" name while creating index. It isn't removing target on VACUUM. The previous way, check PostgreSQL file for the index, is slow to remove unused Groonga index. Because PostgreSQL file isn't removed quickly. Modified files: src/pgrn-create.c src/pgrn-create.h src/pgrn-groonga.c src/pgrn-groonga.h src/pgroonga.c src/pgroonga.h Modified: src/pgrn-create.c (+14 -4) =================================================================== --- src/pgrn-create.c 2017-10-09 20:07:26 +0900 (258d3ff) +++ src/pgrn-create.c 2017-10-09 20:18:20 +0900 (46140bf) @@ -23,12 +23,12 @@ PGrnCreateSourcesCtidColumn(PGrnCreateData *data) void PGrnCreateSourcesTable(PGrnCreateData *data) { - char sourcesTableName[GRN_TABLE_MAX_KEY_SIZE]; + char buildingSourcesTableName[GRN_TABLE_MAX_KEY_SIZE]; - snprintf(sourcesTableName, sizeof(sourcesTableName), - PGrnSourcesTableNameFormat, data->relNode); + snprintf(buildingSourcesTableName, sizeof(buildingSourcesTableName), + PGrnBuildingSourcesTableNameFormat, data->relNode); data->sourcesTable = PGrnCreateTable(data->index, - sourcesTableName, + buildingSourcesTableName, GRN_OBJ_TABLE_NO_KEY, NULL, NULL, @@ -39,6 +39,16 @@ PGrnCreateSourcesTable(PGrnCreateData *data) } void +PGrnCreateSourcesTableFinish(PGrnCreateData *data) +{ + char sourcesTableName[GRN_TABLE_MAX_KEY_SIZE]; + + snprintf(sourcesTableName, sizeof(sourcesTableName), + PGrnSourcesTableNameFormat, data->relNode); + PGrnRenameTable(data->sourcesTable, sourcesTableName); +} + +void PGrnCreateDataColumn(PGrnCreateData *data) { grn_column_flags flags = 0; Modified: src/pgrn-create.h (+2 -1) =================================================================== --- src/pgrn-create.h 2017-10-09 20:07:26 +0900 (c775777) +++ src/pgrn-create.h 2017-10-09 20:18:20 +0900 (9f4c052) @@ -12,9 +12,9 @@ typedef struct PGrnCreateData grn_obj *sourcesCtidColumn; grn_obj *supplementaryTables; grn_obj *lexicons; - unsigned int i; TupleDesc desc; Oid relNode; + unsigned int i; bool forFullTextSearch; bool forRegexpSearch; bool forPrefixSearch; @@ -24,6 +24,7 @@ typedef struct PGrnCreateData void PGrnCreateSourcesCtidColumn(PGrnCreateData *data); void PGrnCreateSourcesTable(PGrnCreateData *data); +void PGrnCreateSourcesTableFinish(PGrnCreateData *data); void PGrnCreateLexicon(PGrnCreateData *data); void PGrnCreateDataColumn(PGrnCreateData *data); void PGrnCreateIndexColumn(PGrnCreateData *data); Modified: src/pgrn-groonga.c (+9 -0) =================================================================== --- src/pgrn-groonga.c 2017-10-09 20:07:26 +0900 (b7480e2) +++ src/pgrn-groonga.c 2017-10-09 20:18:20 +0900 (b9cc597) @@ -465,3 +465,12 @@ PGrnRemoveColumns(grn_obj *table) grn_hash_close(ctx, columns); } + +void +PGrnRenameTable(grn_obj *table, const char *newName) +{ + grn_table_rename(ctx, table, newName, strlen(newName)); + PGrnCheck("failed to rename table: <%s> -> <%s>", + PGrnInspectName(table), + newName); +} Modified: src/pgrn-groonga.h (+2 -0) =================================================================== --- src/pgrn-groonga.h 2017-10-09 20:07:26 +0900 (3ad42c8) +++ src/pgrn-groonga.h 2017-10-09 20:18:20 +0900 (60e290b) @@ -76,3 +76,5 @@ void PGrnRemoveObjectWithSize(const char *name, size_t nameSize); void PGrnRemoveColumns(grn_obj *table); void PGrnFlushObject(grn_obj *object, bool recursive); + +void PGrnRenameTable(grn_obj *table, const char *newName); Modified: src/pgroonga.c (+48 -92) =================================================================== --- src/pgroonga.c 2017-10-09 20:07:26 +0900 (4891e33) +++ src/pgroonga.c 2017-10-09 20:18:20 +0900 (eb26e69) @@ -955,46 +955,35 @@ PGrnIsForPrefixSearchIndex(Relation index, int nthAttribute) * PGrnCreate */ static void -PGrnCreate(Relation index, - grn_obj **sourcesTable, - grn_obj **sourcesCtidColumn, - grn_obj *supplementaryTables, - grn_obj *lexicons) +PGrnCreate(PGrnCreateData *data) { - PGrnCreateData data; - - data.index = index; - data.desc = RelationGetDescr(index); - data.relNode = index->rd_node.relNode; - data.supplementaryTables = supplementaryTables; - data.lexicons = lexicons; - - PGrnCreateSourcesTable(&data); - *sourcesTable = data.sourcesTable; - *sourcesCtidColumn = data.sourcesCtidColumn; + PGrnCreateSourcesTable(data); - for (data.i = 0; data.i < data.desc->natts; data.i++) + for (data->i = 0; data->i < data->desc->natts; data->i++) { Form_pg_attribute attribute; - attribute = data.desc->attrs[data.i]; + attribute = data->desc->attrs[data->i]; if (PGrnAttributeIsJSONB(attribute->atttypid)) { - data.forFullTextSearch = false; - data.forRegexpSearch = false; - data.forPrefixSearch = false; - PGrnJSONBCreate(&data); + data->forFullTextSearch = false; + data->forRegexpSearch = false; + data->forPrefixSearch = false; + PGrnJSONBCreate(data); } else { - data.forFullTextSearch = PGrnIsForFullTextSearchIndex(index, data.i); - data.forRegexpSearch = PGrnIsForRegexpSearchIndex(index, data.i); - data.forPrefixSearch = PGrnIsForPrefixSearchIndex(index, data.i); - data.attributeTypeID = PGrnGetType(index, data.i, - &(data.attributeFlags)); - PGrnCreateLexicon(&data); - PGrnCreateDataColumn(&data); - PGrnCreateIndexColumn(&data); + data->forFullTextSearch = + PGrnIsForFullTextSearchIndex(data->index, data->i); + data->forRegexpSearch = + PGrnIsForRegexpSearchIndex(data->index, data->i); + data->forPrefixSearch = + PGrnIsForPrefixSearchIndex(data->index, data->i); + data->attributeTypeID = + PGrnGetType(data->index, data->i, &(data->attributeFlags)); + PGrnCreateLexicon(data); + PGrnCreateDataColumn(data); + PGrnCreateIndexColumn(data); } } } @@ -4601,6 +4590,7 @@ pgroonga_build_raw(Relation heap, { IndexBuildResult *result; double nHeapTuples = 0.0; + PGrnCreateData data; PGrnBuildStateData bs; grn_obj supplementaryTables; grn_obj lexicons; @@ -4610,6 +4600,9 @@ pgroonga_build_raw(Relation heap, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("pgroonga: unique index isn't supported"))); + data.sourcesTable = NULL; + data.sourcesCtidColumn = NULL; + bs.sourcesTable = NULL; bs.nIndexedTuples = 0.0; bs.needMaxRecordSizeUpdate = PGrnNeedMaxRecordSizeUpdate(index); @@ -4623,14 +4616,18 @@ pgroonga_build_raw(Relation heap, GRN_PTR_INIT(&lexicons, GRN_OBJ_VECTOR, GRN_ID_NIL); PG_TRY(); { - PGrnCreate(index, - &(bs.sourcesTable), - &(bs.sourcesCtidColumn), - &supplementaryTables, - &lexicons); + data.index = index; + data.supplementaryTables = &supplementaryTables; + data.lexicons = &lexicons; + data.desc = RelationGetDescr(index); + data.relNode = index->rd_node.relNode; + PGrnCreate(&data); + bs.sourcesTable = data.sourcesTable; + bs.sourcesCtidColumn = data.sourcesCtidColumn; nHeapTuples = IndexBuildHeapScan(heap, index, indexInfo, true, PGrnBuildCallback, &bs); PGrnSetSources(index, bs.sourcesTable); + PGrnCreateSourcesTableFinish(&data); } PG_CATCH(); { @@ -4654,8 +4651,8 @@ pgroonga_build_raw(Relation heap, } GRN_OBJ_FIN(ctx, &supplementaryTables); - if (bs.sourcesTable) - grn_obj_remove(ctx, bs.sourcesTable); + if (data.sourcesTable) + grn_obj_remove(ctx, data.sourcesTable); PG_RE_THROW(); } @@ -4696,8 +4693,7 @@ pgroonga_build(PG_FUNCTION_ARGS) static void pgroonga_buildempty_raw(Relation index) { - grn_obj *sourcesTable = NULL; - grn_obj *sourcesCtidColumn = NULL; + PGrnCreateData data; grn_obj supplementaryTables; grn_obj lexicons; @@ -4705,12 +4701,16 @@ pgroonga_buildempty_raw(Relation index) GRN_PTR_INIT(&lexicons, GRN_OBJ_VECTOR, GRN_ID_NIL); PG_TRY(); { - PGrnCreate(index, - &sourcesTable, - &sourcesCtidColumn, - &supplementaryTables, - &lexicons); - PGrnSetSources(index, sourcesTable); + data.index = index; + data.sourcesTable = NULL; + data.sourcesCtidColumn = NULL; + data.supplementaryTables = &supplementaryTables; + data.lexicons = &lexicons; + data.desc = RelationGetDescr(index); + data.relNode = index->rd_node.relNode; + PGrnCreate(&data); + PGrnSetSources(index, data.sourcesTable); + PGrnCreateSourcesTableFinish(&data); } PG_CATCH(); { @@ -4734,8 +4734,8 @@ pgroonga_buildempty_raw(Relation index) } GRN_OBJ_FIN(ctx, &supplementaryTables); - if (sourcesTable) - grn_obj_remove(ctx, sourcesTable); + if (data.sourcesTable) + grn_obj_remove(ctx, data.sourcesTable); PG_RE_THROW(); } @@ -4870,59 +4870,18 @@ pgroonga_bulkdelete(PG_FUNCTION_ARGS) PG_RETURN_POINTER(stats); } -static bool -PGrnIsCreatingFileNodeID(grn_id id, Oid fileNodeID) -{ - grn_obj *object; - const char *path; - char pgPath[MAXPGPATH]; - const char *lastDirSeparator; - pgrn_stat_buffer status; - - object = grn_ctx_at(ctx, id); - if (!object) - return false; - - path = grn_obj_path(ctx, object); - if (!path) - return false; - - lastDirSeparator = last_dir_separator(path); - if (lastDirSeparator) - { - char baseDir[MAXPGPATH]; - char pgBaseName[MAXPGPATH]; - - snprintf(baseDir, sizeof(baseDir), - "%.*s", - (int)(lastDirSeparator - path), - path); - snprintf(pgBaseName, sizeof(pgBaseName), "%u", fileNodeID); - join_path_components(pgPath, - baseDir, - pgBaseName); - } - else - { - snprintf(pgPath, sizeof(pgPath), "%u", fileNodeID); - } - - return pgrn_stat(pgPath, &status) == 0; -} - static void PGrnRemoveUnusedTables(void) { #ifdef PGRN_SUPPORT_FILE_NODE_ID_TO_RELATION_ID grn_table_cursor *cursor; const char *min = PGrnSourcesTableNamePrefix; - grn_id id; cursor = grn_table_cursor_open(ctx, grn_ctx_db(ctx), min, strlen(min), NULL, 0, 0, -1, GRN_CURSOR_BY_KEY|GRN_CURSOR_PREFIX); - while ((id = grn_table_cursor_next(ctx, cursor)) != GRN_ID_NIL) + while (grn_table_cursor_next(ctx, cursor) != GRN_ID_NIL) { char *name; char *nameEnd; @@ -4939,9 +4898,6 @@ PGrnRemoveUnusedTables(void) if (PGrnPGIsValidFileNodeID(relationFileNodeID)) continue; - if (PGrnIsCreatingFileNodeID(id, relationFileNodeID)) - continue; - for (i = 0; true; i++) { char tableName[GRN_TABLE_MAX_KEY_SIZE]; Modified: src/pgroonga.h (+3 -0) =================================================================== --- src/pgroonga.h 2017-10-09 20:07:26 +0900 (3ed6a73) +++ src/pgroonga.h 2017-10-09 20:18:20 +0900 (3bf5270) @@ -58,6 +58,9 @@ #define PGrnLogPathDefault "pgroonga.log" #define PGrnQueryLogPathDefault "none" #define PGrnDatabaseBasename "pgrn" +#define PGrnBuildingSourcesTableNamePrefix "BuildingSources" +#define PGrnBuildingSourcesTableNamePrefixLength (sizeof(PGrnBuildingSourcesTableNamePrefix) - 1) +#define PGrnBuildingSourcesTableNameFormat PGrnBuildingSourcesTableNamePrefix "%u" #define PGrnSourcesTableNamePrefix "Sources" #define PGrnSourcesTableNamePrefixLength (sizeof(PGrnSourcesTableNamePrefix) - 1) #define PGrnSourcesTableNameFormat PGrnSourcesTableNamePrefix "%u" -------------- next part -------------- HTML����������������������������... URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20171009/0eb1fedb/attachment-0001.htm