map<int, librados::AioCompletion*>::iterator iter = pendings.find(id);
assert(iter != pendings.end());
- completions.push_back(iter->second);
+ completions[id] = iter->second;
pendings.erase(iter);
// If the caller needs a list of finished objects, store them
cond.Wait(lock);
// Clear the completed AIOs
- list<librados::AioCompletion*>::iterator iter = completions.begin();
- map<int, string>::iterator liter = completion_objs.begin();
- for (; iter != completions.end() && liter != completion_objs.end(); ++iter, ++liter) {
- int r = (*iter)->get_return_value();
- if (objs && r == 0) {
- (*objs)[liter->first] = liter->second;
+ map<int, librados::AioCompletion*>::iterator iter = completions.begin();
+ for (; iter != completions.end(); ++iter) {
+ int r = iter->second->get_return_value();
+ if (objs && r == 0) { /* update list of successfully completed objs */
+ map<int, string>::iterator liter = completion_objs.find(iter->first);
+ if (liter != completion_objs.end()) {
+ (*objs)[liter->first] = liter->second;
+ }
}
if (ret_code && (r < 0 && r != valid_ret_code))
(*ret_code) = r;
- (*iter)->release();
+ iter->second->release();
}
if (num_completions)
(*num_completions) = completions.size();
class BucketIndexAioManager {
private:
map<int, librados::AioCompletion*> pendings;
- list<librados::AioCompletion*> completions;
+ map<int, librados::AioCompletion*> completions;
map<int, string> pending_objs;
map<int, string> completion_objs;
int next;
* @param oid - the object id associated with the object, if it is NULL, we don't
* track the object id per callback.
*/
- void add_pending(int id, librados::AioCompletion* completion, string *oid = NULL) {
+ void add_pending(int id, librados::AioCompletion* completion, const string& oid) {
pendings[id] = completion;
- if (oid) {
- pending_objs[id] = *oid;
- }
+ pending_objs[id] = oid;
}
public:
/*
librados::AioCompletion *c = librados::Rados::aio_create_completion((void*)arg, NULL, bucket_index_op_completion_cb);
int r = io_ctx.aio_operate(oid, c, (librados::ObjectReadOperation*)op, NULL);
if (r >= 0) {
- add_pending(arg->id, c);
+ add_pending(arg->id, c, oid);
}
return r;
}
librados::AioCompletion *c = librados::Rados::aio_create_completion((void*)arg, NULL, bucket_index_op_completion_cb);
int r = io_ctx.aio_operate(oid, c, (librados::ObjectWriteOperation*)op);
if (r >= 0) {
- add_pending(arg->id, c);
+ add_pending(arg->id, c, oid);
}
return r;
}
int num_completions, r = 0;
map<int, string> objs;
- while (manager.wait_for_completions(valid_ret_code(), &num_completions, &r, &objs)) {
+ map<int, string> *pobjs = (need_multiple_rounds() ? &objs : NULL);
+ while (manager.wait_for_completions(valid_ret_code(), &num_completions, &r, pobjs)) {
if (r >= 0 && ret >= 0) {
for(int i = 0; i < num_completions && iter != objs_container.end(); ++i, ++iter) {
int issue_ret = issue_op(iter->first, iter->second);