]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: fix valgrind memcheck errors 15415/head
authorJason Dillaman <dillaman@redhat.com>
Thu, 1 Jun 2017 13:29:51 +0000 (09:29 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 2 Jun 2017 13:16:49 +0000 (09:16 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/test_ImageReplayer.cc
src/test/rbd_mirror/test_mock_ImageSyncThrottler.cc
src/tools/rbd_mirror/ImageDeleter.cc
src/tools/rbd_mirror/ImageReplayer.cc
src/tools/rbd_mirror/ImageSyncThrottler.cc

index 9ca82925322adb80be384f4c7c5e1720795c3c57..ec93b956c2c00629d094408e37dfaa94d65043b6 100644 (file)
@@ -484,7 +484,10 @@ TEST_F(TestImageReplayer, StartInterrupted)
 TEST_F(TestImageReplayer, JournalReset)
 {
   bootstrap();
+  delete m_replayer;
+
   ASSERT_EQ(0, librbd::Journal<>::reset(m_remote_ioctx, m_remote_image_id));
+
   // try to recover
   bootstrap();
 }
@@ -758,6 +761,7 @@ TEST_F(TestImageReplayer, Resync_StartInterrupted)
 
   ASSERT_TRUE(m_replayer->is_replaying());
 
+  generate_test_data();
   open_remote_image(&ictx);
   for (int i = 0; i < TEST_IO_COUNT; ++i) {
     write_test_data(ictx, m_test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
@@ -833,6 +837,7 @@ TEST_F(TestImageReplayer, MultipleReplayFailures_SingleEpoch) {
     wait_for_stopped();
     unwatch();
   }
+  close_image(ictx);
 }
 
 TEST_F(TestImageReplayer, MultipleReplayFailures_MultiEpoch) {
@@ -881,6 +886,7 @@ TEST_F(TestImageReplayer, MultipleReplayFailures_MultiEpoch) {
     ASSERT_EQ(0, release_ctx.wait());
   }
 
+  generate_test_data();
   write_test_data(ictx, m_test_data, 0, TEST_IO_SIZE);
 
   for (uint64_t i = 0; i < 5; ++i) {
@@ -1155,6 +1161,7 @@ TEST_F(TestImageReplayer, MirroringDelay)
   for (int i = 0; i < TEST_IO_COUNT; ++i) {
     write_test_data(ictx, m_test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
   }
+  close_image(ictx);
 
   sleep(DELAY / 2);
   stop();
index 2ce53f32bace9fe0048f6de2438646a35d028b35..d3e3d28a6efaf5577a1667351c3d6497705ab0e1 100644 (file)
@@ -78,7 +78,6 @@ public:
 
   void finish(int r) {
     on_finish->complete(r);
-    put();
   }
 
   void get() {
index b2eb615a7e4a240132cca67ad1a65612f9a7dfb4..b3b1c4429d3bfb01bec06acd5bfcb5aaa42307d7 100644 (file)
@@ -479,11 +479,9 @@ int ImageDeleter::image_has_snapshots_and_children(IoCtx *ioctx,
 void ImageDeleter::complete_active_delete(int r) {
   dout(20) << dendl;
 
-  m_delete_lock.Lock();
-  DeleteInfo *del_info = m_active_delete.release();
-  assert(del_info != nullptr);
-  m_delete_lock.Unlock();
-  del_info->notify(r);
+  Mutex::Locker delete_locker(m_delete_lock);
+  m_active_delete->notify(r);
+  m_active_delete.reset();
 }
 
 void ImageDeleter::enqueue_failed_delete(int error_code) {
index 3276dba3b8f63835ff08c99347a37ac8de30d468..d55e9fbfaef0bac1170f7ecef9988007210695a1 100644 (file)
@@ -159,8 +159,10 @@ template <typename I>
 class ImageReplayerAdminSocketHook : public AdminSocketHook {
 public:
   ImageReplayerAdminSocketHook(CephContext *cct, const std::string &name,
-                              ImageReplayer<I> *replayer) :
-    admin_socket(cct->get_admin_socket()) {
+                              ImageReplayer<I> *replayer)
+    : admin_socket(cct->get_admin_socket()),
+      lock("ImageReplayerAdminSocketHook::lock " +
+             replayer->get_global_image_id()) {
     std::string command;
     int r;
 
@@ -201,15 +203,18 @@ public:
   }
 
   ~ImageReplayerAdminSocketHook() override {
+    Mutex::Locker locker(lock);
     for (Commands::const_iterator i = commands.begin(); i != commands.end();
         ++i) {
       (void)admin_socket->unregister_command(i->first);
       delete i->second;
     }
+    commands.clear();
   }
 
   bool call(std::string command, cmdmap_t& cmdmap, std::string format,
            bufferlist& out) override {
+    Mutex::Locker locker(lock);
     Commands::const_iterator i = commands.find(command);
     assert(i != commands.end());
     Formatter *f = Formatter::create(format);
@@ -224,6 +229,7 @@ private:
   typedef std::map<std::string, ImageReplayerAdminSocketCommand*> Commands;
 
   AdminSocket *admin_socket;
+  Mutex lock;
   Commands commands;
 };
 
index 9d3123c15dfb85b6cd55abf8c3137cb1fd7b1e45..a199565f1cdf14d336fd5dc074b14653f19aec36 100644 (file)
@@ -42,7 +42,9 @@ struct ImageSyncThrottler<ImageCtxT>::C_SyncHolder : public Context {
   }
 
   void finish(int r) override {
+    m_sync->put();
     m_sync_throttler->handle_sync_finished(this);
+
     m_on_finish->complete(r);
   }
 };