Loading...
Searching...
No Matches
cpp20_resolve_with_sentinel.cpp
1/* Copyright (c) 2018-2022 Marcelo Zimbres Silva (mzimbres@gmail.com)
2 *
3 * Distributed under the Boost Software License, Version 1.0. (See
4 * accompanying file LICENSE.txt)
5 */
6
7#include <boost/redis/connection.hpp>
8
9#include <boost/asio/detached.hpp>
10#include <boost/asio/redirect_error.hpp>
11#include <boost/asio/use_awaitable.hpp>
12
13#include <iostream>
14
15#if defined(BOOST_ASIO_HAS_CO_AWAIT)
16
17namespace asio = boost::asio;
18using endpoints = asio::ip::tcp::resolver::results_type;
25
26auto redir(boost::system::error_code& ec) { return asio::redirect_error(asio::use_awaitable, ec); }
27
28// For more info see
29// - https://redis.io/docs/manual/sentinel.
30// - https://redis.io/docs/reference/sentinel-clients.
31auto resolve_master_address(std::vector<address> const& addresses) -> asio::awaitable<address>
32{
33 request req;
34 req.push("SENTINEL", "get-master-addr-by-name", "mymaster");
35 req.push("QUIT");
36
37 auto conn = std::make_shared<connection>(co_await asio::this_coro::executor);
38
39 response<std::optional<std::array<std::string, 2>>, ignore_t> resp;
40 for (auto addr : addresses) {
41 boost::system::error_code ec;
42 config cfg;
43 cfg.addr = addr;
44 // TODO: async_run and async_exec should be lauched in
45 // parallel here so we can wait for async_run completion
46 // before eventually calling it again.
47 conn->async_run(cfg, asio::consign(asio::detached, conn));
48 co_await conn->async_exec(req, resp, redir(ec));
49 conn->cancel();
50 if (!ec && std::get<0>(resp))
51 co_return address{
52 std::get<0>(resp).value().value().at(0),
53 std::get<0>(resp).value().value().at(1)};
54 }
55
56 co_return address{};
57}
58
59auto co_main(config cfg) -> asio::awaitable<void>
60{
61 // A list of sentinel addresses from which only one is responsive.
62 // This simulates sentinels that are down.
63 std::vector<address> const addresses{
64 address{"foo", "26379"},
65 address{"bar", "26379"},
66 cfg.addr
67 };
68
69 auto const ep = co_await resolve_master_address(addresses);
70
71 std::clog << "Host: " << ep.host << "\n"
72 << "Port: " << ep.port << "\n"
73 << std::flush;
74}
75
76#endif // defined(BOOST_ASIO_HAS_CO_AWAIT)
A basic_connection that type erases the executor.
Creates Redis requests.
Definition request.hpp:46
std::decay_t< decltype(std::ignore)> ignore_t
Type used to ignore responses.
Definition ignore.hpp:30
std::tuple< adapter::result< Ts >... > response
Response with compile-time size.
Definition response.hpp:25
Address of a Redis server.
Definition config.hpp:20
Configure parameters used by the connection classes.
Definition config.hpp:30