From: Yehuda Sadeh Date: Wed, 17 May 2017 21:50:53 +0000 (-0700) Subject: rgw: fix deletion of index completion object X-Git-Tag: ses5-milestone6~8^2~7^2~44 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=42b3ee12ea3f9545b218b77fba49c9439d614dad;p=ceph.git rgw: fix deletion of index completion object Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 0b05353bd1fe7..90b3f040afbe4 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -3525,7 +3525,7 @@ public: list& remove_objs, bool log_op, uint16_t bilog_op, complete_op_data **result); - void handle_completion(completion_t cb, complete_op_data *arg); + bool handle_completion(completion_t cb, complete_op_data *arg); int start() { completion_thread = new RGWIndexCompletionThread(store); @@ -3560,9 +3560,13 @@ static void obj_complete_cb(completion_t cb, void *arg) if (completion->stopped) { completion->lock.Unlock(); /* can drop lock, no one else is referencing us */ delete completion; + return; } - ((complete_op_data *)arg)->manager->handle_completion(cb, completion); + bool need_delete = completion->manager->handle_completion(cb, completion); completion->lock.Unlock(); + if (need_delete) { + delete completion; + } } @@ -3599,7 +3603,7 @@ void RGWIndexCompletionManager::create_completion(const rgw_obj& obj, completions[shard_id].insert(entry); } -void RGWIndexCompletionManager::handle_completion(completion_t cb, complete_op_data *arg) +bool RGWIndexCompletionManager::handle_completion(completion_t cb, complete_op_data *arg) { int shard_id = arg->manager_shard_id; { @@ -3609,7 +3613,7 @@ void RGWIndexCompletionManager::handle_completion(completion_t cb, complete_op_d auto iter = comps.find(arg); if (iter == comps.end()) { - return; + return true; } comps.erase(iter); @@ -3617,10 +3621,10 @@ void RGWIndexCompletionManager::handle_completion(completion_t cb, complete_op_d int r = rados_aio_get_return_value(cb); if (r != -ERR_BUSY_RESHARDING) { - delete arg; - return; + return true; } completion_thread->add_completion(arg); + return false; } void RGWRados::finalize()