mirror of https://github.com/citusdata/citus.git
drop storage for DROP command
parent
e9045227cd
commit
b18c9c8060
75
cstore_fdw.c
75
cstore_fdw.c
|
@ -127,7 +127,7 @@ static uint64 CopyIntoCStoreTable(const CopyStmt *copyStatement,
|
||||||
const char *queryString);
|
const char *queryString);
|
||||||
static uint64 CopyOutCStoreTable(CopyStmt *copyStatement, const char *queryString);
|
static uint64 CopyOutCStoreTable(CopyStmt *copyStatement, const char *queryString);
|
||||||
static void CStoreProcessAlterTableCommand(AlterTableStmt *alterStatement);
|
static void CStoreProcessAlterTableCommand(AlterTableStmt *alterStatement);
|
||||||
static List * DroppedCStoreFilenameList(DropStmt *dropStatement);
|
static List * DroppedCStoreRelidList(DropStmt *dropStatement);
|
||||||
static List * FindCStoreTables(List *tableList);
|
static List * FindCStoreTables(List *tableList);
|
||||||
static List * OpenRelationsForTruncate(List *cstoreTableList);
|
static List * OpenRelationsForTruncate(List *cstoreTableList);
|
||||||
static void InitializeRelFileNode(Relation relation);
|
static void InitializeRelFileNode(Relation relation);
|
||||||
|
@ -369,17 +369,43 @@ CStoreProcessUtility(Node * parseTree, const char * queryString,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ListCell *fileListCell = NULL;
|
List *dropRelids = DroppedCStoreRelidList((DropStmt *) parseTree);
|
||||||
List *droppedTables = DroppedCStoreFilenameList((DropStmt *) parseTree);
|
List *dropFiles = NIL;
|
||||||
|
ListCell *lc = NULL;
|
||||||
|
|
||||||
|
/* drop smgr storage */
|
||||||
|
foreach(lc, dropRelids)
|
||||||
|
{
|
||||||
|
Oid relid = lfirst_oid(lc);
|
||||||
|
Relation relation = cstore_fdw_open(relid, AccessExclusiveLock);
|
||||||
|
CStoreOptions *cstoreOptions = CStoreGetOptions(relid);
|
||||||
|
char *defaultfilename = CStoreDefaultFilePath(relid);
|
||||||
|
|
||||||
|
RelationOpenSmgr(relation);
|
||||||
|
RelationDropStorage(relation);
|
||||||
|
heap_close(relation, AccessExclusiveLock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Skip files that are placed in default location, they are handled
|
||||||
|
* by sql drop trigger. Both paths are generated by code, use
|
||||||
|
* of strcmp is safe here.
|
||||||
|
*/
|
||||||
|
if (strcmp(defaultfilename, cstoreOptions->filename) == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
dropFiles = lappend(dropFiles, cstoreOptions->filename);
|
||||||
|
}
|
||||||
|
|
||||||
CALL_PREVIOUS_UTILITY(parseTree, queryString, context, paramListInfo,
|
CALL_PREVIOUS_UTILITY(parseTree, queryString, context, paramListInfo,
|
||||||
destReceiver, completionTag);
|
destReceiver, completionTag);
|
||||||
|
|
||||||
foreach(fileListCell, droppedTables)
|
/* drop files */
|
||||||
|
foreach(lc, dropFiles)
|
||||||
{
|
{
|
||||||
char *fileName = lfirst(fileListCell);
|
char *filename = lfirst(lc);
|
||||||
//TODO: relation storage is not dropped
|
DeleteCStoreTableFiles(filename);
|
||||||
DeleteCStoreTableFiles(fileName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -783,13 +809,13 @@ CStoreProcessAlterTableCommand(AlterTableStmt *alterStatement)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DropppedCStoreFilenameList extracts and returns the list of cstore file names
|
* DropppedCStoreRelidList extracts and returns the list of cstore relids
|
||||||
* from DROP table statement
|
* from DROP table statement
|
||||||
*/
|
*/
|
||||||
static List *
|
static List *
|
||||||
DroppedCStoreFilenameList(DropStmt *dropStatement)
|
DroppedCStoreRelidList(DropStmt *dropStatement)
|
||||||
{
|
{
|
||||||
List *droppedCStoreFileList = NIL;
|
List *droppedCStoreRelidList = NIL;
|
||||||
|
|
||||||
if (dropStatement->removeType == OBJECT_FOREIGN_TABLE)
|
if (dropStatement->removeType == OBJECT_FOREIGN_TABLE)
|
||||||
{
|
{
|
||||||
|
@ -802,26 +828,13 @@ DroppedCStoreFilenameList(DropStmt *dropStatement)
|
||||||
Oid relationId = RangeVarGetRelid(rangeVar, AccessShareLock, true);
|
Oid relationId = RangeVarGetRelid(rangeVar, AccessShareLock, true);
|
||||||
if (CStoreTable(relationId))
|
if (CStoreTable(relationId))
|
||||||
{
|
{
|
||||||
CStoreOptions *cstoreOptions = CStoreGetOptions(relationId);
|
droppedCStoreRelidList = lappend_oid(droppedCStoreRelidList,
|
||||||
char *defaultfilename = CStoreDefaultFilePath(relationId);
|
relationId);
|
||||||
|
|
||||||
/*
|
|
||||||
* Skip files that are placed in default location, they are handled
|
|
||||||
* by sql drop trigger. Both paths are generated by code, use
|
|
||||||
* of strcmp is safe here.
|
|
||||||
*/
|
|
||||||
if (strcmp(defaultfilename, cstoreOptions->filename) == 0)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
droppedCStoreFileList = lappend(droppedCStoreFileList,
|
|
||||||
cstoreOptions->filename);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return droppedCStoreFileList;
|
return droppedCStoreRelidList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1254,7 +1267,15 @@ cstore_clean_table_resources(PG_FUNCTION_ARGS)
|
||||||
struct stat fileStat;
|
struct stat fileStat;
|
||||||
int statResult = -1;
|
int statResult = -1;
|
||||||
|
|
||||||
//TODO: relation storage is not dropped
|
/*
|
||||||
|
* TODO: Event triggers do not offer the relfilenode of the
|
||||||
|
* dropped table, and by the time the sql_drop event trigger
|
||||||
|
* is called, the object is already gone so we can't look it
|
||||||
|
* up. Therefore, we can't drop the Smgr storage here, which
|
||||||
|
* means that cascaded drops of cstore foreign tables will
|
||||||
|
* leak storage.
|
||||||
|
*/
|
||||||
|
|
||||||
appendStringInfo(filePath, "%s/%s/%d/%d", DataDir, CSTORE_FDW_NAME,
|
appendStringInfo(filePath, "%s/%s/%d/%d", DataDir, CSTORE_FDW_NAME,
|
||||||
(int) MyDatabaseId, (int) relationId);
|
(int) MyDatabaseId, (int) relationId);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue