From ab207356a5f2188ca47ebf20fb27770eff51def7 Mon Sep 17 00:00:00 2001 From: Amnon Heiman Date: Mon, 20 Aug 2018 22:56:31 +0300 Subject: [PATCH] API: storage_service stream endpoints This patch changes how list of tokens returned from the storage_service API. Instead of create a vector and construct a json object of it, use the streaming capabilities of the http. This is important for large cluster and prevent large allocations. Fixes #3701 Signed-off-by: Amnon Heiman Message-Id: <20180820195631.26792-1-amnon@scylladb.com> --- api/storage_service.cc | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/api/storage_service.cc b/api/storage_service.cc index 2505ad0fb9..a43167711a 100644 --- a/api/storage_service.cc +++ b/api/storage_service.cc @@ -78,15 +78,17 @@ void set_storage_service(http_context& ctx, routes& r) { }); }); - ss::get_tokens.set(r, [] (const_req req) { - auto tokens = service::get_local_storage_service().get_token_metadata().sorted_tokens(); - return container_to_vec(tokens); + ss::get_tokens.set(r, [] (std::unique_ptr req) { + return make_ready_future(stream_range_as_array(service::get_local_storage_service().get_token_metadata().sorted_tokens(), [](const dht::token& i) { + return boost::lexical_cast(i); + })); }); - ss::get_node_tokens.set(r, [] (const_req req) { - gms::inet_address addr(req.param["endpoint"]); - auto tokens = service::get_local_storage_service().get_token_metadata().get_tokens(addr); - return container_to_vec(tokens); + ss::get_node_tokens.set(r, [] (std::unique_ptr req) { + gms::inet_address addr(req->param["endpoint"]); + return make_ready_future(stream_range_as_array(service::get_local_storage_service().get_token_metadata().get_tokens(addr), [](const dht::token& i) { + return boost::lexical_cast(i); + })); }); ss::get_commitlog.set(r, [&ctx](const_req req) {