/*
 * Fills all section of all backends
 */
static void backends_stats_json(uint64_t categories,
                                rapidjson::Value &stat_value,
                                rapidjson::Document::AllocatorType &allocator,
                                struct dnet_node *node) {
	const auto &backends = node->config_data->backends->backends;
	for (size_t i = 0; i < backends.size(); ++i) {
		rapidjson::Value backend_stat(rapidjson::kObjectType);
		stat_value.AddMember(std::to_string(static_cast<unsigned long long>(i)).c_str(),
		                     allocator,
		                     backend_stats_json(categories, backend_stat, allocator, node, i),
		                     allocator);
	}
}
/*
 * Fills all section of all backends
 */
static void backends_stats_json(uint64_t categories,
                                rapidjson::Value &stat_value,
                                rapidjson::Document::AllocatorType &allocator,
                                struct dnet_node *node) {
	auto backends = node->config_data->backends->get_all_backends();
	for (auto &backend_ptr : backends) {
		auto config_backend = backend_ptr.get();
		auto backend_id = config_backend->backend_id;

		std::lock_guard<std::mutex> guard(*config_backend->state_mutex);
		if (config_backend->state != DNET_BACKEND_UNITIALIZED) {
			rapidjson::Value backend_stat(rapidjson::kObjectType);
			stat_value.AddMember(std::to_string(static_cast<unsigned long long>(backend_id)).c_str(),
					     allocator,
					     backend_stats_json(categories, backend_stat, allocator, node, config_backend),
					     allocator);
		}
	}
}