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
MCOL-1810 Fix hang on low core count
Anything that links against joblist will spin up a threadpool upon startup. This includes the tools setConfig/getConfig. It is possible on a low core count machine or low CPU speed that the signal to the prune thread to shutdown is sent before the thread has completed startup when these quick-running tools are used. This fix adds a mutex so that spin up and shutdown can't happen at the same time as well as a stop watch in case we are shutting down when either the thread is running or we haven't fully started.
This commit is contained in:
@ -55,6 +55,7 @@ ThreadPool::~ThreadPool() throw()
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
boost::mutex::scoped_lock initLock(fInitMutex);
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
@ -64,6 +65,7 @@ ThreadPool::~ThreadPool() throw()
|
|||||||
|
|
||||||
void ThreadPool::init()
|
void ThreadPool::init()
|
||||||
{
|
{
|
||||||
|
boost::mutex::scoped_lock initLock(fInitMutex);
|
||||||
fThreadCount = 0;
|
fThreadCount = 0;
|
||||||
fGeneralErrors = 0;
|
fGeneralErrors = 0;
|
||||||
fFunctorErrors = 0;
|
fFunctorErrors = 0;
|
||||||
@ -89,6 +91,8 @@ void ThreadPool::pruneThread()
|
|||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
boost::system_time timeout = boost::get_system_time() + boost::posix_time::minutes(1);
|
boost::system_time timeout = boost::get_system_time() + boost::posix_time::minutes(1);
|
||||||
|
if (fStop)
|
||||||
|
return;
|
||||||
if (!fPruneThreadEnd.timed_wait(fPruneMutex, timeout))
|
if (!fPruneThreadEnd.timed_wait(fPruneMutex, timeout))
|
||||||
{
|
{
|
||||||
while(!fPruneThreads.empty())
|
while(!fPruneThreads.empty())
|
||||||
|
@ -357,6 +357,7 @@ private:
|
|||||||
|
|
||||||
std::string fName; // Optional to add a name to the pool for debugging.
|
std::string fName; // Optional to add a name to the pool for debugging.
|
||||||
bool fDebug;
|
bool fDebug;
|
||||||
|
boost::mutex fInitMutex;
|
||||||
boost::mutex fPruneMutex;
|
boost::mutex fPruneMutex;
|
||||||
boost::condition fPruneThreadEnd;
|
boost::condition fPruneThreadEnd;
|
||||||
boost::thread* fPruneThread;
|
boost::thread* fPruneThread;
|
||||||
|
Reference in New Issue
Block a user