int aio_write(PoolCtx& pool, object_t oid, off_t off, const bufferlist& bl, size_t len,
AioCompletion *c);
- int create_completion(rados_callback_t cb, void *cba, AioCompletion **pc) {
- *pc = new AioCompletion;
- if (!pc)
- return -ENOMEM;
- (*pc)->set_callback(cb, cba);
- return 0;
+ AioCompletion *aio_create_completion() {
+ return new AioCompletion;
+ }
+ AioCompletion *aio_create_completion(rados_callback_t cb, void *cba) {
+ AioCompletion *c = new AioCompletion;
+ c->set_callback(cb, cba);
+ return c;
}
};
return r;
}
-int Rados::create_completion(callback_t cb, void *cba, AioCompletion **pc)
+Rados::AioCompletion *Rados::aio_create_completion()
{
- RadosClient::AioCompletion *c;
- int r = ((RadosClient *)client)->create_completion(cb, cba, &c);
- if (r < 0)
- return r;
-
- *pc = new AioCompletion(c);
- if (!pc)
- return -ENOMEM;
+ RadosClient::AioCompletion *c = ((RadosClient *)client)->aio_create_completion();
+ return new AioCompletion(c);
+}
- return 0;
+Rados::AioCompletion *Rados::aio_create_completion(callback_t cb, void *cba)
+{
+ RadosClient::AioCompletion *c = ((RadosClient *)client)->aio_create_completion(cb, cba);
+ return new AioCompletion(c);
}
int Rados::AioCompletion::set_callback(rados_callback_t cb, void *cba)
extern "C" int rados_aio_create_completion(rados_callback_t cb, void *cba, rados_completion_t *pc)
{
- return radosp->create_completion(cb, cba, (RadosClient::AioCompletion **)pc);
+ *pc = radosp->aio_create_completion(cb, cba);
+ return 0;
}
extern "C" int rados_aio_wait_for_complete(rados_completion_t c)
dataLock.Unlock();
for (int i = 0; i<concurrentios; ++i) {
start_times[i] = g_clock.now();
+ completions[i] = rados.aio_create_completion();
r = rados.aio_write(pool, name[i], 0, *contents[i], data->object_size, completions[i]);
if (r < 0) { //naughty, doesn't clean up heap
dataLock.Unlock();
--data->in_flight;
dataLock.Unlock();
completions[slot]->release();
+ completions[slot] = 0;
timePassed = g_clock.now() - data->start_time;
//write new stuff to rados, then delete old stuff
//and save locations of new stuff for later deletion
start_times[slot] = g_clock.now();
+ completions[slot] = rados.aio_create_completion();
r = rados.aio_write(pool, newName, 0, *newContents, data->object_size, completions[slot]);
if (r < 0) //naughty; doesn't clean up heap space.
return r;
data->avg_latency = total_latency / data->finished;
--data->in_flight;
dataLock.Unlock();
- completions[slot]-> release();
+ completions[slot]->release();
+ completions[slot] = 0;
delete[] name[slot];
delete contents[slot];
}
//start initial reads
for (int i = 0; i < concurrentios; ++i) {
start_times[i] = g_clock.now();
+ completions[i] = rados.aio_create_completion();
r = rados.aio_read(pool, name[i], 0, contents[i], data->object_size, completions[i]);
if (r < 0) { //naughty, doesn't clean up heap -- oh, or handle the print thread!
cerr << "r = " << r << std::endl;
--data->in_flight;
dataLock.Unlock();
completions[slot]->release();
+ completions[slot] = 0;
cur_contents = contents[slot];
//start new read and check data if requested
start_times[slot] = g_clock.now();
contents[slot] = new bufferlist();
+ completions[slot] = rados.aio_create_completion();
r = rados.aio_read(pool, newName, 0, contents[slot], data->object_size, completions[slot]);
if (r < 0)
return r;
data->avg_latency = total_latency / data->finished;
--data->in_flight;
completions[slot]-> release();
+ completions[slot] = 0;
snprintf(data->object_contents, data->object_size, "I'm the %dth object!", data->finished-1);
dataLock.Unlock();
if (memcmp(data->object_contents, contents[slot]->c_str(), data->object_size) != 0) {