@@ -298,20 +298,19 @@ UserQuery::Ptr UserQueryFactory::newUserQuery(std::string const& aQuery, std::st
298298 }
299299 auto stmt = parser->getSelectStmt ();
300300
301- // / &&& not entirely sure what the _mutex was protecting _clientToQuery and _idToQuery aren't touched
302- // / &&& Not sure what internal elements of UserQueryFactory need protection?
303- // / &&& None of its members look like they need protection.
304- // / &&& Is there an order of operations to things happening in the database?
305- std::unique_lock<std::mutex> uLock (_factoryMtx); // &&&
301+ // Parsing doesn't need protection, but CSS in analyze query does and
302+ // some of the uq related calls may require protection, but it
303+ // isn't clear.
304+ std::lock_guard<std::mutex> factoryLock (_factoryMtx);
306305
307306 // handle special database/table names
308307 if (_stmtRefersToProcessListTable (stmt, defaultDb)) {
309308 return _makeUserQueryProcessList (stmt, _userQuerySharedResources, userQueryId, resultDb, aQuery,
310- async);
309+ async);
311310 }
312311 if (_stmtRefersQueriesTable (stmt, defaultDb)) {
313312 return _makeUserQueryQueries (stmt, _userQuerySharedResources, userQueryId, resultDb, aQuery,
314- async);
313+ async);
315314 }
316315
317316 // / Determine if a SelectStmt is a simple COUNT(*) query and can be run as an optimized query.
@@ -343,7 +342,6 @@ UserQuery::Ptr UserQueryFactory::newUserQuery(std::string const& aQuery, std::st
343342 auto qs = std::make_shared<qproc::QuerySession>(_userQuerySharedResources->css ,
344343 _userQuerySharedResources->databaseModels , defaultDb,
345344 _userQuerySharedResources->interactiveChunkLimit );
346- uLock.unlock (); // &&& unlock the mutex before going back to expensive operations.
347345 try {
348346 qs->analyzeQuery (query, stmt);
349347 } catch (...) {
@@ -385,12 +383,14 @@ UserQuery::Ptr UserQueryFactory::newUserQuery(std::string const& aQuery, std::st
385383 }
386384 return uq;
387385 } else if (UserQueryType::isSelectResult (query, userJobId)) {
386+ std::lock_guard<std::mutex> factoryLock (_factoryMtx);
388387 auto uq = std::make_shared<UserQueryAsyncResult>(userJobId, _userQuerySharedResources->czarId ,
389388 _userQuerySharedResources->queryMetadata );
390389 LOGS (_log, LOG_LVL_DEBUG, " make UserQueryAsyncResult: userJobId=" << userJobId);
391390 return uq;
392391 } else if (UserQueryType::isShowProcessList (query, full)) {
393392 LOGS (_log, LOG_LVL_DEBUG, " make UserQueryProcessList: full=" << (full ? ' y' : ' n' ));
393+ std::lock_guard<std::mutex> factoryLock (_factoryMtx);
394394 try {
395395 return std::make_shared<UserQueryProcessList>(full, _userQuerySharedResources->qMetaSelect ,
396396 _userQuerySharedResources->czarId , userQueryId,
@@ -399,10 +399,12 @@ UserQuery::Ptr UserQueryFactory::newUserQuery(std::string const& aQuery, std::st
399399 return std::make_shared<UserQueryInvalid>(exc.what ());
400400 }
401401 } else if (UserQueryType::isCall (query)) {
402+ std::lock_guard<std::mutex> factoryLock (_factoryMtx);
402403 auto parser = std::make_shared<ParseRunner>(
403404 query, _userQuerySharedResources->makeUserQueryResources (userQueryId, resultDb));
404405 return parser->getUserQuery ();
405406 } else if (UserQueryType::isSet (query)) {
407+ std::lock_guard<std::mutex> factoryLock (_factoryMtx);
406408 ParseRunner::Ptr parser;
407409 try {
408410 parser = std::make_shared<ParseRunner>(query);
@@ -421,6 +423,7 @@ UserQuery::Ptr UserQueryFactory::newUserQuery(std::string const& aQuery, std::st
421423 }
422424 return uq;
423425 } else {
426+ std::lock_guard<std::mutex> factoryLock (_factoryMtx);
424427 // something that we don't recognize
425428 auto uq = std::make_shared<UserQueryInvalid>(" Invalid or unsupported query: " + query);
426429 return uq;
0 commit comments