]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: reserve async request id globally 38008/head
authorMykola Golub <mgolub@suse.com>
Wed, 25 Nov 2020 09:08:48 +0000 (09:08 +0000)
committerMykola Golub <mgolub@suse.com>
Wed, 25 Nov 2020 14:35:23 +0000 (14:35 +0000)
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 <mgolub@suse.com>
src/librbd/ImageWatcher.cc
src/librbd/Operations.cc
src/librbd/Operations.h
src/librbd/Utils.cc
src/librbd/Utils.h

index 8fcfbb4d81f671171e74ac96d9f96686322668a9..15155b7454916b62a15db2608c9f5ff6d08adb23 100644 (file)
@@ -383,7 +383,7 @@ template <typename I>
 void ImageWatcher<I>::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;
index 27a54cf2fa31904b234c2a69838b4d27daf101cb..cd5506cf7570d908058675021108fd281a06bf7e 100644 (file)
@@ -404,7 +404,7 @@ bool needs_invalidate(I& image_ctx, uint64_t object_no,
 
 template <typename I>
 Operations<I>::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<I>::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<I>::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<I>::execute_rebuild_object_map,
@@ -672,7 +672,7 @@ int Operations<I>::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<I>::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<I>::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<I> *req = new C_InvokeAsyncRequest<I>(
     m_image_ctx, OPERATION_SNAP_CREATE,
     exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, true,
@@ -1065,7 +1065,7 @@ void Operations<I>::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<I>::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<I>::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<I>::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<I>::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<I>::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<I>::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<I>::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<I>::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,
index b74f995165d849769753e965963d5cd7ea1e5bf6..52d1484e7ed693360da833617d0b784a910d1a0e 100644 (file)
@@ -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<uint64_t> m_async_request_seq;
 
   mutable ceph::mutex m_queue_lock;
   std::set<Operation> m_in_flight_ops;
index 36e8fa353a60585d91c32c03e6e6318a23b0dcee..af2b16557970070c4446dbc37aa7eda3a2a26fff 100644 (file)
@@ -194,5 +194,11 @@ SnapContext get_snap_context(
   return snapc;
 }
 
+uint64_t reserve_async_request_id() {
+  static std::atomic<uint64_t> async_request_seq = 0;
+
+  return ++async_request_seq;
+}
+
 } // namespace util
 } // namespace librbd
index 134447f7cd8249eaf0735c6b890067d6e1713051..736a5063ac857612804dd78bc60c0cd26041e575 100644 (file)
@@ -274,6 +274,8 @@ SnapContext get_snap_context(
       std::pair<std::uint64_t,
                 std::vector<std::uint64_t>>>& write_snap_context);
 
+uint64_t reserve_async_request_id();
+
 } // namespace util
 } // namespace librbd