This is a serious BUG:
In librados, use two read ops to read one object twice
with the same completion will cause segmentation fault.
reproduce test code as bellow:
rados_read_op_read(read_op, 0, len, buf, &bytes_read, &ret);
rados_read_op_read(read_op2, 0, len, buf2, &bytes_read2, &ret2);
ret = rados_aio_read_op_operate(read_op, ioctx, read_completion, object, 0);
ret = rados_aio_read_op_operate(read_op2, ioctx, read_completion, object, 0);
ret = rados_aio_wait_for_complete(read_completion);
In order to fix it, we just need an assert() to make sure
there is only one IoCtx on a single AioCompletionImpl.
Signed-off-by: Min Chen <minchen@ubuntukylin.com>
librados::IoCtxImpl::C_aio_Ack::C_aio_Ack(AioCompletionImpl *_c) : c(_c)
{
+ assert(!c->io);
c->get();
}
time_t *pm)
: c(_c), pmtime(pm)
{
+ assert(!c->io);
c->get();
}