]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: clean up index completions on shutdown
authorYehuda Sadeh <yehuda@redhat.com>
Tue, 16 May 2017 23:33:17 +0000 (16:33 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Mon, 5 Jun 2017 20:17:47 +0000 (13:17 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/rgw/rgw_rados.cc

index 5bacb037afcbe960cb5fcd1b160648515f7c086d..da88c39407053a2826df845332655588c7bc876c 100644 (file)
@@ -3383,6 +3383,7 @@ int RGWRados::get_max_chunk_size(const string& placement_rule, const rgw_obj& ob
 class RGWIndexCompletionManager;
 
 struct complete_op_data {
+  AioCompletion *rados_completion{nullptr};
   RGWIndexCompletionManager *manager{nullptr};
   rgw_obj obj;
   RGWModifyOp op;
@@ -3480,10 +3481,11 @@ class RGWIndexCompletionManager {
 public:
   RGWIndexCompletionManager(RGWRados *_store) : store(_store) {}
   ~RGWIndexCompletionManager() {
-    delete completion_thread;
+    stop();
   }
 
-  void create_completion(const rgw_obj& obj,
+  void create_completion(AioCompletion *rados_completion,
+                         const rgw_obj& obj,
                          RGWModifyOp op, string& tag,
                          rgw_bucket_entry_ver& ver,
                          const cls_rgw_obj_key& key,
@@ -3505,11 +3507,20 @@ public:
   void stop() {
     if (completion_thread) {
       completion_thread->stop();
+      delete completion_thread;
     }
+
+    Mutex::Locker l(lock);
+    for (auto c : completions) {
+      c->rados_completion->release();
+      delete c;
+    }
+    completions.clear();
   }
 };
 
-void RGWIndexCompletionManager::create_completion(const rgw_obj& obj,
+void RGWIndexCompletionManager::create_completion(AioCompletion *rados_completion,
+                                                  const rgw_obj& obj,
                                                   RGWModifyOp op, string& tag,
                                                   rgw_bucket_entry_ver& ver,
                                                   const cls_rgw_obj_key& key,
@@ -3520,6 +3531,7 @@ void RGWIndexCompletionManager::create_completion(const rgw_obj& obj,
 {
   complete_op_data *entry = new complete_op_data;
 
+  entry->rados_completion = rados_completion;
   entry->manager = this;
   entry->obj = obj;
   entry->op = op;
@@ -12450,9 +12462,9 @@ int RGWRados::cls_obj_complete_op(BucketShard& bs, const rgw_obj& obj, RGWModify
                              get_zone().log_data, bilog_flags, zones_trace);
 
   complete_op_data *arg;
-  index_completion_manager->create_completion(obj, op, tag, ver, key, dir_meta, ro,
-                                              get_zone().log_data, bilog_flags, &arg);
   AioCompletion *c = librados::Rados::aio_create_completion(arg, NULL, obj_complete_cb);
+  index_completion_manager->create_completion(c, obj, op, tag, ver, key, dir_meta, ro,
+                                              get_zone().log_data, bilog_flags, &arg);
   int ret = bs.index_ctx.aio_operate(bs.bucket_obj, c, &o);
   c->release();
   return ret;