You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-29 08:21:15 +03:00
fix(memory leaks): MCOL-5791 - get rid of memory leaks in plugin code (#3365)
There were numerous memory leaks in plugin's code and associated code. During typical run of MTR tests it leaked around 65 megabytes of objects. As a result they may severely affect long-lived connections. This patch fixes (almost) all leaks found in the plugin. The exceptions are two leaks associated with SHOW CREATE TABLE columnstore_table and getting information of columns of columnstore-handled table. These should be fixed on the server side and work is on the way.
This commit is contained in:
@ -179,7 +179,15 @@ struct gp_walk_info
|
||||
TableOnExprList tableOnExprList;
|
||||
std::vector<COND*> condList;
|
||||
|
||||
gp_walk_info(long timeZone_)
|
||||
// All SubQuery allocations are single-linked into this chain.
|
||||
// At the end of gp_walk_info processing we can free whole chain at once.
|
||||
// This is done so because the juggling of SubQuery pointers in the
|
||||
// ha_mcs_execplan code.
|
||||
// There is a struct SubQueryChainHolder down below to hold chain root and free
|
||||
// the chain using sorta kinda RAII.
|
||||
SubQuery** subQueriesChain;
|
||||
|
||||
gp_walk_info(long timeZone_, SubQuery** subQueriesChain_)
|
||||
: sessionid(0)
|
||||
, fatalParseError(false)
|
||||
, condPush(false)
|
||||
@ -204,12 +212,21 @@ struct gp_walk_info
|
||||
, timeZone(timeZone_)
|
||||
, inSubQueryLHS(nullptr)
|
||||
, inSubQueryLHSItem(nullptr)
|
||||
, subQueriesChain(subQueriesChain_)
|
||||
{
|
||||
}
|
||||
~gp_walk_info();
|
||||
|
||||
~gp_walk_info()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
struct SubQueryChainHolder;
|
||||
struct ext_cond_info
|
||||
{
|
||||
// having this as a direct field would introduce
|
||||
// circular dependency on header inclusion with ha_subquery.h.
|
||||
boost::shared_ptr<SubQueryChainHolder> chainHolder;
|
||||
gp_walk_info gwi;
|
||||
ext_cond_info(long timeZone); // needs knowledge on SubQueryChainHolder, will be defined elsewhere
|
||||
};
|
||||
|
||||
struct cal_table_info
|
||||
@ -223,17 +240,14 @@ struct cal_table_info
|
||||
cal_table_info() : tpl_ctx(0), c(0), msTablePtr(0), conn_hndl(0), condInfo(0), moreRows(false)
|
||||
{
|
||||
}
|
||||
~cal_table_info()
|
||||
{
|
||||
}
|
||||
sm::cpsm_tplh_t* tpl_ctx;
|
||||
std::stack<sm::cpsm_tplh_t*> tpl_ctx_st;
|
||||
sm::sp_cpsm_tplh_t tpl_ctx;
|
||||
std::stack<sm::sp_cpsm_tplh_t> tpl_ctx_st;
|
||||
sm::sp_cpsm_tplsch_t tpl_scan_ctx;
|
||||
std::stack<sm::sp_cpsm_tplsch_t> tpl_scan_ctx_st;
|
||||
unsigned c; // for debug purpose
|
||||
TABLE* msTablePtr; // no ownership
|
||||
sm::cpsm_conhdl_t* conn_hndl;
|
||||
gp_walk_info* condInfo;
|
||||
ext_cond_info* condInfo;
|
||||
execplan::SCSEP csep;
|
||||
bool moreRows; // are there more rows to consume (b/c of limit)
|
||||
};
|
||||
@ -400,6 +414,7 @@ int getGroupPlan(gp_walk_info& gwi, SELECT_LEX& select_lex, execplan::SCSEP& cse
|
||||
void setError(THD* thd, uint32_t errcode, const std::string errmsg, gp_walk_info* gwi);
|
||||
void setError(THD* thd, uint32_t errcode, const std::string errmsg);
|
||||
void gp_walk(const Item* item, void* arg);
|
||||
void clearDeleteStacks(gp_walk_info& gwi);
|
||||
void parse_item(Item* item, std::vector<Item_field*>& field_vec, bool& hasNonSupportItem, uint16& parseInfo,
|
||||
gp_walk_info* gwip = NULL);
|
||||
const std::string bestTableName(const Item_field* ifp);
|
||||
|
Reference in New Issue
Block a user