Skip to content

Commit 36f2ed5

Browse files
committed
msg: messenger dump: Handle name collisions
Handle name collisions during the messenger dump registration by appending the messenger nonce. Always append it to "radosclient". Multiple librados connections are common in applications. This avoids the first registered librados messenger to look special. Signed-off-by: Marcel Lauhoff <[email protected]>
1 parent 453c11f commit 36f2ed5

File tree

2 files changed

+41
-20
lines changed

2 files changed

+41
-20
lines changed

src/msg/async/AsyncMessenger.cc

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -337,9 +337,10 @@ int AsyncMessengerSocketHook::call(
337337
return -ENOSYS;
338338
}
339339

340-
void AsyncMessengerSocketHook::add_messenger(
340+
bool AsyncMessengerSocketHook::add_messenger(
341341
const std::string& name, AsyncMessenger& msgr) {
342-
m_msgrs.try_emplace(name, &msgr);
342+
const auto result = m_msgrs.try_emplace(name, &msgr);
343+
return result.second;
343344
}
344345

345346
void AsyncMessengerSocketHook::remove_messenger(
@@ -392,25 +393,45 @@ AsyncMessenger::AsyncMessenger(CephContext *cct, entity_name_t name,
392393

393394
cct->modify_msgr_hook(
394395
[&]() {
395-
auto hook = new AsyncMessengerSocketHook(*this, mname);
396-
const int asok_ret = cct->get_admin_socket()->register_command(
397-
AsyncMessengerSocketHook::COMMAND, hook,
398-
"dump messenger status");
399-
if (asok_ret != 0) {
400-
ldout(cct, 0) << __func__ << " messenger asok command \""
401-
<< AsyncMessengerSocketHook::COMMAND
402-
<< "\" failed with" << asok_ret << dendl;
403-
}
404-
return hook;
396+
auto hook = new AsyncMessengerSocketHook(*this, mname);
397+
const int asok_ret = cct->get_admin_socket()->register_command(
398+
AsyncMessengerSocketHook::COMMAND, hook, "dump messenger status");
399+
if (asok_ret != 0) {
400+
ldout(cct, 0) << __func__ << " messenger asok command \""
401+
<< AsyncMessengerSocketHook::COMMAND << "\" failed with"
402+
<< asok_ret << dendl;
403+
}
404+
return hook;
405405
},
406406
[&](AdminSocketHook* ptr) {
407-
if (auto hook = dynamic_cast<AsyncMessengerSocketHook*>(ptr)) {
408-
hook->add_messenger(mname, *this);
409-
} else {
410-
ceph_abort(
411-
"BUG: messenger hook obj set, but not of type "
412-
"AsyncMessengerSocketHook");
413-
}
407+
if (auto hook = dynamic_cast<AsyncMessengerSocketHook*>(ptr)) {
408+
// Name collisions may occur. A common case is RGW running
409+
// multiple librados connections - each with a "radosclient"
410+
// messenger.
411+
std::string msgr_key(mname);
412+
if (mname == "radosclient") { // librados
413+
msgr_key.append("-");
414+
msgr_key.append(std::to_string(_nonce));
415+
}
416+
bool added = hook->add_messenger(msgr_key, *this);
417+
if (!added) {
418+
msgr_key.append("-");
419+
msgr_key.append(std::to_string(_nonce));
420+
}
421+
added = hook->add_messenger(msgr_key, *this);
422+
if (!added) {
423+
ldout(cct, 10)
424+
<< __func__ << " registering messenger " << mname
425+
<< " using key " << msgr_key
426+
<< " failed due to a name collision. "
427+
"messenger won't be available to \"messenger dump\""
428+
<< dendl;
429+
}
430+
} else {
431+
ceph_abort(
432+
"BUG: messenger hook obj set, but not of type "
433+
"AsyncMessengerSocketHook");
434+
}
414435
});
415436
}
416437

src/msg/async/AsyncMessenger.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class AsyncMessengerSocketHook : public AdminSocketHook {
8181
int call(
8282
std::string_view command, const cmdmap_t& cmdmap, const bufferlist&,
8383
Formatter* f, std::ostream& errss, ceph::buffer::list& out) override;
84-
void add_messenger(const std::string& name, AsyncMessenger& msgr);
84+
bool add_messenger(const std::string& name, AsyncMessenger& msgr);
8585
void remove_messenger(AsyncMessenger& msgr);
8686
std::list<std::string> messengers() const;
8787
};

0 commit comments

Comments
 (0)