diff --git a/src/admin/python/lsst/qserv/admin/replicationInterface.py b/src/admin/python/lsst/qserv/admin/replicationInterface.py index 9cdaafd88..4d15f3146 100644 --- a/src/admin/python/lsst/qserv/admin/replicationInterface.py +++ b/src/admin/python/lsst/qserv/admin/replicationInterface.py @@ -201,7 +201,7 @@ def __init__( self.repl_ctrl = urlparse(repl_ctrl_uri) self.auth_key = auth_key self.admin_auth_key = admin_auth_key - self.repl_api_version = 23 + self.repl_api_version = 24 _log.debug(f"ReplicationInterface %s", self.repl_ctrl) def version(self) -> str: diff --git a/src/replica/HttpMetaModule.cc b/src/replica/HttpMetaModule.cc index 85cb9a1e5..f1a476d2b 100644 --- a/src/replica/HttpMetaModule.cc +++ b/src/replica/HttpMetaModule.cc @@ -34,7 +34,7 @@ using json = nlohmann::json; namespace lsst::qserv::replica { -unsigned int const HttpMetaModule::version = 23; +unsigned int const HttpMetaModule::version = 24; void HttpMetaModule::process(ServiceProvider::Ptr const& serviceProvider, string const& context, qhttp::Request::Ptr const& req, qhttp::Response::Ptr const& resp, diff --git a/src/replica/HttpProcessor.cc b/src/replica/HttpProcessor.cc index 7ab0dff2b..1632afa2b 100644 --- a/src/replica/HttpProcessor.cc +++ b/src/replica/HttpProcessor.cc @@ -238,6 +238,12 @@ void HttpProcessor::registerServices() { HttpQservMonitorModule::process(self->controller(), self->name(), self->_processorConfig, req, resp, "WORKER"); }); + httpServer()->addHandler("GET", "/replication/qserv/worker/db/:worker", + [self](qhttp::Request::Ptr const req, qhttp::Response::Ptr const resp) { + HttpQservMonitorModule::process(self->controller(), self->name(), + self->_processorConfig, req, resp, + "WORKER-DB"); + }); httpServer()->addHandler("GET", "/replication/qserv/master/query", [self](qhttp::Request::Ptr const req, qhttp::Response::Ptr const resp) { HttpQservMonitorModule::process(self->controller(), self->name(), diff --git a/src/replica/HttpQservMonitorModule.cc b/src/replica/HttpQservMonitorModule.cc index 3f8c10074..67fa1ffb0 100644 --- a/src/replica/HttpQservMonitorModule.cc +++ b/src/replica/HttpQservMonitorModule.cc @@ -139,6 +139,8 @@ json HttpQservMonitorModule::executeImpl(string const& subModuleName) { return _workers(); else if (subModuleName == "WORKER") return _worker(); + else if (subModuleName == "WORKER-DB") + return _workerDb(); else if (subModuleName == "QUERIES") return _userQueries(); else if (subModuleName == "QUERY") @@ -217,6 +219,34 @@ json HttpQservMonitorModule::_worker() { return result; } +json HttpQservMonitorModule::_workerDb() { + debug(__func__); + checkApiVersion(__func__, 24); + + auto const worker = params().at("worker"); + unsigned int const timeoutSec = query().optionalUInt("timeout_sec", workerResponseTimeoutSec()); + wbase::TaskSelector const taskSelector = _translateTaskSelector(__func__); + + debug(__func__, "worker=" + worker); + debug(__func__, "timeout_sec=" + to_string(timeoutSec)); + + string const noParentJobId; + GetDbStatusQservMgtRequest::CallbackType const onFinish = nullptr; + + auto const request = controller()->serviceProvider()->qservMgtServices()->databaseStatus( + worker, noParentJobId, onFinish, timeoutSec); + request->wait(); + + if (request->extendedState() != QservMgtRequest::ExtendedState::SUCCESS) { + string const msg = "database operation failed, error: " + + QservMgtRequest::state2string(request->extendedState()); + throw HttpError(__func__, msg); + } + json result = json::object(); + result["status"] = request->info(); + return result; +} + wbase::TaskSelector HttpQservMonitorModule::_translateTaskSelector(string const& func) const { wbase::TaskSelector selector; selector.includeTasks = query().optionalUInt("include_tasks", 0) != 0; diff --git a/src/replica/HttpQservMonitorModule.h b/src/replica/HttpQservMonitorModule.h index 76cd39688..0224f7f09 100644 --- a/src/replica/HttpQservMonitorModule.h +++ b/src/replica/HttpQservMonitorModule.h @@ -56,6 +56,7 @@ class HttpQservMonitorModule : public HttpModule { * * WORKERS get the status info of many workers (possible selected by various criteria) * WORKER get the status info of a specific worker + * WORKER-DB get the database status of a specific worker * QUERIES get user query info (queries selected by various criteria) * QUERY get user query info for a specific query * CSS get CSS configurations (the shared scan settings, etc.) @@ -94,6 +95,12 @@ class HttpQservMonitorModule : public HttpModule { */ nlohmann::json _worker(); + /** + * Process a request for extracting various status info on the database + * service for select Qserv worker. + */ + nlohmann::json _workerDb(); + /** * Process a request for extracting a status on select user queries * launched at Qserv.