Navigation Menu

Skip to content

Commit

Permalink
Fix removing creating index bug in another way
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
kou committed Oct 9, 2017
1 parent dba548a commit 52b00a7
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 97 deletions.
18 changes: 14 additions & 4 deletions src/pgrn-create.c
Expand Up @@ -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,
Expand All @@ -38,6 +38,16 @@ PGrnCreateSourcesTable(PGrnCreateData *data)
PGrnCreateSourcesCtidColumn(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)
{
Expand Down
3 changes: 2 additions & 1 deletion src/pgrn-create.h
Expand Up @@ -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;
Expand All @@ -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);
9 changes: 9 additions & 0 deletions src/pgrn-groonga.c
Expand Up @@ -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);
}
2 changes: 2 additions & 0 deletions src/pgrn-groonga.h
Expand Up @@ -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);
140 changes: 48 additions & 92 deletions src/pgroonga.c
Expand Up @@ -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);
}
}
}
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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();
{
Expand All @@ -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();
}
Expand Down Expand Up @@ -4696,21 +4693,24 @@ 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;

GRN_PTR_INIT(&supplementaryTables, GRN_OBJ_VECTOR, GRN_ID_NIL);
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();
{
Expand All @@ -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();
}
Expand Down Expand Up @@ -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;
Expand All @@ -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];
Expand Down
3 changes: 3 additions & 0 deletions src/pgroonga.h
Expand Up @@ -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"
Expand Down

0 comments on commit 52b00a7

Please sign in to comment.