Skip to content

Commit 2d1f082

Browse files
jgates108fritzm
authored andcommitted
Relocated mutex so it no longer covers query parsing.
1 parent 43d181a commit 2d1f082

File tree

3 files changed

+16
-16
lines changed

3 files changed

+16
-16
lines changed

src/ccontrol/UserQueryFactory.cc

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

src/ccontrol/UserQueryFactory.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,11 @@ class UserQueryFactory : private boost::noncopyable {
104104
std::unique_ptr<boost::asio::io_service::work> _asioWork;
105105
std::unique_ptr<std::thread> _asioTimerThread;
106106

107-
std::mutex _factoryMtx; // &&& is this needed
107+
/// Protects CSS in `qs->analyzeQuery(query, stmt);` and
108+
/// protects uq calls that alter the database.
109+
std::mutex _factoryMtx;
108110
};
109111

110-
111112
} // namespace lsst::qserv::ccontrol
112113

113114
#endif // LSST_QSERV_CCONTROL_USERQUERYFACTORY_H

src/czar/Czar.cc

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -224,12 +224,8 @@ SubmitResult Czar::submitQuery(string const& query, map<string, string> const& h
224224

225225
// make new UserQuery
226226
// this is atomic
227-
ccontrol::UserQuery::Ptr uq;
228-
{
229-
lock_guard<mutex> lock(_mutex);
230-
uq = _uqFactory->newUserQuery(query, defaultDb, getQdispSharedResources(), userQueryId, msgTableName,
231-
resultDb);
232-
}
227+
ccontrol::UserQuery::Ptr uq = _uqFactory->newUserQuery(query, defaultDb, getQdispSharedResources(),
228+
userQueryId, msgTableName, resultDb);
233229

234230
// Add logging context with query ID
235231
QSERV_LOGCONTEXT_QUERY(uq->getQueryId());

0 commit comments

Comments
 (0)