if (!op) {
return NULL;
}
- op->get();
rgw_spawned_stacks *s = (source_op ? &source_op->spawned : &spawned);
}
context_stacks.erase(stack);
stack->put();
+ stack = NULL;
} else {
op_not_blocked = true;
stack->run_count++;
stack->schedule();
}
- if (!op_not_blocked) {
+ if (!op_not_blocked && stack) {
stack->run_count = 0;
}
lock.get_write();
for (auto stack : context_stacks) {
+ ldout(cct, 20) << "clearing stack on run() exit: stack=" << (void *)stack << " nref=" << stack->get_nref() << dendl;
stack->put();
}
run_contexts.erase(run_context);
}
RGWCoroutinesStack *RGWCoroutinesManager::allocate_stack() {
- RGWCoroutinesStack *stack = new RGWCoroutinesStack(cct, this);
- stack->get();
- return stack;
+ return new RGWCoroutinesStack(cct, this);
}
string RGWCoroutinesManager::get_id()
rgw_data_sync_status *sync_status;
- list<RGWSimpleRadosReadCR<rgw_data_sync_marker> *> crs;
-
public:
RGWReadDataSyncStatusCoroutine(RGWAsyncRadosProcessor *_async_rados, RGWRados *_store,
RGWObjectCtx& _obj_ctx, const string& _source_zone,
obj_ctx(_obj_ctx), source_zone(_source_zone),
sync_status(_status) {}
- ~RGWReadDataSyncStatusCoroutine() {
- for (auto cr : crs) {
- cr->put();
- }
- }
int handle_data(rgw_data_sync_info& data);
};
map<uint32_t, rgw_data_sync_marker>& markers = sync_status->sync_markers;
for (int i = 0; i < (int)data.num_shards; i++) {
- RGWSimpleRadosReadCR<rgw_data_sync_marker> *cr = new RGWSimpleRadosReadCR<rgw_data_sync_marker>(async_rados, store, obj_ctx, store->get_zone_params().log_pool,
- RGWDataSyncStatusManager::shard_obj_name(source_zone, i), &markers[i]);
- spawn(cr, true);
- crs.push_back(cr);
+ spawn(new RGWSimpleRadosReadCR<rgw_data_sync_marker>(async_rados, store, obj_ctx, store->get_zone_params().log_pool,
+ RGWDataSyncStatusManager::shard_obj_name(source_zone, i), &markers[i]), true);
}
return 0;
}
lock.get_write();
data_sync_cr = new RGWDataSyncControlCR(store, &http_manager, async_rados, conn, source_zone, num_shards);
- data_sync_cr->get();
lock.unlock();
r = run(data_sync_cr);
if (r < 0) {