class Messenger {
entity_name_t my_name;
- entity_addr_t my_addr;
+ entity_addrvec_t my_addrs;
uint32_t global_seq = 0;
uint32_t crc_flags = 0;
virtual ~Messenger() {}
const entity_name_t& get_myname() const { return my_name; }
- const entity_addr_t& get_myaddr() const { return my_addr; }
- virtual void set_myaddr(const entity_addr_t& addr) {
- my_addr = addr;
+ const entity_addrvec_t& get_myaddrs() const { return my_addrs; }
+ entity_addr_t get_myaddr() const { return my_addrs.front(); }
+ virtual void set_myaddrs(const entity_addrvec_t& addrs) {
+ my_addrs = addrs;
}
/// bind to the given address
- virtual void bind(const entity_addr_t& addr) = 0;
+ virtual void bind(const entity_addrvec_t& addr) = 0;
/// start the messenger
virtual seastar::future<> start(Dispatcher *dispatcher) = 0;
: Messenger{myname}, logic_name{logic_name}, nonce{nonce}
{}
-void SocketMessenger::set_myaddr(const entity_addr_t& addr)
+void SocketMessenger::set_myaddrs(const entity_addrvec_t& addrs)
{
- entity_addr_t my_addr = addr;
- my_addr.nonce = nonce;
+ auto my_addrs = addrs;
+ for (auto& addr : my_addrs.v) {
+ addr.nonce = nonce;
+ }
// TODO: propagate to all the cores of the Messenger
- Messenger::set_myaddr(my_addr);
+ Messenger::set_myaddrs(my_addrs);
}
-void SocketMessenger::bind(const entity_addr_t& addr)
+void SocketMessenger::bind(const entity_addrvec_t& addrs)
{
+ // TODO: v2: listen on multiple addresses
+ auto addr = addrs.legacy_addr();
+
if (addr.get_family() != AF_INET) {
throw std::system_error(EAFNOSUPPORT, std::generic_category());
}
- set_myaddr(addr);
+ set_myaddrs(addrs);
seastar::socket_address address(addr.in4_addr());
seastar::listen_options lo;
addr.u = peer_addr_for_me.u;
addr.set_type(peer_addr_for_me.get_type());
addr.set_port(get_myaddr().get_port());
- set_myaddr(addr);
+ set_myaddrs(entity_addrvec_t{addr});
}
void SocketMessenger::set_default_policy(const SocketPolicy& p)
const std::string& logic_name,
uint32_t nonce);
- void set_myaddr(const entity_addr_t& addr) override;
+ void set_myaddrs(const entity_addrvec_t& addr) override;
- void bind(const entity_addr_t& addr) override;
+ void bind(const entity_addrvec_t& addr) override;
seastar::future<> start(Dispatcher *dispatcher) override;
// bind the server
server.msgr.set_policy_throttler(entity_name_t::TYPE_OSD,
&server.byte_throttler);
- server.msgr.bind(addr);
+ server.msgr.bind(entity_addrvec_t{addr});
return server.msgr.start(&server.dispatcher)
.then([&dispatcher=server.dispatcher, count] {
return dispatcher.on_reply.wait([&dispatcher, count] {
t.addr.set_family(AF_INET);
t.addr.set_port(9010);
t.addr.set_nonce(1);
- t.server.messenger.bind(t.addr);
+ t.server.messenger.bind(entity_addrvec_t{t.addr});
t.client.rounds = rounds;
t.client.keepalive_dist = std::bernoulli_distribution{keepalive_ratio};
t.addr.set_family(AF_INET);
t.addr.set_port(9010);
t.addr.set_nonce(3);
- t.server.messenger.bind(t.addr);
+ t.server.messenger.bind(entity_addrvec_t{t.addr});
return t.server.messenger.start(&t.server.dispatcher)
.then([&] {