From 8581bd27e28dc58697dea883748d78ca961d495d Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 9 Jul 2020 17:03:53 -0400 Subject: [PATCH] cls/rbd: add support for neorados-style IO requests Signed-off-by: Jason Dillaman --- src/cls/rbd/cls_rbd_client.cc | 59 +++++++++++++++++++++++++-------- src/cls/rbd/cls_rbd_client.h | 14 ++++++-- src/test/cls_rbd/CMakeLists.txt | 1 + src/tools/rbd/CMakeLists.txt | 7 ++-- 4 files changed, 63 insertions(+), 18 deletions(-) diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index f9ba2419a68..28f1600a855 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -7,6 +7,7 @@ #include "include/encoding.h" #include "include/rbd_types.h" #include "include/rados/librados.hpp" +#include "include/neorados/RADOS.hpp" #include "common/bit_vector.hpp" #include @@ -841,10 +842,19 @@ int get_all_features(librados::IoCtx *ioctx, const std::string &oid, return get_all_features_finish(&it, all_features); } -void copyup(librados::ObjectWriteOperation *op, bufferlist data) { +template +void copyup(O* op, ceph::buffer::list data) { op->exec("rbd", "copyup", data); } +void copyup(neorados::WriteOp* op, ceph::buffer::list data) { + copyup(op, data); +} + +void copyup(librados::ObjectWriteOperation *op, bufferlist data) { + copyup(op, data); +} + int copyup(librados::IoCtx *ioctx, const std::string &oid, bufferlist data) { librados::ObjectWriteOperation op; @@ -853,15 +863,26 @@ int copyup(librados::IoCtx *ioctx, const std::string &oid, return ioctx->operate(oid, &op); } -void sparse_copyup(librados::ObjectWriteOperation *op, - const std::map &extent_map, - bufferlist data) { +template +void sparse_copyup(O* op, const E& extent_map, ceph::buffer::list data) { bufferlist bl; encode(extent_map, bl); encode(data, bl); op->exec("rbd", "sparse_copyup", bl); } +void sparse_copyup(neorados::WriteOp* op, + const std::map &extent_map, + ceph::buffer::list data) { + sparse_copyup(op, extent_map, data); +} + +void sparse_copyup(librados::ObjectWriteOperation *op, + const std::map &extent_map, + bufferlist data) { + sparse_copyup(op, extent_map, data); +} + int sparse_copyup(librados::IoCtx *ioctx, const std::string &oid, const std::map &extent_map, bufferlist data) { @@ -1732,6 +1753,27 @@ void migration_remove(librados::ObjectWriteOperation *op) { op->exec("rbd", "migration_remove", bl); } +template +void assert_snapc_seq(O* op, uint64_t snapc_seq, + cls::rbd::AssertSnapcSeqState state) { + bufferlist bl; + encode(snapc_seq, bl); + encode(state, bl); + op->exec("rbd", "assert_snapc_seq", bl); +} + +void assert_snapc_seq(neorados::WriteOp* op, + uint64_t snapc_seq, + cls::rbd::AssertSnapcSeqState state) { + assert_snapc_seq(op, snapc_seq, state); +} + +void assert_snapc_seq(librados::ObjectWriteOperation *op, + uint64_t snapc_seq, + cls::rbd::AssertSnapcSeqState state) { + assert_snapc_seq(op, snapc_seq, state); +} + int assert_snapc_seq(librados::IoCtx *ioctx, const std::string &oid, uint64_t snapc_seq, cls::rbd::AssertSnapcSeqState state) { @@ -1740,15 +1782,6 @@ int assert_snapc_seq(librados::IoCtx *ioctx, const std::string &oid, return ioctx->operate(oid, &op); } -void assert_snapc_seq(librados::ObjectWriteOperation *op, - uint64_t snapc_seq, - cls::rbd::AssertSnapcSeqState state) { - bufferlist bl; - encode(snapc_seq, bl); - encode(state, bl); - op->exec("rbd", "assert_snapc_seq", bl); -} - void mirror_uuid_get_start(librados::ObjectReadOperation *op) { bufferlist bl; op->exec("rbd", "mirror_uuid_get", bl); diff --git a/src/cls/rbd/cls_rbd_client.h b/src/cls/rbd/cls_rbd_client.h index aa9bb2b09e0..5bc43fca883 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -12,6 +12,7 @@ class Context; namespace ceph { template class BitVector; } +namespace neorados { struct WriteOp; } namespace librbd { namespace cls_client { @@ -626,17 +627,24 @@ int namespace_list(librados::IoCtx *ioctx, std::list *entries); // operations on data objects -int assert_snapc_seq(librados::IoCtx *ioctx, const std::string &oid, - uint64_t snapc_seq, - cls::rbd::AssertSnapcSeqState state); +void assert_snapc_seq(neorados::WriteOp* op, + uint64_t snapc_seq, + cls::rbd::AssertSnapcSeqState state); void assert_snapc_seq(librados::ObjectWriteOperation *op, uint64_t snapc_seq, cls::rbd::AssertSnapcSeqState state); +int assert_snapc_seq(librados::IoCtx *ioctx, const std::string &oid, + uint64_t snapc_seq, + cls::rbd::AssertSnapcSeqState state); +void copyup(neorados::WriteOp* op, ceph::buffer::list data); void copyup(librados::ObjectWriteOperation *op, ceph::buffer::list data); int copyup(librados::IoCtx *ioctx, const std::string &oid, ceph::buffer::list data); +void sparse_copyup(neorados::WriteOp* op, + const std::map &extent_map, + ceph::buffer::list data); void sparse_copyup(librados::ObjectWriteOperation *op, const std::map &extent_map, ceph::buffer::list data); diff --git a/src/test/cls_rbd/CMakeLists.txt b/src/test/cls_rbd/CMakeLists.txt index 59a75b030f4..74c5804e736 100644 --- a/src/test/cls_rbd/CMakeLists.txt +++ b/src/test/cls_rbd/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable(ceph_test_cls_rbd target_link_libraries(ceph_test_cls_rbd cls_rbd_client cls_lock_client + libneorados librados global ${UNITTEST_LIBS} diff --git a/src/tools/rbd/CMakeLists.txt b/src/tools/rbd/CMakeLists.txt index 2a185f05204..cf069e8f58b 100644 --- a/src/tools/rbd/CMakeLists.txt +++ b/src/tools/rbd/CMakeLists.txt @@ -54,10 +54,13 @@ set(rbd_srcs add_executable(rbd ${rbd_srcs} $) set_target_properties(rbd PROPERTIES OUTPUT_NAME rbd) -target_link_libraries(rbd librbd librados - cls_journal_client cls_rbd_client +target_link_libraries(rbd librbd + cls_journal_client + cls_rbd_client rbd_types journal + libneorados + librados ceph-common global ${CURSES_LIBRARIES} ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS}) if(WITH_KRBD) -- 2.39.5