when building scylla with the standard library from GCC-14.2, shipped by
fedora 41, we have following build failure:
```
/home/kefu/.local/bin/clang++ -DDEBUG -DDEBUG_LSA_SANITIZER -DFMT_SHARED -DSANITIZE -DSCYLLA_BUILD_MODE=debug -DSCYLLA_ENABLE_ERROR_INJECTION -DSEASTAR_API_LEVEL=7 -DSEASTAR_DEBUG -DSEASTAR_DEBUG_PROMISE -DSEASTAR_DEBUG_SHARED_PTR -DSEASTAR_DEFAULT_ALLOCATOR -DSEASTAR_LOGGER_COMPILE_TIME_FMT -DSEASTAR_LOGGER_TYPE_STDOUT -DSEASTAR_SCHEDULING_GROUPS_COUNT=16 -DSEASTAR_SHUFFLE_TASK_QUEUE -DSEASTAR_SSTRING -DSEASTAR_TYPE_ERASE_MORE -DXXH_PRIVATE_API -DCMAKE_INTDIR=\"Debug\" -I/home/kefu/dev/scylladb -I/home/kefu/dev/scylladb/build/gen -I/home/kefu/dev/scylladb/seastar/include -I/home/kefu/dev/scylladb/build/seastar/gen/include -I/home/kefu/dev/scylladb/build/seastar/gen/src -isystem /home/kefu/dev/scylladb/abseil -g -Og -g -gz -std=gnu++23 -fvisibility=hidden -Wall -Werror -Wextra -Wno-error=deprecated-declarations -Wimplicit-fallthrough -Wno-c++11-narrowing -Wno-deprecated-copy -Wno-mismatched-tags -Wno-missing-field-initializers -Wno-overloaded-virtual -Wno-unsupported-friend -Wno-unused-parameter -ffile-prefix-map=/home/kefu/dev/scylladb/build=. -march=x86-64-v3 -mpclmul -Xclang -fexperimental-assignment-tracking=disabled -Werror=unused-result -fstack-clash-protection -fsanitize=address -fsanitize=undefined -MD -MT CMakeFiles/scylla-main.dir/Debug/init.cc.o -MF CMakeFiles/scylla-main.dir/Debug/init.cc.o.d -o CMakeFiles/scylla-main.dir/Debug/init.cc.o -c /home/kefu/dev/scylladb/init.cc
In file included from /home/kefu/dev/scylladb/init.cc:12:
In file included from /home/kefu/dev/scylladb/db/config.hh:20:
In file included from /home/kefu/dev/scylladb/locator/abstract_replication_strategy.hh:26:
/home/kefu/dev/scylladb/locator/tablets.hh:410:30: error: unexpected type name 'size_t': expected expression
410 | return boost::irange<size_t>(0, tablet_count()) | boost::adaptors::transformed([] (size_t i) {
| ^
/home/kefu/dev/scylladb/locator/tablets.hh:410:23: error: no member named 'irange' in namespace 'boost'
410 | return boost::irange<size_t>(0, tablet_count()) | boost::adaptors::transformed([] (size_t i) {
| ~~~~~~~^
/home/kefu/dev/scylladb/locator/tablets.hh:410:38: error: left operand of comma operator has no effect [-Werror,-Wunused-value]
410 | return boost::irange<size_t>(0, tablet_count()) | boost::adaptors::transformed([] (size_t i) {
| ^
3 errors generated.
[16/782] Building CXX object CMakeFiles/scylla-main.dir/Debug/keys.cc.o
[17/782] Building CXX object CMakeFiles/scylla-main.dir/Debug/counters.cc.o
[18/782] Building CXX object CMakeFiles/scylla-main.dir/Debug/partition_slice_builder.cc.o
[19/782] Building CXX object CMakeFiles/scylla-main.dir/Debug/mutation_query.cc.o
FAILED: CMakeFiles/scylla-main.dir/Debug/mutation_query.cc.o
/home/kefu/.local/bin/clang++ -DDEBUG -DDEBUG_LSA_SANITIZER -DFMT_SHARED -DSANITIZE -DSCYLLA_BUILD_MODE=debug -DSCYLLA_ENABLE_ERROR_INJECTION -DSEASTAR_API_LEVEL=7 -DSEASTAR_DEBUG -DSEASTAR_DEBUG_PROMISE -DSEASTAR_DEBUG_SHARED_PTR -DSEASTAR_DEFAULT_ALLOCATOR -DSEASTAR_LOGGER_COMPILE_TIME_FMT -DSEASTAR_LOGGER_TYPE_STDOUT -DSEASTAR_SCHEDULING_GROUPS_COUNT=16 -DSEASTAR_SHUFFLE_TASK_QUEUE -DSEASTAR_SSTRING -DSEASTAR_TYPE_ERASE_MORE -DXXH_PRIVATE_API -DCMAKE_INTDIR=\"Debug\" -I/home/kefu/dev/scylladb -I/home/kefu/dev/scylladb/build/gen -I/home/kefu/dev/scylladb/seastar/include -I/home/kefu/dev/scylladb/build/seastar/gen/include -I/home/kefu/dev/scylladb/build/seastar/gen/src -isystem /home/kefu/dev/scylladb/abseil -g -Og -g -gz -std=gnu++23 -fvisibility=hidden -Wall -Werror -Wextra -Wno-error=deprecated-declarations -Wimplicit-fallthrough -Wno-c++11-narrowing -Wno-deprecated-copy -Wno-mismatched-tags -Wno-missing-field-initializers -Wno-overloaded-virtual -Wno-unsupported-friend -Wno-unused-parameter -ffile-prefix-map=/home/kefu/dev/scylladb/build=. -march=x86-64-v3 -mpclmul -Xclang -fexperimental-assignment-tracking=disabled -Werror=unused-result -fstack-clash-protection -fsanitize=address -fsanitize=undefined -MD -MT CMakeFiles/scylla-main.dir/Debug/mutation_query.cc.o -MF CMakeFiles/scylla-main.dir/Debug/mutation_query.cc.o.d -o CMakeFiles/scylla-main.dir/Debug/mutation_query.cc.o -c /home/kefu/dev/scylladb/mutation_query.cc
In file included from /home/kefu/dev/scylladb/mutation_query.cc:12:
In file included from /home/kefu/dev/scylladb/schema/schema_registry.hh:17:
In file included from /home/kefu/dev/scylladb/replica/database.hh:11:
In file included from /home/kefu/dev/scylladb/locator/abstract_replication_strategy.hh:26:
/home/kefu/dev/scylladb/locator/tablets.hh:410:30: error: unexpected type name 'size_t': expected expression
410 | return boost::irange<size_t>(0, tablet_count()) | boost::adaptors::transformed([] (size_t i) {
| ^
/home/kefu/dev/scylladb/locator/tablets.hh:410:23: error: no member named 'irange' in namespace 'boost'
410 | return boost::irange<size_t>(0, tablet_count()) | boost::adaptors::transformed([] (size_t i) {
| ~~~~~~~^
/home/kefu/dev/scylladb/locator/tablets.hh:410:38: error: left operand of comma operator has no effect [-Werror,-Wunused-value]
410 | return boost::irange<size_t>(0, tablet_count()) | boost::adaptors::transformed([] (size_t i) {
| ^
In file included from /home/kefu/dev/scylladb/mutation_query.cc:12:
In file included from /home/kefu/dev/scylladb/schema/schema_registry.hh:17:
In file included from /home/kefu/dev/scylladb/replica/database.hh:37:
In file included from /home/kefu/dev/scylladb/db/snapshot-ctl.hh:20:
/home/kefu/dev/scylladb/tasks/task_manager.hh:403:54: error: no member named 'irange' in namespace 'boost'
403 | co_await coroutine::parallel_for_each(boost::irange(0u, smp::count), [&tm, id, &res, &func] (unsigned shard) -> future<> {
| ~~~~~~~^
4 errors generated.
```
so let's take the opportunity to switch from `boost::irange` to
`std::views::iota`.
in this change, we:
- switch from boost::irange to std::views::iota for better standard library compatibility
- retain boost::irange where step parameter is used, as std::views::iota doesn't support it
- this change partially modernizes our range usage while maintaining
- existing functionality
Signed-off-by: Kefu Chai <kefu.chai@scylladb.com>
Closes scylladb/scylladb#20924
128 lines
4.2 KiB
C++
128 lines
4.2 KiB
C++
/*
|
|
* Copyright (C) 2015-present ScyllaDB
|
|
*/
|
|
|
|
/*
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
#include "collectd.hh"
|
|
#include "api/api-doc/collectd.json.hh"
|
|
#include <seastar/core/scollectd.hh>
|
|
#include <seastar/core/scollectd_api.hh>
|
|
#include <boost/range/irange.hpp>
|
|
#include <ranges>
|
|
#include <regex>
|
|
#include "api/api_init.hh"
|
|
|
|
namespace api {
|
|
|
|
using namespace scollectd;
|
|
using namespace httpd;
|
|
|
|
using namespace json;
|
|
namespace cd = httpd::collectd_json;
|
|
|
|
static auto transformer(const std::vector<collectd_value>& values) {
|
|
cd::collectd_value collected_value;
|
|
for (auto v: values) {
|
|
switch (v._type) {
|
|
case scollectd::data_type::GAUGE:
|
|
collected_value.values.push(v.d());
|
|
break;
|
|
case scollectd::data_type::COUNTER:
|
|
collected_value.values.push(v.ui());
|
|
break;
|
|
case scollectd::data_type::REAL_COUNTER:
|
|
collected_value.values.push(v.d());
|
|
break;
|
|
default:
|
|
collected_value.values.push(v.ui());
|
|
break;
|
|
}
|
|
}
|
|
return collected_value;
|
|
}
|
|
|
|
|
|
static const char* str_to_regex(const sstring& v) {
|
|
if (v != "") {
|
|
return v.c_str();
|
|
}
|
|
return ".*";
|
|
}
|
|
|
|
void set_collectd(http_context& ctx, routes& r) {
|
|
cd::get_collectd.set(r, [](std::unique_ptr<request> req) {
|
|
|
|
auto id = ::make_shared<scollectd::type_instance_id>(req->get_path_param("pluginid"),
|
|
req->get_query_param("instance"), req->get_query_param("type"),
|
|
req->get_query_param("type_instance"));
|
|
|
|
|
|
return do_with(std::vector<cd::collectd_value>(), [id] (auto& vec) {
|
|
vec.resize(smp::count);
|
|
return parallel_for_each(std::views::iota(0u, smp::count), [&vec, id] (auto cpu) {
|
|
return smp::submit_to(cpu, [id = *id] {
|
|
return scollectd::get_collectd_value(id);
|
|
}).then([&vec, cpu] (auto res) {
|
|
vec[cpu] = transformer(res);
|
|
});
|
|
}).then([&vec] {
|
|
return make_ready_future<json::json_return_type>(vec);
|
|
});
|
|
});
|
|
});
|
|
|
|
cd::get_collectd_items.set(r, [](const_req req) {
|
|
std::vector<cd::collectd_metric_status> res;
|
|
auto ids = scollectd::get_collectd_ids();
|
|
for (auto i: ids) {
|
|
cd::type_instance_id id;
|
|
id.plugin = i.plugin();
|
|
id.plugin_instance = i.plugin_instance();
|
|
id.type = i.type();
|
|
id.type_instance = i.type_instance();
|
|
cd::collectd_metric_status it;
|
|
it.id = id;
|
|
it.enable = scollectd::is_enabled(i);
|
|
res.push_back(it);
|
|
}
|
|
return res;
|
|
});
|
|
|
|
cd::enable_collectd.set(r, [](std::unique_ptr<request> req) -> future<json::json_return_type> {
|
|
std::regex plugin(req->get_path_param("pluginid").c_str());
|
|
std::regex instance(str_to_regex(req->get_query_param("instance")));
|
|
std::regex type(str_to_regex(req->get_query_param("type")));
|
|
std::regex type_instance(str_to_regex(req->get_query_param("type_instance")));
|
|
bool enable = strcasecmp(req->get_query_param("enable").c_str(), "true") == 0;
|
|
return smp::invoke_on_all([enable, plugin, instance, type, type_instance]() {
|
|
for (auto id: scollectd::get_collectd_ids()) {
|
|
if (std::regex_match(std::string(id.plugin()), plugin) &&
|
|
std::regex_match(std::string(id.plugin_instance()), instance) &&
|
|
std::regex_match(std::string(id.type()), type) &&
|
|
std::regex_match(std::string(id.type_instance()), type_instance)) {
|
|
scollectd::enable(id, enable);
|
|
}
|
|
}
|
|
}).then([] {
|
|
return json::json_return_type(json_void());
|
|
});
|
|
});
|
|
|
|
cd::enable_all_collectd.set(r, [](std::unique_ptr<request> req) -> future<json::json_return_type> {
|
|
bool enable = strcasecmp(req->get_query_param("enable").c_str(), "true") == 0;
|
|
return smp::invoke_on_all([enable] {
|
|
for (auto id: scollectd::get_collectd_ids()) {
|
|
scollectd::enable(id, enable);
|
|
}
|
|
}).then([] {
|
|
return json::json_return_type(json_void());
|
|
});
|
|
});
|
|
}
|
|
|
|
}
|
|
|