common_init_finish(g_ceph_context);
global_init_chdir(g_ceph_context);
- auto nonce = ceph::util::generate_random_number<uint64_t>();
-
std::string public_msgr_type = g_conf()->ms_public_type.empty() ? g_conf().get_val<std::string>("ms_type") : g_conf()->ms_public_type;
Messenger *msgr = Messenger::create(g_ceph_context, public_msgr_type,
entity_name_t::MDS(-1), "mds",
- nonce, Messenger::HAS_MANY_CONNECTIONS);
+ Messenger::get_random_nonce(),
+ Messenger::HAS_MANY_CONNECTIONS);
if (!msgr)
forker.exit(1);
msgr->set_cluster_protocol(CEPH_MDS_PROTOCOL);
std::string public_msgr_type = g_conf()->ms_public_type.empty() ? g_conf().get_val<std::string>("ms_type") : g_conf()->ms_public_type;
Messenger *msgr = Messenger::create(g_ceph_context, public_msgr_type,
entity_name_t::MON(rank), "mon",
- 0, Messenger::HAS_MANY_CONNECTIONS);
+ 0, // zero nonce
+ Messenger::HAS_MANY_CONNECTIONS);
if (!msgr)
exit(1);
msgr->set_cluster_protocol(CEPH_MON_PROTOCOL);
Messenger *mgr_msgr = Messenger::create(g_ceph_context, public_msgr_type,
entity_name_t::MON(rank), "mon-mgrc",
- getpid(), 0);
+ Messenger::get_pid_nonce(),
+ 0);
if (!mgr_msgr) {
derr << "unable to create mgr_msgr" << dendl;
prefork.exit(1);
public_msg_type = public_msg_type.empty() ? msg_type : public_msg_type;
cluster_msg_type = cluster_msg_type.empty() ? msg_type : cluster_msg_type;
+ uint64_t nonce = Messenger::get_pid_nonce();
Messenger *ms_public = Messenger::create(g_ceph_context, public_msg_type,
entity_name_t::OSD(whoami), "client",
- getpid(),
+ nonce,
Messenger::HAS_HEAVY_TRAFFIC |
Messenger::HAS_MANY_CONNECTIONS);
Messenger *ms_cluster = Messenger::create(g_ceph_context, cluster_msg_type,
entity_name_t::OSD(whoami), "cluster",
- getpid(),
+ nonce,
Messenger::HAS_HEAVY_TRAFFIC |
Messenger::HAS_MANY_CONNECTIONS);
Messenger *ms_hb_back_client = Messenger::create(g_ceph_context, cluster_msg_type,
entity_name_t::OSD(whoami), "hb_back_client",
- getpid(), Messenger::HEARTBEAT);
+ nonce, Messenger::HEARTBEAT);
Messenger *ms_hb_front_client = Messenger::create(g_ceph_context, public_msg_type,
entity_name_t::OSD(whoami), "hb_front_client",
- getpid(), Messenger::HEARTBEAT);
+ nonce, Messenger::HEARTBEAT);
Messenger *ms_hb_back_server = Messenger::create(g_ceph_context, cluster_msg_type,
entity_name_t::OSD(whoami), "hb_back_server",
- getpid(), Messenger::HEARTBEAT);
+ nonce, Messenger::HEARTBEAT);
Messenger *ms_hb_front_server = Messenger::create(g_ceph_context, public_msg_type,
entity_name_t::OSD(whoami), "hb_front_server",
- getpid(), Messenger::HEARTBEAT);
+ nonce, Messenger::HEARTBEAT);
Messenger *ms_objecter = Messenger::create(g_ceph_context, public_msg_type,
entity_name_t::OSD(whoami), "ms_objecter",
- getpid(), 0);
+ nonce, 0);
if (!ms_public || !ms_cluster || !ms_hb_front_client || !ms_hb_back_client || !ms_hb_back_server || !ms_hb_front_server || !ms_objecter)
forker.exit(1);
ms_cluster->set_cluster_protocol(CEPH_OSD_PROTOCOL);
#include <unistd.h>
#include <iostream>
+#include <random>
#include <seastar/core/app-template.hh>
#include <seastar/core/print.hh>
});
}
+uint64_t get_nonce()
+{
+ if (auto pid = getpid(); pid != 1) {
+ return pid;
+ } else {
+ // we're running in a container; use a random number instead!
+ std::random_device rd;
+ std::default_random_engine rng{rd()};
+ return std::uniform_int_distribution<uint64_t>{}(rng);
+ }
+}
+
int main(int argc, char* argv[])
{
seastar::app_template app;
local_conf().parse_argv(ceph_args).get();
pidfile_write(local_conf()->pid_file);
const int whoami = std::stoi(local_conf()->name.get_id());
- const auto nonce = static_cast<uint32_t>(getpid());
+ const auto nonce = get_nonce();
crimson::net::MessengerRef cluster_msgr, client_msgr;
crimson::net::MessengerRef hb_front_msgr, hb_back_msgr;
for (auto [msgr, name] : {make_pair(std::ref(cluster_msgr), "cluster"s),
make_pair(std::ref(client_msgr), "client"s),
make_pair(std::ref(hb_front_msgr), "hb_front"s),
make_pair(std::ref(hb_back_msgr), "hb_back"s)}) {
- msgr = crimson::net::Messenger::create(entity_name_t::OSD(whoami), name, nonce);
+ msgr = crimson::net::Messenger::create(entity_name_t::OSD(whoami), name,
+ nonce);
if (local_conf()->ms_crc_data) {
msgr->set_crc_data();
}
msgr = Messenger::create(g_ceph_context, public_msgr_type,
entity_name_t::MGR(gid),
"mgr",
- getpid(), 0);
+ Messenger::get_pid_nonce(),
+ 0);
msgr->set_default_policy(Messenger::Policy::stateless_server(0));
msgr->set_auth_client(monc);
cct->_conf.get_val<std::string>("ms_type"),
entity_name_t::MGR(),
"mgr",
- getpid(),
+ Messenger::get_pid_nonce(),
0)),
objecter{g_ceph_context, client_messenger.get(), &monc, NULL, 0, 0},
client{client_messenger.get(), &monc, &objecter},
Messenger *Messenger::create_client_messenger(CephContext *cct, string lname)
{
std::string public_msgr_type = cct->_conf->ms_public_type.empty() ? cct->_conf.get_val<std::string>("ms_type") : cct->_conf->ms_public_type;
- auto nonce = ceph::util::generate_random_number<uint64_t>();
+ auto nonce = get_random_nonce();
return Messenger::create(cct, public_msgr_type, entity_name_t::CLIENT(),
std::move(lname), nonce, 0);
}
+uint64_t Messenger::get_pid_nonce()
+{
+ uint64_t nonce = getpid();
+ if (nonce == 1) {
+ // we're running in a container; use a random number instead!
+ nonce = ceph::util::generate_random_number<uint64_t>();
+ }
+ return nonce;
+}
+
+uint64_t Messenger::get_random_nonce()
+{
+ return ceph::util::generate_random_number<uint64_t>();
+}
+
Messenger *Messenger::create(CephContext *cct, const string &type,
entity_name_t name, string lname,
uint64_t nonce, uint64_t cflags)
uint64_t nonce,
uint64_t cflags);
+ static uint64_t get_random_nonce();
+ static uint64_t get_pid_nonce();
+
/**
* create a new messenger
*