list<cls_rgw_obj_key>& 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);
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;
+ }
}
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;
{
auto iter = comps.find(arg);
if (iter == comps.end()) {
- return;
+ return true;
}
comps.erase(iter);
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()