]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix race condition with AIO completion callbacks
authorJason Dillaman <dillaman@redhat.com>
Mon, 13 Jul 2020 17:45:44 +0000 (13:45 -0400)
committerJason Dillaman <dillaman@redhat.com>
Tue, 28 Jul 2020 17:14:27 +0000 (13:14 -0400)
Now that librbd utilizes multiple threads for the IO path, it's
possible for a race condition to occur if a client app is waiting
on a completion to fire and the actual invokation of the
completion.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 50694f790245ca90a3b8a644da7b128a7a148cc6)

Conflicts:
src/librbd/io/AioCompletion.cc: trivial resolution

src/librbd/io/AioCompletion.cc
src/librbd/io/AioCompletion.h

index afd4a30d76883180e1269d231b70ee0dbdbd60ce..2ddefdaccb96959789ec1f0a1f159582f076003c 100644 (file)
@@ -105,15 +105,11 @@ void AioCompletion::complete() {
     } else {
       complete_cb(rbd_comp, complete_arg);
       complete_event_socket();
+      notify_callbacks_complete();
     }
   } else {
     complete_event_socket();
-  }
-  state = AIO_STATE_COMPLETE;
-
-  {
-    std::unique_lock<std::mutex> locker(lock);
-    cond.notify_all();
+    notify_callbacks_complete();
   }
 
   // note: possible for image to be closed after op marked finished
@@ -260,6 +256,7 @@ void AioCompletion::complete_external_callback() {
     while (ictx->external_callback_completions.pop(aio_comp)) {
       aio_comp->complete_cb(aio_comp->rbd_comp, aio_comp->complete_arg);
       aio_comp->complete_event_socket();
+      aio_comp->notify_callbacks_complete();
     }
 
     ictx->external_callback_in_progress.store(false);
@@ -278,5 +275,12 @@ void AioCompletion::complete_event_socket() {
   }
 }
 
+void AioCompletion::notify_callbacks_complete() {
+  state = AIO_STATE_COMPLETE;
+
+  std::unique_lock<std::mutex> locker(lock);
+  cond.notify_all();
+}
+
 } // namespace io
 } // namespace librbd
index 9df547cd2413c8ef5fe9e71c40ecdcf17ee79fd1..ecb3bc66d2cb2418528046878ad4bd7516dd485f 100644 (file)
@@ -179,7 +179,7 @@ private:
   void queue_complete();
   void complete_external_callback();
   void complete_event_socket();
-
+  void notify_callbacks_complete();
 };
 
 class C_AioRequest : public Context {