From: Yehuda Sadeh Date: Tue, 16 May 2017 23:33:17 +0000 (-0700) Subject: rgw: clean up index completions on shutdown X-Git-Tag: v12.1.0~276^2~46 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=da1f5bc9108b1dc390711d20f741babbf993b929;p=ceph-ci.git rgw: clean up index completions on shutdown Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 5bacb037afc..da88c394070 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -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;