[Groonga-commit] pgroonga/pgroonga at 52b00a7 [master] Fix removing creating index bug in another way

Back to archive index

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 



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