@@ -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
345346void 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
0 commit comments