From 6d50e93f10ff4ccfc5680a67d71414772da2e4ac Mon Sep 17 00:00:00 2001 From: Tomasz Grabiec Date: Thu, 14 Mar 2024 13:31:52 +0100 Subject: [PATCH] raft, api: Add RESTful API to query current leader of a raft group Example: $ curl -X GET "http://127.0.0.1:10000/raft/leader_host" "f7f57588-62de-4cac-9e4b-c62bfc458d91" Accepts optional group_id param, defaults to group0. --- api/api-doc/raft.json | 24 ++++++++++++++++++++++++ api/raft.cc | 14 ++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/api/api-doc/raft.json b/api/api-doc/raft.json index 9673682069..34dba0c6f3 100644 --- a/api/api-doc/raft.json +++ b/api/api-doc/raft.json @@ -38,6 +38,30 @@ ] } ] + }, + { + "path":"/raft/leader_host", + "operations":[ + { + "method":"GET", + "summary":"Returns host ID of the current leader of the given Raft group", + "type":"string", + "nickname":"get_leader_host", + "produces":[ + "application/json" + ], + "parameters":[ + { + "name":"group_id", + "description":"The ID of the group. When absent, group0 is used.", + "required":false, + "allowMultiple":false, + "type":"string", + "paramType":"query" + } + ] + } + ] } ] } diff --git a/api/raft.cc b/api/raft.cc index eab13889dd..f62d524d16 100644 --- a/api/raft.cc +++ b/api/raft.cc @@ -60,10 +60,24 @@ void set_raft(http_context&, httpd::routes& r, sharded req) -> future { + return smp::submit_to(0, [&] { + auto& srv = std::invoke([&] () -> raft::server& { + if (req->query_parameters.contains("group_id")) { + raft::group_id id{utils::UUID{req->get_query_param("group_id")}}; + return raft_gr.local().get_server(id); + } else { + return raft_gr.local().group0(); + } + }); + return json_return_type(srv.current_leader().to_sstring()); + }); + }); } void unset_raft(http_context&, httpd::routes& r) { r::trigger_snapshot.unset(r); + r::get_leader_host.unset(r); } }