From 2578b4ef4e521578597f6c8eadc1c4d3e5369b07 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Wed, 25 Nov 2020 09:08:48 +0000 Subject: [PATCH] librbd: reserve async request id globally We don't want it to be reset after an image is reopen as it may cause requests being treated as duplicate. Signed-off-by: Mykola Golub --- src/librbd/ImageWatcher.cc | 2 +- src/librbd/Operations.cc | 30 +++++++++++++++--------------- src/librbd/Operations.h | 5 ----- src/librbd/Utils.cc | 6 ++++++ src/librbd/Utils.h | 2 ++ 5 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc index 8fcfbb4d81f..15155b74549 100644 --- a/src/librbd/ImageWatcher.cc +++ b/src/librbd/ImageWatcher.cc @@ -383,7 +383,7 @@ template void ImageWatcher::notify_quiesce(uint64_t *request_id, ProgressContext &prog_ctx, Context *on_finish) { - *request_id = m_image_ctx.operations->reserve_async_request_id(); + *request_id = util::reserve_async_request_id(); ldout(m_image_ctx.cct, 10) << this << " " << __func__ << ": request_id=" << request_id << dendl; diff --git a/src/librbd/Operations.cc b/src/librbd/Operations.cc index 27a54cf2fa3..cd5506cf757 100644 --- a/src/librbd/Operations.cc +++ b/src/librbd/Operations.cc @@ -404,7 +404,7 @@ bool needs_invalidate(I& image_ctx, uint64_t object_no, template Operations::Operations(I &image_ctx) - : m_image_ctx(image_ctx), m_async_request_seq(0), + : m_image_ctx(image_ctx), m_queue_lock(ceph::make_mutex( util::unique_lock_name("librbd::Operations::m_queue_lock", this))) { @@ -492,7 +492,7 @@ int Operations::flatten(ProgressContext &prog_ctx) { } } - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_FLATTEN, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, false, @@ -566,7 +566,7 @@ int Operations::rebuild_object_map(ProgressContext &prog_ctx) { return r; } - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_REBUILD_OBJECT_MAP, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, true, boost::bind(&Operations::execute_rebuild_object_map, @@ -672,7 +672,7 @@ int Operations::rename(const char *dstname) { } if (m_image_ctx.test_features(RBD_FEATURE_JOURNALING)) { - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_RENAME, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, true, @@ -771,7 +771,7 @@ int Operations::resize(uint64_t size, bool allow_shrink, ProgressContext& pro return -EINVAL; } - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_RESIZE, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, false, @@ -866,7 +866,7 @@ void Operations::snap_create(const cls::rbd::SnapshotNamespace &snap_namespac } m_image_ctx.image_lock.unlock_shared(); - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); C_InvokeAsyncRequest *req = new C_InvokeAsyncRequest( m_image_ctx, OPERATION_SNAP_CREATE, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, true, @@ -1065,7 +1065,7 @@ void Operations::snap_remove(const cls::rbd::SnapshotNamespace& snap_namespac m_image_ctx.image_lock.unlock_shared(); if (proxy_op) { - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); auto request_type = exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL; if (cls::rbd::get_snap_namespace_type(snap_namespace) == cls::rbd::SNAPSHOT_NAMESPACE_TYPE_TRASH) { @@ -1165,7 +1165,7 @@ int Operations::snap_rename(const char *srcname, const char *dstname) { } if (m_image_ctx.test_features(RBD_FEATURE_JOURNALING)) { - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_SNAP_RENAME, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, true, @@ -1267,7 +1267,7 @@ int Operations::snap_protect(const cls::rbd::SnapshotNamespace& snap_namespac } if (m_image_ctx.test_features(RBD_FEATURE_JOURNALING)) { - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_SNAP_PROTECT, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, true, @@ -1365,7 +1365,7 @@ int Operations::snap_unprotect(const cls::rbd::SnapshotNamespace& snap_namesp } if (m_image_ctx.test_features(RBD_FEATURE_JOURNALING)) { - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_SNAP_UNPROTECT, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, true, @@ -1566,7 +1566,7 @@ int Operations::update_features(uint64_t features, bool enabled) { r = cond_ctx.wait(); } else { - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_UPDATE_FEATURES, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, false, @@ -1641,7 +1641,7 @@ int Operations::metadata_set(const std::string &key, return -EROFS; } - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_METADATA_UPDATE, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, false, @@ -1701,7 +1701,7 @@ int Operations::metadata_remove(const std::string &key) { if(r < 0) return r; - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_METADATA_UPDATE, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, false, @@ -1766,7 +1766,7 @@ int Operations::migrate(ProgressContext &prog_ctx) { } } - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); r = invoke_async_request(OPERATION_MIGRATE, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, false, @@ -1832,7 +1832,7 @@ int Operations::sparsify(size_t sparse_size, ProgressContext &prog_ctx) { return -EINVAL; } - uint64_t request_id = ++m_async_request_seq; + uint64_t request_id = util::reserve_async_request_id(); int r = invoke_async_request(OPERATION_SPARSIFY, exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, false, diff --git a/src/librbd/Operations.h b/src/librbd/Operations.h index b74f995165d..52d1484e7ed 100644 --- a/src/librbd/Operations.h +++ b/src/librbd/Operations.h @@ -45,10 +45,6 @@ class Operations { public: Operations(ImageCtxT &image_ctx); - uint64_t reserve_async_request_id() { - return ++m_async_request_seq; - } - void start_op(enum Operation op, Context *ctx); void finish_op(enum Operation op, int r); @@ -143,7 +139,6 @@ public: private: ImageCtxT &m_image_ctx; - std::atomic m_async_request_seq; mutable ceph::mutex m_queue_lock; std::set m_in_flight_ops; diff --git a/src/librbd/Utils.cc b/src/librbd/Utils.cc index 36e8fa353a6..af2b1655797 100644 --- a/src/librbd/Utils.cc +++ b/src/librbd/Utils.cc @@ -194,5 +194,11 @@ SnapContext get_snap_context( return snapc; } +uint64_t reserve_async_request_id() { + static std::atomic async_request_seq = 0; + + return ++async_request_seq; +} + } // namespace util } // namespace librbd diff --git a/src/librbd/Utils.h b/src/librbd/Utils.h index 134447f7cd8..736a5063ac8 100644 --- a/src/librbd/Utils.h +++ b/src/librbd/Utils.h @@ -274,6 +274,8 @@ SnapContext get_snap_context( std::pair>>& write_snap_context); +uint64_t reserve_async_request_id(); + } // namespace util } // namespace librbd -- 2.39.5