when ceph.conf not set public ip & cluster ip, heartbeat will get blank ip address. when osd::_send_boot , classic osd will check if heartbeat front and back addrs are blank ip, if they are blank ip, will use public ip which is learned from mon to set into them. So implement them in crimson osd.
Signed-off-by: chunmei-liu <chunmei.liu@intel.com>
using SocketPolicy = ceph::net::Policy<Throttle>;
class Messenger {
- entity_name_t my_name;
- entity_addrvec_t my_addrs;
uint32_t crc_flags = 0;
crimson::auth::AuthClient* auth_client = nullptr;
crimson::auth::AuthServer* auth_server = nullptr;
bool require_authorizer = true;
+protected:
+ entity_name_t my_name;
+ entity_addrvec_t my_addrs;
+
public:
Messenger(const entity_name_t& name)
: my_name(name)
my_addrs = addrs;
return seastar::now();
}
+ virtual bool set_addr_unknowns(const entity_addrvec_t &addrs) = 0;
using bind_ertr = crimson::errorator<
crimson::ct_error::address_in_use, // The address (range) is already bound
ceph_assert(!listener);
}
+bool SocketMessenger::set_addr_unknowns(const entity_addrvec_t &addrs)
+{
+ bool ret = false;
+
+ entity_addrvec_t newaddrs = my_addrs;
+ for (auto& a : newaddrs.v) {
+ if (a.is_blank_ip()) {
+ int type = a.get_type();
+ int port = a.get_port();
+ uint32_t nonce = a.get_nonce();
+ for (auto& b : addrs.v) {
+ if (a.get_family() == b.get_family()) {
+ logger().debug(" assuming my addr {} matches provided addr {}", a, b);
+ a = b;
+ a.set_nonce(nonce);
+ a.set_type(type);
+ a.set_port(port);
+ ret = true;
+ break;
+ }
+ }
+ }
+ }
+ my_addrs = newaddrs;
+ return ret;
+}
+
seastar::future<> SocketMessenger::set_myaddrs(const entity_addrvec_t& addrs)
{
assert(seastar::this_shard_id() == master_sid);
seastar::future<> set_myaddrs(const entity_addrvec_t& addr) override;
+ bool set_addr_unknowns(const entity_addrvec_t &addr) override;
// Messenger interfaces are assumed to be called from its own shard, but its
// behavior should be symmetric when called from any shard.
bind_ertr::future<> bind(const entity_addrvec_t& addr) override;
return back_msgr->get_myaddrs();
}
+crimson::net::MessengerRef Heartbeat::get_front_msgr() const
+{
+ return front_msgr;
+}
+
+crimson::net::MessengerRef Heartbeat::get_back_msgr() const
+{
+ return back_msgr;
+}
+
void Heartbeat::set_require_authorizer(bool require_authorizer)
{
if (front_msgr->get_require_authorizer() != require_authorizer) {
const entity_addrvec_t& get_front_addrs() const;
const entity_addrvec_t& get_back_addrs() const;
+ crimson::net::MessengerRef get_front_msgr() const;
+ crimson::net::MessengerRef get_back_msgr() const;
void set_require_authorizer(bool);
// Dispatcher methods
{
state.set_booting();
- logger().info("hb_back_msgr: {}", heartbeat->get_back_addrs());
- logger().info("hb_front_msgr: {}", heartbeat->get_front_addrs());
- logger().info("cluster_msgr: {}", cluster_msgr->get_myaddr());
+ entity_addrvec_t public_addrs = public_msgr->get_myaddrs();
+ entity_addrvec_t cluster_addrs = cluster_msgr->get_myaddrs();
+ entity_addrvec_t hb_back_addrs = heartbeat->get_back_addrs();
+ entity_addrvec_t hb_front_addrs = heartbeat->get_front_addrs();
+ if (cluster_msgr->set_addr_unknowns(public_addrs)) {
+ cluster_addrs = cluster_msgr->get_myaddrs();
+ }
+ if (heartbeat->get_back_msgr()->set_addr_unknowns(cluster_addrs)) {
+ hb_back_addrs = heartbeat->get_back_addrs();
+ }
+ if (heartbeat->get_front_msgr()->set_addr_unknowns(public_addrs)) {
+ hb_front_addrs = heartbeat->get_front_addrs();
+ }
+ logger().info("hb_back_msgr: {}", hb_back_addrs);
+ logger().info("hb_front_msgr: {}", hb_front_addrs);
+ logger().info("cluster_msgr: {}", cluster_addrs);
+
auto m = crimson::make_message<MOSDBoot>(superblock,
osdmap->get_epoch(),
boot_epoch,
- heartbeat->get_back_addrs(),
- heartbeat->get_front_addrs(),
- cluster_msgr->get_myaddrs(),
+ hb_back_addrs,
+ hb_front_addrs,
+ cluster_addrs,
CEPH_FEATURES_ALL);
collect_sys_info(&m->metadata, NULL);
return monc->send_message(std::move(m));