/* * Copyright (C) 2025-present ScyllaDB */ /* * SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0 */ #pragma once #include #include #include #include #include #include #include "utils/log.hh" #include #include #include #include #include namespace vector_search { class dns { public: using address_type = std::vector; using resolver_type = std::function(seastar::sstring const&)>; using host_address_map = std::unordered_map; using listener_type = std::function(host_address_map const&)>; explicit dns(logging::logger& logger, std::vector hosts, listener_type listener, uint64_t& refreshes_counter); void start_background_tasks(); void refresh_interval(std::chrono::milliseconds interval) { _refresh_interval = interval; } void hosts(std::vector hosts) { _addresses.clear(); _hosts = std::move(hosts); trigger_refresh(); } void resolver(resolver_type r) { _resolver = std::move(r); } void trigger_refresh() { refresh_cv.signal(); } seastar::future<> refresh_addr_task(); seastar::future<> stop() { abort_refresh.request_abort(); refresh_cv.signal(); return tasks_gate.close(); } private: seastar::future<> refresh_addr(); seastar::gate tasks_gate; logging::logger& vslogger; seastar::abort_source abort_refresh; seastar::lowres_clock::time_point last_refresh; std::chrono::milliseconds _refresh_interval; seastar::condition_variable refresh_cv; resolver_type _resolver; std::vector _hosts; host_address_map _addresses; listener_type _listener; uint64_t& _refreshes_counter; }; } // namespace vector_search