From: Zhiqiang Wang Date: Mon, 25 May 2015 03:14:54 +0000 (+0800) Subject: test/ceph_test_rados: consolidate ReadOps X-Git-Tag: v9.0.3~59^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2a1493cac25b3826bead3534438a46c7417d3e32;p=ceph.git test/ceph_test_rados: consolidate ReadOps Consolidate the completions, retvals, and results into vectors. Signed-off-by: Zhiqiang Wang --- diff --git a/src/test/osd/RadosModel.h b/src/test/osd/RadosModel.h index e4e0739efa03..8c8c069b8e16 100644 --- a/src/test/osd/RadosModel.h +++ b/src/test/osd/RadosModel.h @@ -958,8 +958,7 @@ public: class ReadOp : public TestOp { public: - librados::AioCompletion *completion; - vector pipeline_comps; + vector completions; librados::ObjectReadOperation op; string oid; ObjectDesc old_value; @@ -967,10 +966,8 @@ public: ceph::shared_ptr in_use; - bufferlist result; - int retval; - vector pipeline_results; - vector pipeline_retvals; + vector results; + vector retvals; uint64_t waiting_on; map attrs; @@ -988,13 +985,11 @@ public: const string &oid, TestOpStat *stat = 0) : TestOp(n, context, stat), - completion(NULL), - pipeline_comps(2), + completions(3), oid(oid), snap(0), - retval(0), - pipeline_results(2), - pipeline_retvals(2), + results(3), + retvals(3), waiting_on(0), attrretval(0) {} @@ -1010,7 +1005,9 @@ public: } std::cout << num << ": read oid " << oid << " snap " << snap << std::endl; done = 0; - completion = context->rados.aio_create_completion((void *) this, &read_callback, 0); + for (uint32_t i = 0; i < 3; i++) { + completions[i] = context->rados.aio_create_completion((void *) this, &read_callback, 0); + } context->oid_in_use.insert(oid); context->oid_not_in_use.erase(oid); @@ -1046,8 +1043,8 @@ public: op.read(0, !old_value.has_contents() ? 0 : old_value.most_recent_gen()->get_length(old_value.most_recent()), - &result, - &retval); + &results[0], + &retvals[0]); for (map::iterator i = old_value.attrs.begin(); i != old_value.attrs.end(); @@ -1067,21 +1064,20 @@ public: op.omap_get_header(&header, 0); } op.getxattrs(&xattrs, 0); - assert(!context->io_ctx.aio_operate(context->prefix+oid, completion, &op, 0)); + assert(!context->io_ctx.aio_operate(context->prefix+oid, completions[0], &op, 0)); waiting_on++; // send 2 pipelined reads on the same object/snap. This can help testing // OSD's read behavior in some scenarios - for (uint32_t i = 0; i < 2; ++i) { + for (uint32_t i = 1; i < 3; ++i) { librados::ObjectReadOperation pipeline_op; pipeline_op.read(0, !old_value.has_contents() ? 0 : old_value.most_recent_gen()->get_length(old_value.most_recent()), - &pipeline_results[i], - &pipeline_retvals[i]); - pipeline_comps[i] = context->rados.aio_create_completion((void *) this, &read_callback, 0); - assert(!context->io_ctx.aio_operate(context->prefix+oid, pipeline_comps[i], &pipeline_op, 0)); + &results[i], + &retvals[i]); + assert(!context->io_ctx.aio_operate(context->prefix+oid, completions[i], &pipeline_op, 0)); waiting_on++; } @@ -1100,27 +1096,32 @@ public: return; } - for (vector::iterator i = pipeline_comps.begin(); - i != pipeline_comps.end(); ++i) { - assert((*i)->is_complete()); - if (int err = (*i)->get_return_value()) { - cerr << "Error: oid " << oid << " read returned error code " - << err << std::endl; - } - (*i)->release(); - } - context->oid_in_use.erase(oid); context->oid_not_in_use.insert(oid); - assert(completion->is_complete()); - uint64_t version = completion->get_version64(); - if (int err = completion->get_return_value()) { - if (!(err == -ENOENT && old_value.deleted())) { - cerr << num << ": Error: oid " << oid << " read returned error code " - << err << std::endl; + int retval = completions[0]->get_return_value(); + for (vector::iterator it = completions.begin(); + it != completions.end(); ++it) { + assert((*it)->is_complete()); + uint64_t version = (*it)->get_version64(); + int err = (*it)->get_return_value(); + if (err != retval) { + cerr << num << ": Error: oid " << oid << " read returned different error codes: " + << retval << " and " << err << std::endl; assert(0); } - } else { + if (err) { + if (!(err == -ENOENT && old_value.deleted())) { + cerr << num << ": Error: oid " << oid << " read returned error code " + << err << std::endl; + assert(0); + } + } else if (version != old_value.version) { + cerr << num << ": oid " << oid << " version is " << version + << " and expected " << old_value.version << std::endl; + assert(version == old_value.version); + } + } + if (!retval) { map::iterator iter = xattrs.find("_header"); bufferlist headerbl; if (iter == xattrs.end()) { @@ -1149,9 +1150,12 @@ public: << ", expected " << old_value.most_recent() << std::endl; context->errors++; } - if (!old_value.check(result)) { - cerr << num << ": oid " << oid << " contents " << to_check << " corrupt" << std::endl; - context->errors++; + for (vector::iterator it = results.begin(); + it != results.end(); ++it) { + if (!old_value.check(*it)) { + cerr << num << ": oid " << oid << " contents " << to_check << " corrupt" << std::endl; + context->errors++; + } } if (context->errors) assert(0); } @@ -1180,11 +1184,6 @@ public: << " and old is " << old_value.attrs.size() << std::endl; assert(xattrs.size() == old_value.attrs.size()); } - if (version != old_value.version) { - cerr << num << ": oid " << oid << " version is " << version - << " and expected " << old_value.version << std::endl; - assert(version == old_value.version); - } for (map::iterator iter = old_value.attrs.begin(); iter != old_value.attrs.end(); ++iter) { @@ -1230,7 +1229,10 @@ public: } } } - completion->release(); + for (vector::iterator it = completions.begin(); + it != completions.end(); ++it) { + (*it)->release(); + } context->kick(); done = true; }