mirror of https://github.com/citusdata/citus.git
make VacuumTaskList even with other taskList functions and some safety changes
Makees VacuumTaskList function even with other TaskList creator functions. Also, previously we were generating per-shard vacuum command strings via unconventional usage of StringInfo struct (setting the stringInfo->len field manually) which could cause unexepected memory errors (that I cannot foresee now).pull/3554/head
parent
cf718ffe77
commit
ff9c9d1808
|
@ -44,7 +44,7 @@ typedef struct CitusVacuumParams
|
||||||
static bool IsDistributedVacuumStmt(int vacuumOptions, List *vacuumRelationIdList);
|
static bool IsDistributedVacuumStmt(int vacuumOptions, List *vacuumRelationIdList);
|
||||||
static List * VacuumTaskList(Oid relationId, CitusVacuumParams vacuumParams,
|
static List * VacuumTaskList(Oid relationId, CitusVacuumParams vacuumParams,
|
||||||
List *vacuumColumnList);
|
List *vacuumColumnList);
|
||||||
static StringInfo DeparseVacuumStmtPrefix(CitusVacuumParams vacuumParams);
|
static char * DeparseVacuumStmtPrefix(CitusVacuumParams vacuumParams);
|
||||||
static char * DeparseVacuumColumnNames(List *columnNameList);
|
static char * DeparseVacuumColumnNames(List *columnNameList);
|
||||||
static List * VacuumColumnList(VacuumStmt *vacuumStmt, int relationIndex);
|
static List * VacuumColumnList(VacuumStmt *vacuumStmt, int relationIndex);
|
||||||
static List * ExtractVacuumTargetRels(VacuumStmt *vacuumStmt);
|
static List * ExtractVacuumTargetRels(VacuumStmt *vacuumStmt);
|
||||||
|
@ -182,15 +182,17 @@ IsDistributedVacuumStmt(int vacuumOptions, List *vacuumRelationIdList)
|
||||||
static List *
|
static List *
|
||||||
VacuumTaskList(Oid relationId, CitusVacuumParams vacuumParams, List *vacuumColumnList)
|
VacuumTaskList(Oid relationId, CitusVacuumParams vacuumParams, List *vacuumColumnList)
|
||||||
{
|
{
|
||||||
|
/* resulting task list */
|
||||||
List *taskList = NIL;
|
List *taskList = NIL;
|
||||||
uint64 jobId = INVALID_JOB_ID;
|
|
||||||
|
/* enumerate the tasks when putting them to the taskList */
|
||||||
int taskId = 1;
|
int taskId = 1;
|
||||||
StringInfo vacuumString = DeparseVacuumStmtPrefix(vacuumParams);
|
|
||||||
const int vacuumPrefixLen = vacuumString->len;
|
|
||||||
Oid schemaId = get_rel_namespace(relationId);
|
Oid schemaId = get_rel_namespace(relationId);
|
||||||
char *schemaName = get_namespace_name(schemaId);
|
char *schemaName = get_namespace_name(schemaId);
|
||||||
char *tableName = get_rel_name(relationId);
|
char *relationName = get_rel_name(relationId);
|
||||||
|
|
||||||
|
const char *vacuumStringPrefix = DeparseVacuumStmtPrefix(vacuumParams);
|
||||||
const char *columnNames = DeparseVacuumColumnNames(vacuumColumnList);
|
const char *columnNames = DeparseVacuumColumnNames(vacuumColumnList);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -210,20 +212,25 @@ VacuumTaskList(Oid relationId, CitusVacuumParams vacuumParams, List *vacuumColum
|
||||||
foreach_ptr(shardInterval, shardIntervalList)
|
foreach_ptr(shardInterval, shardIntervalList)
|
||||||
{
|
{
|
||||||
uint64 shardId = shardInterval->shardId;
|
uint64 shardId = shardInterval->shardId;
|
||||||
|
char *shardRelationName = pstrdup(relationName);
|
||||||
|
|
||||||
char *shardName = pstrdup(tableName);
|
/* build shard relation name */
|
||||||
AppendShardIdToName(&shardName, shardInterval->shardId);
|
AppendShardIdToName(&shardRelationName, shardId);
|
||||||
shardName = quote_qualified_identifier(schemaName, shardName);
|
|
||||||
|
|
||||||
vacuumString->len = vacuumPrefixLen;
|
char *quotedShardName = quote_qualified_identifier(schemaName, shardRelationName);
|
||||||
appendStringInfoString(vacuumString, shardName);
|
|
||||||
appendStringInfoString(vacuumString, columnNames);
|
/* copy base vacuum string and build the shard specific command */
|
||||||
|
StringInfo vacuumStringForShard = makeStringInfo();
|
||||||
|
appendStringInfoString(vacuumStringForShard, vacuumStringPrefix);
|
||||||
|
|
||||||
|
appendStringInfoString(vacuumStringForShard, quotedShardName);
|
||||||
|
appendStringInfoString(vacuumStringForShard, columnNames);
|
||||||
|
|
||||||
Task *task = CitusMakeNode(Task);
|
Task *task = CitusMakeNode(Task);
|
||||||
task->jobId = jobId;
|
task->jobId = INVALID_JOB_ID;
|
||||||
task->taskId = taskId++;
|
task->taskId = taskId++;
|
||||||
task->taskType = VACUUM_ANALYZE_TASK;
|
task->taskType = VACUUM_ANALYZE_TASK;
|
||||||
SetTaskQueryString(task, pstrdup(vacuumString->data));
|
SetTaskQueryString(task, vacuumStringForShard->data);
|
||||||
task->dependentTaskList = NULL;
|
task->dependentTaskList = NULL;
|
||||||
task->replicationModel = REPLICATION_MODEL_INVALID;
|
task->replicationModel = REPLICATION_MODEL_INVALID;
|
||||||
task->anchorShardId = shardId;
|
task->anchorShardId = shardId;
|
||||||
|
@ -242,7 +249,7 @@ VacuumTaskList(Oid relationId, CitusVacuumParams vacuumParams, List *vacuumColum
|
||||||
* reuse this prefix within a loop to generate shard-specific VACUUM or ANALYZE
|
* reuse this prefix within a loop to generate shard-specific VACUUM or ANALYZE
|
||||||
* statements.
|
* statements.
|
||||||
*/
|
*/
|
||||||
static StringInfo
|
static char *
|
||||||
DeparseVacuumStmtPrefix(CitusVacuumParams vacuumParams)
|
DeparseVacuumStmtPrefix(CitusVacuumParams vacuumParams)
|
||||||
{
|
{
|
||||||
int vacuumFlags = vacuumParams.options;
|
int vacuumFlags = vacuumParams.options;
|
||||||
|
@ -276,7 +283,7 @@ DeparseVacuumStmtPrefix(CitusVacuumParams vacuumParams)
|
||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return vacuumPrefix;
|
return vacuumPrefix->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* otherwise, handle options */
|
/* otherwise, handle options */
|
||||||
|
@ -334,7 +341,7 @@ DeparseVacuumStmtPrefix(CitusVacuumParams vacuumParams)
|
||||||
|
|
||||||
appendStringInfoChar(vacuumPrefix, ' ');
|
appendStringInfoChar(vacuumPrefix, ' ');
|
||||||
|
|
||||||
return vacuumPrefix;
|
return vacuumPrefix->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue