You've already forked mariadb-columnstore-engine
mirror of
https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
synced 2025-07-30 19:23:07 +03:00
MCOL-859 DDL System catalog mutex deadlock
A race between a DDL change and a system catalog version cache update can cause a deadlock in DDLProc. This makes the mutex recursive.
This commit is contained in:
@ -1187,7 +1187,7 @@ const CalpontSystemCatalog::ColType CalpontSystemCatalog::colTypeDct(const OID&
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check map first cached column type
|
// check map first cached column type
|
||||||
boost::mutex::scoped_lock lk3(fDctTokenMapLock);
|
boost::recursive_mutex::scoped_lock lk3(fDctTokenMapLock);
|
||||||
DctTokenMap::const_iterator iter = fDctTokenMap.find(dictOid);
|
DctTokenMap::const_iterator iter = fDctTokenMap.find(dictOid);
|
||||||
if (iter != fDctTokenMap.end())
|
if (iter != fDctTokenMap.end())
|
||||||
return colType(iter->second);
|
return colType(iter->second);
|
||||||
@ -5317,7 +5317,7 @@ void CalpontSystemCatalog::flushCache()
|
|||||||
buildSysTablemap();
|
buildSysTablemap();
|
||||||
lk3.unlock();
|
lk3.unlock();
|
||||||
|
|
||||||
boost::mutex::scoped_lock lk4(fDctTokenMapLock);
|
boost::recursive_mutex::scoped_lock lk4(fDctTokenMapLock);
|
||||||
fDctTokenMap.clear();
|
fDctTokenMap.clear();
|
||||||
buildSysDctmap();
|
buildSysDctmap();
|
||||||
lk4.unlock();
|
lk4.unlock();
|
||||||
|
@ -869,7 +869,8 @@ private:
|
|||||||
|
|
||||||
typedef std::map<OID, OID> DctTokenMap;
|
typedef std::map<OID, OID> DctTokenMap;
|
||||||
DctTokenMap fDctTokenMap;
|
DctTokenMap fDctTokenMap;
|
||||||
boost::mutex fDctTokenMapLock;
|
// MCOL-859: this can lock when already locked in the same thread
|
||||||
|
boost::recursive_mutex fDctTokenMapLock;
|
||||||
|
|
||||||
typedef std::map<OID, TableName> TableNameMap;
|
typedef std::map<OID, TableName> TableNameMap;
|
||||||
TableNameMap fTableNameMap;
|
TableNameMap fTableNameMap;
|
||||||
|
Reference in New Issue
Block a user