]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
blkin: rbd object map update traces 15053/head
authorJason Dillaman <dillaman@redhat.com>
Sat, 13 May 2017 02:34:33 +0000 (22:34 -0400)
committerJason Dillaman <dillaman@redhat.com>
Thu, 18 May 2017 22:13:28 +0000 (18:13 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
12 files changed:
src/librbd/ObjectMap.cc
src/librbd/ObjectMap.h
src/librbd/io/CopyupRequest.cc
src/librbd/io/ObjectRequest.cc
src/librbd/object_map/UpdateRequest.cc
src/librbd/object_map/UpdateRequest.h
src/librbd/operation/TrimRequest.cc
src/test/librbd/mock/MockObjectMap.h
src/test/librbd/object_map/test_mock_UpdateRequest.cc
src/test/librbd/test_mock_ObjectMap.cc
src/test/rbd_mirror/image_sync/test_mock_ObjectCopyRequest.cc
src/tools/rbd_mirror/image_sync/ObjectCopyRequest.cc

index 49c8280dae8c6847d1e78a1740f8ffe889177169..9a0683fc68dc40115843acb03a5eb3c9c95143fc 100644 (file)
@@ -242,7 +242,7 @@ void ObjectMap<I>::detained_aio_update(UpdateOperation &&op) {
       handle_detained_aio_update(cell, r, on_finish);
     });
   aio_update(CEPH_NOSNAP, op.start_object_no, op.end_object_no, op.new_state,
-             op.current_state, ctx);
+             op.current_state, op.parent_trace, ctx);
 }
 
 template <typename I>
@@ -269,6 +269,7 @@ template <typename I>
 void ObjectMap<I>::aio_update(uint64_t snap_id, uint64_t start_object_no,
                               uint64_t end_object_no, uint8_t new_state,
                               const boost::optional<uint8_t> &current_state,
+                              const ZTracer::Trace &parent_trace,
                               Context *on_finish) {
   assert(m_image_ctx.snap_lock.is_locked());
   assert((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) != 0);
@@ -306,7 +307,7 @@ void ObjectMap<I>::aio_update(uint64_t snap_id, uint64_t start_object_no,
 
   auto req = object_map::UpdateRequest<I>::create(
     m_image_ctx, &m_object_map, snap_id, start_object_no, end_object_no,
-    new_state, current_state, on_finish);
+    new_state, current_state, parent_trace, on_finish);
   req->send();
 }
 
index fd43ae97d23b0797998acaae9259ae3eb814d566..427ecdf165a378ea7f4c58144c8815bf360d1971 100644 (file)
@@ -13,9 +13,8 @@
 
 class Context;
 class RWLock;
-namespace librados {
-  class IoCtx;
-}
+namespace librados { class IoCtx; }
+namespace ZTracer { struct Trace; }
 
 namespace librbd {
 
@@ -57,16 +56,17 @@ public:
   template <typename T, void(T::*MF)(int) = &T::complete>
   bool aio_update(uint64_t snap_id, uint64_t start_object_no, uint8_t new_state,
                   const boost::optional<uint8_t> &current_state,
-                  T *callback_object) {
+                  const ZTracer::Trace &parent_trace, T *callback_object) {
     return aio_update<T, MF>(snap_id, start_object_no, start_object_no + 1,
-                             new_state, current_state, callback_object);
+                             new_state, current_state, parent_trace,
+                             callback_object);
   }
 
   template <typename T, void(T::*MF)(int) = &T::complete>
   bool aio_update(uint64_t snap_id, uint64_t start_object_no,
                   uint64_t end_object_no, uint8_t new_state,
                   const boost::optional<uint8_t> &current_state,
-                  T *callback_object) {
+                  const ZTracer::Trace &parent_trace, T *callback_object) {
     assert(start_object_no < end_object_no);
     if (snap_id == CEPH_NOSNAP) {
       uint64_t object_no;
@@ -82,13 +82,13 @@ public:
       }
 
       UpdateOperation update_operation(start_object_no, end_object_no,
-                                       new_state, current_state,
+                                       new_state, current_state, parent_trace,
                                        util::create_context_callback<T, MF>(
                                          callback_object));
       detained_aio_update(std::move(update_operation));
     } else {
       aio_update(snap_id, start_object_no, end_object_no, new_state,
-                 current_state,
+                 current_state, parent_trace,
                  util::create_context_callback<T, MF>(callback_object));
     }
     return true;
@@ -104,15 +104,16 @@ private:
     uint64_t end_object_no;
     uint8_t new_state;
     boost::optional<uint8_t> current_state;
+    ZTracer::Trace parent_trace;
     Context *on_finish;
 
     UpdateOperation(uint64_t start_object_no, uint64_t end_object_no,
                     uint8_t new_state,
                     const boost::optional<uint8_t> &current_state,
-                    Context *on_finish)
+                    const ZTracer::Trace &parent_trace, Context *on_finish)
       : start_object_no(start_object_no), end_object_no(end_object_no),
         new_state(new_state), current_state(current_state),
-        on_finish(on_finish) {
+        parent_trace(parent_trace), on_finish(on_finish) {
     }
   };
 
@@ -131,7 +132,7 @@ private:
   void aio_update(uint64_t snap_id, uint64_t start_object_no,
                   uint64_t end_object_no, uint8_t new_state,
                   const boost::optional<uint8_t> &current_state,
-                  Context *on_finish);
+                  const ZTracer::Trace &parent_trace, Context *on_finish);
   bool update_required(uint64_t object_no, uint8_t new_state);
 
 };
index 395ee7762071fe57a741dd01842a48918b373605..aee2f14d7b065ffac28fff1a7df608ce8d1db724 100644 (file)
@@ -35,9 +35,9 @@ class UpdateObjectMap : public C_AsyncObjectThrottle<> {
 public:
   UpdateObjectMap(AsyncObjectThrottle<> &throttle, ImageCtx *image_ctx,
                   uint64_t object_no, const std::vector<uint64_t> *snap_ids,
-                  size_t snap_id_idx)
-    : C_AsyncObjectThrottle(throttle, *image_ctx),
-      m_object_no(object_no), m_snap_ids(*snap_ids), m_snap_id_idx(snap_id_idx)
+                  const ZTracer::Trace &trace, size_t snap_id_idx)
+    : C_AsyncObjectThrottle(throttle, *image_ctx), m_object_no(object_no),
+      m_snap_ids(*snap_ids), m_trace(trace), m_snap_id_idx(snap_id_idx)
   {
   }
 
@@ -49,7 +49,7 @@ public:
       assert(m_image_ctx.exclusive_lock->is_lock_owner());
       assert(m_image_ctx.object_map != nullptr);
       bool sent = m_image_ctx.object_map->aio_update<Context>(
-        CEPH_NOSNAP, m_object_no, OBJECT_EXISTS, {}, this);
+        CEPH_NOSNAP, m_object_no, OBJECT_EXISTS, {}, m_trace, this);
       return (sent ? 0 : 1);
     }
 
@@ -66,7 +66,7 @@ public:
     }
 
     bool sent = m_image_ctx.object_map->aio_update<Context>(
-      snap_id, m_object_no, state, {}, this);
+      snap_id, m_object_no, state, {}, m_trace, this);
     assert(sent);
     return 0;
   }
@@ -74,6 +74,7 @@ public:
 private:
   uint64_t m_object_no;
   const std::vector<uint64_t> &m_snap_ids;
+  const ZTracer::Trace &m_trace;
   size_t m_snap_id_idx;
 };
 
@@ -335,7 +336,8 @@ bool CopyupRequest::send_object_map_head() {
 
       if (may_update && (new_state != current_state) &&
           m_ictx->object_map->aio_update<CopyupRequest>(
-            CEPH_NOSNAP, m_object_no, new_state, current_state, this)) {
+            CEPH_NOSNAP, m_object_no, new_state, current_state, m_trace,
+            this)) {
         return false;
       }
     }
@@ -357,7 +359,7 @@ bool CopyupRequest::send_object_map() {
     RWLock::RLocker owner_locker(m_ictx->owner_lock);
     AsyncObjectThrottle<>::ContextFactory context_factory(
       boost::lambda::bind(boost::lambda::new_ptr<UpdateObjectMap>(),
-      boost::lambda::_1, m_ictx, m_object_no, &m_snap_ids,
+      boost::lambda::_1, m_ictx, m_object_no, &m_snap_ids, m_trace,
       boost::lambda::_2));
     AsyncObjectThrottle<> *throttle = new AsyncObjectThrottle<>(
       NULL, *m_ictx, context_factory, util::create_context_callback(this),
index 59e984a4ae400c4e964ae2074124b1619274d8ef..1cdb696b7171b070ac504a001fc29c66b83aeb15 100644 (file)
@@ -489,7 +489,7 @@ void AbstractObjectWriteRequest::send_pre_object_map_update() {
       m_state = LIBRBD_AIO_WRITE_PRE;
 
       if (m_ictx->object_map->aio_update<ObjectRequest>(
-            CEPH_NOSNAP, m_object_no, new_state, {}, this)) {
+            CEPH_NOSNAP, m_object_no, new_state, {}, this->m_trace, this)) {
         return;
       }
     }
@@ -515,7 +515,8 @@ bool AbstractObjectWriteRequest::send_post_object_map_update() {
   m_state = LIBRBD_AIO_WRITE_POST;
 
   if (m_ictx->object_map->aio_update<ObjectRequest>(
-        CEPH_NOSNAP, m_object_no, OBJECT_NONEXISTENT, OBJECT_PENDING, this)) {
+        CEPH_NOSNAP, m_object_no, OBJECT_NONEXISTENT, OBJECT_PENDING,
+        this->m_trace, this)) {
     return false;
   }
 
index e88085add41159e672871840ceeac3bd837cb2ba..8c0ec69de8d15d42bd8b3172489d79436ef24d1b 100644 (file)
@@ -42,7 +42,10 @@ void UpdateRequest<I>::send() {
                                m_new_state, m_current_state);
 
   librados::AioCompletion *rados_completion = create_callback_completion();
-  int r = m_image_ctx.md_ctx.aio_operate(oid, rados_completion, &op);
+  std::vector<librados::snap_t> snaps;
+  int r = m_image_ctx.md_ctx.aio_operate(
+    oid, rados_completion, &op, 0, snaps,
+    (m_trace.valid() ? m_trace.get_info() : nullptr));
   assert(r == 0);
   rados_completion->release();
 }
index 0bb9cd756e293f2f26b6c44fe46c609a826ac449..175160752dac7d0cc844cc0f498abd5aab8037e5 100644 (file)
@@ -7,6 +7,8 @@
 #include "include/int_types.h"
 #include "librbd/object_map/Request.h"
 #include "common/bit_vector.hpp"
+#include "common/zipkin_trace.h"
+#include "librbd/Utils.h"
 #include <boost/optional.hpp>
 
 class Context;
@@ -25,21 +27,27 @@ public:
                                uint64_t snap_id, uint64_t start_object_no,
                                uint64_t end_object_no, uint8_t new_state,
                                const boost::optional<uint8_t> &current_state,
+                               const ZTracer::Trace &parent_trace,
                                Context *on_finish) {
     return new UpdateRequest(image_ctx, object_map, snap_id, start_object_no,
                              end_object_no, new_state, current_state,
-                             on_finish);
+                             parent_trace, on_finish);
   }
 
   UpdateRequest(ImageCtx &image_ctx, ceph::BitVector<2> *object_map,
                 uint64_t snap_id, uint64_t start_object_no,
                 uint64_t end_object_no, uint8_t new_state,
                 const boost::optional<uint8_t> &current_state,
-               Context *on_finish)
+               const ZTracer::Trace &parent_trace, Context *on_finish)
     : Request(image_ctx, snap_id, on_finish), m_object_map(*object_map),
       m_start_object_no(start_object_no), m_end_object_no(end_object_no),
-      m_new_state(new_state), m_current_state(current_state)
+      m_new_state(new_state), m_current_state(current_state),
+      m_trace(util::create_trace(image_ctx, "update object map", parent_trace))
   {
+    m_trace.event("start");
+  }
+  virtual ~UpdateRequest() {
+    m_trace.event("finish");
   }
 
   void send() override;
@@ -53,6 +61,7 @@ private:
   uint64_t m_end_object_no;
   uint8_t m_new_state;
   boost::optional<uint8_t> m_current_state;
+  ZTracer::Trace m_trace;
 };
 
 } // namespace object_map
index 60b0c79f65d2c7ad7df3abd4d9892cd3b5ff35f6..46ec967b5eddcb3bf8d6aa0db32ce42e82516a3c 100644 (file)
@@ -277,7 +277,7 @@ void TrimRequest<I>::send_pre_copyup() {
       RWLock::WLocker object_map_locker(image_ctx.object_map_lock);
       if (image_ctx.object_map->template aio_update<AsyncRequest<I> >(
             CEPH_NOSNAP, m_copyup_start, m_copyup_end, OBJECT_PENDING,
-            OBJECT_EXISTS, this)) {
+            OBJECT_EXISTS, {}, this)) {
         return;
       }
     }
@@ -309,7 +309,7 @@ void TrimRequest<I>::send_pre_remove() {
       RWLock::WLocker object_map_locker(image_ctx.object_map_lock);
       if (image_ctx.object_map->template aio_update<AsyncRequest<I> >(
             CEPH_NOSNAP, m_delete_start, m_num_objects, OBJECT_PENDING,
-            OBJECT_EXISTS, this)) {
+            OBJECT_EXISTS, {}, this)) {
         return;
       }
     }
@@ -337,7 +337,7 @@ void TrimRequest<I>::send_post_copyup() {
       RWLock::WLocker object_map_locker(image_ctx.object_map_lock);
       if (image_ctx.object_map->template aio_update<AsyncRequest<I> >(
             CEPH_NOSNAP, m_copyup_start, m_copyup_end, OBJECT_NONEXISTENT,
-            OBJECT_PENDING, this)) {
+            OBJECT_PENDING, {}, this)) {
         return;
       }
     }
@@ -365,7 +365,7 @@ void TrimRequest<I>::send_post_remove() {
       RWLock::WLocker object_map_locker(image_ctx.object_map_lock);
       if (image_ctx.object_map->template aio_update<AsyncRequest<I> >(
             CEPH_NOSNAP, m_delete_start, m_num_objects, OBJECT_NONEXISTENT,
-            OBJECT_PENDING, this)) {
+            OBJECT_PENDING, {}, this)) {
         return;
       }
     }
index 057364d53e73022bd3d54143b13daa688186d466..9ace5e374800e83c3d1a2f63f26e566f7b607f20 100644 (file)
@@ -22,23 +22,25 @@ struct MockObjectMap {
   template <typename T, void(T::*MF)(int)>
   bool aio_update(uint64_t snap_id, uint64_t start_object_no, uint8_t new_state,
                   const boost::optional<uint8_t> &current_state,
-                  T *callback_object) {
+                  const ZTracer::Trace &parent_trace, T *callback_object) {
     return aio_update<T, MF>(snap_id, start_object_no, start_object_no + 1,
-                             new_state, current_state, callback_object);
+                             new_state, current_state, parent_trace,
+                             callback_object);
   }
 
   template <typename T, void(T::*MF)(int)>
   bool aio_update(uint64_t snap_id, uint64_t start_object_no,
                   uint64_t end_object_no, uint8_t new_state,
                   const boost::optional<uint8_t> &current_state,
-                  T *callback_object) {
+                  const ZTracer::Trace &parent_trace, T *callback_object) {
     return aio_update(snap_id, start_object_no, end_object_no, new_state,
-                      current_state,
+                      current_state, parent_trace,
                       util::create_context_callback<T, MF>(callback_object));
   }
-  MOCK_METHOD6(aio_update, bool(uint64_t snap_id, uint64_t start_object_no,
+  MOCK_METHOD7(aio_update, bool(uint64_t snap_id, uint64_t start_object_no,
                                 uint64_t end_object_no, uint8_t new_state,
                                 const boost::optional<uint8_t> &current_state,
+                                const ZTracer::Trace &parent_trace,
                                 Context *on_finish));
   MOCK_METHOD2(snapshot_add, void(uint64_t snap_id, Context *on_finish));
   MOCK_METHOD2(snapshot_remove, void(uint64_t snap_id, Context *on_finish));
index ea40404d39b1d2bc5e4e4ec1e6b70c37482fdaf2..7f47be28176ef5a401b11ed39059453f63e86351 100644 (file)
@@ -68,7 +68,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateInMemory) {
   C_SaferCond cond_ctx;
   AsyncRequest<> *req = new UpdateRequest<>(
     *ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT,
-    OBJECT_EXISTS, &cond_ctx);
+    OBJECT_EXISTS, {}, &cond_ctx);
   {
     RWLock::RLocker snap_locker(ictx->snap_lock);
     RWLock::WLocker object_map_locker(ictx->object_map_lock);
@@ -100,7 +100,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateHeadOnDisk) {
   C_SaferCond cond_ctx;
   AsyncRequest<> *req = new UpdateRequest<>(
     *ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT,
-    OBJECT_EXISTS, &cond_ctx);
+    OBJECT_EXISTS, {}, &cond_ctx);
   {
     RWLock::RLocker snap_locker(ictx->snap_lock);
     RWLock::WLocker object_map_locker(ictx->object_map_lock);
@@ -130,7 +130,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateSnapOnDisk) {
   C_SaferCond cond_ctx;
   AsyncRequest<> *req = new UpdateRequest<>(
     *ictx, &object_map, snap_id, 0, object_map.size(), OBJECT_NONEXISTENT,
-    OBJECT_EXISTS, &cond_ctx);
+    OBJECT_EXISTS, {}, &cond_ctx);
   {
     RWLock::RLocker snap_locker(ictx->snap_lock);
     RWLock::WLocker object_map_locker(ictx->object_map_lock);
@@ -157,7 +157,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateOnDiskError) {
   C_SaferCond cond_ctx;
   AsyncRequest<> *req = new UpdateRequest<>(
     *ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT,
-    OBJECT_EXISTS, &cond_ctx);
+    OBJECT_EXISTS, {}, &cond_ctx);
   {
     RWLock::RLocker snap_locker(ictx->snap_lock);
     RWLock::WLocker object_map_locker(ictx->object_map_lock);
@@ -187,7 +187,7 @@ TEST_F(TestMockObjectMapUpdateRequest, RebuildSnapOnDisk) {
   C_SaferCond cond_ctx;
   AsyncRequest<> *req = new UpdateRequest<>(
     *ictx, &object_map, snap_id, 0, object_map.size(), OBJECT_EXISTS_CLEAN,
-    boost::optional<uint8_t>(), &cond_ctx);
+    boost::optional<uint8_t>(), {}, &cond_ctx);
   {
     RWLock::RLocker snap_locker(ictx->snap_lock);
     RWLock::WLocker object_map_locker(ictx->object_map_lock);
index f14c6b9a5b274197994f6e622bbac9663265b2e5..7deaef03bb8ea6cf587ccd6851394ada9d9d22a1 100644 (file)
@@ -70,6 +70,7 @@ struct UpdateRequest<MockTestImageCtx> {
                                uint64_t start_object_no, uint64_t end_object_no,
                                uint8_t new_state,
                                const boost::optional<uint8_t> &current_state,
+                               const ZTracer::Trace &parent_trace,
                                Context *on_finish) {
     assert(s_instance != nullptr);
     s_instance->on_finish = on_finish;
@@ -180,8 +181,8 @@ TEST_F(TestMockObjectMap, NonDetainedUpdate) {
   {
     RWLock::RLocker snap_locker(mock_image_ctx.snap_lock);
     RWLock::WLocker object_map_locker(mock_image_ctx.object_map_lock);
-    mock_object_map.aio_update(CEPH_NOSNAP, 0, 1, {}, &update_ctx1);
-    mock_object_map.aio_update(CEPH_NOSNAP, 1, 1, {}, &update_ctx2);
+    mock_object_map.aio_update(CEPH_NOSNAP, 0, 1, {}, {}, &update_ctx1);
+    mock_object_map.aio_update(CEPH_NOSNAP, 1, 1, {}, {}, &update_ctx2);
   }
 
   finish_update_2->complete(0);
@@ -238,10 +239,10 @@ TEST_F(TestMockObjectMap, DetainedUpdate) {
   {
     RWLock::RLocker snap_locker(mock_image_ctx.snap_lock);
     RWLock::WLocker object_map_locker(mock_image_ctx.object_map_lock);
-    mock_object_map.aio_update(CEPH_NOSNAP, 1, 4, 1, {}, &update_ctx1);
-    mock_object_map.aio_update(CEPH_NOSNAP, 1, 3, 1, {}, &update_ctx2);
-    mock_object_map.aio_update(CEPH_NOSNAP, 2, 3, 1, {}, &update_ctx3);
-    mock_object_map.aio_update(CEPH_NOSNAP, 0, 2, 1, {}, &update_ctx4);
+    mock_object_map.aio_update(CEPH_NOSNAP, 1, 4, 1, {}, {}, &update_ctx1);
+    mock_object_map.aio_update(CEPH_NOSNAP, 1, 3, 1, {}, {}, &update_ctx2);
+    mock_object_map.aio_update(CEPH_NOSNAP, 2, 3, 1, {}, {}, &update_ctx3);
+    mock_object_map.aio_update(CEPH_NOSNAP, 0, 2, 1, {}, {}, &update_ctx4);
   }
 
   // updates 2, 3, and 4 are blocked on update 1
index bfebabdc97ad1f4c07a89f3bf764ab2554847a40..370c25fb5555cb4745463105651a6ac684891089 100644 (file)
@@ -200,18 +200,18 @@ public:
                                 librados::snap_t snap_id, uint8_t state,
                                 int r) {
     if (mock_image_ctx.image_ctx->object_map != nullptr) {
-      auto &expect = EXPECT_CALL(mock_object_map, aio_update(snap_id, 0, 1, state, _, _));
+      auto &expect = EXPECT_CALL(mock_object_map, aio_update(snap_id, 0, 1, state, _, _, _));
       if (r < 0) {
-        expect.WillOnce(DoAll(WithArg<5>(Invoke([this, r](Context *ctx) {
+        expect.WillOnce(DoAll(WithArg<6>(Invoke([this, r](Context *ctx) {
                                   m_threads->work_queue->queue(ctx, r);
                                 })),
                               Return(true)));
       } else {
-        expect.WillOnce(DoAll(WithArg<5>(Invoke([&mock_image_ctx, snap_id, state, r](Context *ctx) {
+        expect.WillOnce(DoAll(WithArg<6>(Invoke([&mock_image_ctx, snap_id, state, r](Context *ctx) {
                                   assert(mock_image_ctx.image_ctx->snap_lock.is_locked());
                                   assert(mock_image_ctx.image_ctx->object_map_lock.is_wlocked());
                                   mock_image_ctx.image_ctx->object_map->aio_update<Context>(
-                                    snap_id, 0, 1, state, boost::none, ctx);
+                                    snap_id, 0, 1, state, boost::none, {}, ctx);
                                 })),
                               Return(true)));
       }
index 2d5f1470e8a2a4e74cf621d4b891b40b51313e13..92817b7a78850d57a98b308c6b487d1294cc74c6 100644 (file)
@@ -334,7 +334,7 @@ void ObjectCopyRequest<I>::send_update_object_map() {
   bool sent = m_local_image_ctx->object_map->template aio_update<
     ObjectCopyRequest<I>, &ObjectCopyRequest<I>::handle_update_object_map>(
       snap_object_state.first, m_object_number, snap_object_state.second, {},
-      this);
+      {}, this);
   assert(sent);
   m_local_image_ctx->snap_lock.put_read();
 }