From: Jason Dillaman Date: Mon, 24 Aug 2020 15:24:31 +0000 (-0400) Subject: librbd: support reverting to legacy blacklist op via neorados API X-Git-Tag: v16.1.0~1334^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d7dfb8e37cbcdce1e6d21ec9232d009354348824;p=ceph.git librbd: support reverting to legacy blacklist op via neorados API Signed-off-by: Jason Dillaman --- diff --git a/src/include/neorados/RADOS.hpp b/src/include/neorados/RADOS.hpp index 45932e163546..f2d62eae9453 100644 --- a/src/include/neorados/RADOS.hpp +++ b/src/include/neorados/RADOS.hpp @@ -942,6 +942,17 @@ public: return init.result.get(); } + template + auto blocklist_add(std::string_view client_address, + std::optional expire, + CompletionToken&& token) { + boost::asio::async_completion init(token); + blocklist_add(client_address, expire, + SimpleOpComp::create(get_executor(), + std::move(init.completion_handler))); + return init.result.get(); + } + template auto wait_for_latest_osd_map(CompletionToken&& token) { boost::asio::async_completion init(token); @@ -1082,6 +1093,10 @@ private: void enable_application(std::string_view pool, std::string_view app_name, bool force, std::unique_ptr c); + void blocklist_add(std::string_view client_address, + std::optional expire, + std::unique_ptr c); + void wait_for_latest_osd_map(std::unique_ptr c); // Proxy object to provide access to low-level RADOS messaging clients diff --git a/src/librbd/managed_lock/BreakRequest.cc b/src/librbd/managed_lock/BreakRequest.cc index c3f9dfefd18e..e482d221e6fc 100644 --- a/src/librbd/managed_lock/BreakRequest.cc +++ b/src/librbd/managed_lock/BreakRequest.cc @@ -159,19 +159,12 @@ void BreakRequest::send_blocklist() { return; } - std::stringstream cmd; - cmd << "{" - << "\"prefix\": \"osd blocklist\", " - << "\"blocklistop\": \"add\", " - << "\"addr\": \"" << locker_addr << "\""; + std::optional expire; if (m_blocklist_expire_seconds != 0) { - cmd << ", \"expire\": " << m_blocklist_expire_seconds << ".0"; + expire = std::chrono::seconds(m_blocklist_expire_seconds); } - cmd << "}"; - - bufferlist in_bl; - m_asio_engine.get_rados_api().mon_command( - {cmd.str()}, in_bl, nullptr, nullptr, + m_asio_engine.get_rados_api().blocklist_add( + m_locker.address, expire, librbd::asio::util::get_callback_adapter( [this](int r) { handle_blocklist(r); })); } diff --git a/src/neorados/RADOS.cc b/src/neorados/RADOS.cc index 54e2a23e1a85..4c85d44d8341 100644 --- a/src/neorados/RADOS.cc +++ b/src/neorados/RADOS.cc @@ -1558,6 +1558,39 @@ void RADOS::enable_application(std::string_view pool, std::string_view app_name, } } +void RADOS::blocklist_add(std::string_view client_address, + std::optional expire, + std::unique_ptr c) { + auto expire_arg = (expire ? + fmt::format(", \"expire\": \"{}.0\"", expire->count()) : std::string{}); + impl->monclient.start_mon_command( + { fmt::format("{{" + "\"prefix\": \"osd blocklist\", " + "\"blocklistop\": \"add\", " + "\"addr\": \"{}\"{}}}", + client_address, expire_arg) }, + {}, + [this, client_address = std::string(client_address), expire_arg, + c = std::move(c)](bs::error_code ec, std::string, cb::list) mutable { + if (ec != bs::errc::invalid_argument) { + ca::post(std::move(c), ec); + return; + } + + // retry using the legacy command + impl->monclient.start_mon_command( + { fmt::format("{{" + "\"prefix\": \"osd blacklist\", " + "\"blacklistop\": \"add\", " + "\"addr\": \"{}\"{}}}", + client_address, expire_arg) }, + {}, + [c = std::move(c)](bs::error_code ec, std::string, cb::list) mutable { + ca::post(std::move(c), ec); + }); + }); +} + void RADOS::wait_for_latest_osd_map(std::unique_ptr c) { impl->objecter->wait_for_latest_osdmap(std::move(c)); } diff --git a/src/test/librados_test_stub/NeoradosTestStub.cc b/src/test/librados_test_stub/NeoradosTestStub.cc index 6a6a7ead8d69..17c5cab9cb26 100644 --- a/src/test/librados_test_stub/NeoradosTestStub.cc +++ b/src/test/librados_test_stub/NeoradosTestStub.cc @@ -6,6 +6,7 @@ #include "common/ceph_mutex.h" #include "common/hobject.h" #include "librados/AioCompletionImpl.h" +#include "mon/error_code.h" #include "osd/error_code.h" #include "osd/osd_types.h" #include "osdc/error_code.h" @@ -511,6 +512,15 @@ void RADOS::mon_command(std::vector command, (r < 0 ? bs::error_code(-r, osd_category()) : bs::error_code())); } +void RADOS::blocklist_add(std::string_view client_address, + std::optional expire, + std::unique_ptr c) { + auto r = impl->test_rados_client->blocklist_add( + std::string(client_address), expire.value_or(0s).count()); + c->post(std::move(c), + (r < 0 ? bs::error_code(-r, mon_category()) : bs::error_code())); +} + void RADOS::wait_for_latest_osd_map(std::unique_ptr c) { auto r = impl->test_rados_client->wait_for_latest_osd_map(); c->dispatch(std::move(c), diff --git a/src/test/librbd/managed_lock/test_mock_BreakRequest.cc b/src/test/librbd/managed_lock/test_mock_BreakRequest.cc index 96dc1ef516ab..d6239344b1ee 100644 --- a/src/test/librbd/managed_lock/test_mock_BreakRequest.cc +++ b/src/test/librbd/managed_lock/test_mock_BreakRequest.cc @@ -56,11 +56,6 @@ GetLockerRequest *GetLockerRequest