Skip to content

Commit

Permalink
Merge branch 'wip-16180' into wip-mgolub-testing
Browse files Browse the repository at this point in the history
[DNM] librados: asynchronous selfmanaged_snap_create/selfmanaged_snap_remove APIs #12050
  • Loading branch information
Mykola Golub committed Nov 28, 2016
2 parents 5233aa0 + 8e5a134 commit 06a0eb5
Show file tree
Hide file tree
Showing 11 changed files with 202 additions and 66 deletions.
24 changes: 16 additions & 8 deletions src/include/rados/librados.h
Expand Up @@ -335,6 +335,14 @@ typedef void *rados_write_op_t;
*/
typedef void *rados_read_op_t;

/**
* @typedef rados_completion_t
* Represents the state of an asynchronous operation - it contains the
* return value once the operation completes, and can be used to block
* until the operation is complete or safe.
*/
typedef void *rados_completion_t;

/**
* Get the version of librados.
*
Expand Down Expand Up @@ -1203,6 +1211,10 @@ CEPH_RADOS_API void rados_ioctx_snap_set_read(rados_ioctx_t io,
*/
CEPH_RADOS_API int rados_ioctx_selfmanaged_snap_create(rados_ioctx_t io,
rados_snap_t *snapid);
CEPH_RADOS_API void
rados_aio_ioctx_selfmanaged_snap_create(rados_ioctx_t io,
rados_snap_t *snapid,
rados_completion_t completion);

/**
* Remove a self-managed snapshot
Expand All @@ -1216,6 +1228,10 @@ CEPH_RADOS_API int rados_ioctx_selfmanaged_snap_create(rados_ioctx_t io,
*/
CEPH_RADOS_API int rados_ioctx_selfmanaged_snap_remove(rados_ioctx_t io,
rados_snap_t snapid);
CEPH_RADOS_API void
rados_aio_ioctx_selfmanaged_snap_remove(rados_ioctx_t io,
rados_snap_t snapid,
rados_completion_t completion);

/**
* Rollback an object to a self-managed snapshot
Expand Down Expand Up @@ -1715,14 +1731,6 @@ CEPH_RADOS_API int rados_exec(rados_ioctx_t io, const char *oid,
* @{
*/

/**
* @typedef rados_completion_t
* Represents the state of an asynchronous operation - it contains the
* return value once the operation completes, and can be used to block
* until the operation is complete or safe.
*/
typedef void *rados_completion_t;

/**
* @typedef rados_callback_t
* Callbacks for asynchrous operations take two parameters:
Expand Down
2 changes: 2 additions & 0 deletions src/include/rados/librados.hpp
Expand Up @@ -796,8 +796,10 @@ namespace librados
__attribute__ ((deprecated));

int selfmanaged_snap_create(uint64_t *snapid);
void aio_selfmanaged_snap_create(uint64_t *snapid, AioCompletion *c);

int selfmanaged_snap_remove(uint64_t snapid);
void aio_selfmanaged_snap_remove(uint64_t snapid, AioCompletion *c);

int selfmanaged_snap_rollback(const std::string& oid, uint64_t snapid);

Expand Down
65 changes: 65 additions & 0 deletions src/librados/IoCtxImpl.cc
Expand Up @@ -184,6 +184,52 @@ struct C_aio_notify_Ack : public Context {
}
};

struct C_aio_selfmanaged_snap_op_Complete : public Context {
librados::RadosClient *client;
librados::AioCompletionImpl *c;

C_aio_selfmanaged_snap_op_Complete(librados::RadosClient *client,
librados::AioCompletionImpl *c)
: client(client), c(c) {
c->get();
}

virtual void finish(int r) {
c->lock.Lock();
c->rval = r;
c->ack = true;
c->safe = true;
c->cond.Signal();

if (c->callback_complete) {
client->finisher.queue(new librados::C_AioComplete(c));
}
if (c->callback_safe) {
client->finisher.queue(new librados::C_AioSafe(c));
}
c->put_unlock();
}
};

struct C_aio_selfmanaged_snap_create_Complete : public C_aio_selfmanaged_snap_op_Complete {
snapid_t snapid;
uint64_t *dest_snapid;

C_aio_selfmanaged_snap_create_Complete(librados::RadosClient *client,
librados::AioCompletionImpl *c,
uint64_t *dest_snapid)
: C_aio_selfmanaged_snap_op_Complete(client, c),
dest_snapid(dest_snapid) {
}

virtual void finish(int r) {
if (r >= 0) {
*dest_snapid = snapid;
}
C_aio_selfmanaged_snap_op_Complete::finish(r);
}
};

} // anonymous namespace
} // namespace librados

Expand Down Expand Up @@ -371,6 +417,18 @@ int librados::IoCtxImpl::selfmanaged_snap_create(uint64_t *psnapid)
return reply;
}

void librados::IoCtxImpl::aio_selfmanaged_snap_create(uint64_t *snapid,
AioCompletionImpl *c)
{
C_aio_selfmanaged_snap_create_Complete *onfinish =
new C_aio_selfmanaged_snap_create_Complete(client, c, snapid);
int r = objecter->allocate_selfmanaged_snap(poolid, &onfinish->snapid,
onfinish);
if (r < 0) {
onfinish->complete(r);
}
}

int librados::IoCtxImpl::snap_remove(const char *snapName)
{
int reply;
Expand Down Expand Up @@ -445,6 +503,13 @@ int librados::IoCtxImpl::selfmanaged_snap_remove(uint64_t snapid)
return (int)reply;
}

void librados::IoCtxImpl::aio_selfmanaged_snap_remove(uint64_t snapid,
AioCompletionImpl *c)
{
Context *onfinish = new C_aio_selfmanaged_snap_op_Complete(client, c);
objecter->delete_selfmanaged_snap(poolid, snapid, onfinish);
}

int librados::IoCtxImpl::pool_change_auid(unsigned long long auid)
{
int reply;
Expand Down
2 changes: 2 additions & 0 deletions src/librados/IoCtxImpl.h
Expand Up @@ -101,9 +101,11 @@ struct librados::IoCtxImpl {
int snap_get_stamp(uint64_t snapid, time_t *t);
int snap_create(const char* snapname);
int selfmanaged_snap_create(uint64_t *snapid);
void aio_selfmanaged_snap_create(uint64_t *snapid, AioCompletionImpl *c);
int snap_remove(const char* snapname);
int rollback(const object_t& oid, const char *snapName);
int selfmanaged_snap_remove(uint64_t snapid);
void aio_selfmanaged_snap_remove(uint64_t snapid, AioCompletionImpl *c);
int selfmanaged_snap_rollback_object(const object_t& oid,
::SnapContext& snapc, uint64_t snapid);

Expand Down
36 changes: 36 additions & 0 deletions src/librados/librados.cc
Expand Up @@ -1585,11 +1585,23 @@ int librados::IoCtx::selfmanaged_snap_create(uint64_t *snapid)
return io_ctx_impl->selfmanaged_snap_create(snapid);
}

void librados::IoCtx::aio_selfmanaged_snap_create(uint64_t *snapid,
AioCompletion *c)
{
io_ctx_impl->aio_selfmanaged_snap_create(snapid, c->pc);
}

int librados::IoCtx::selfmanaged_snap_remove(uint64_t snapid)
{
return io_ctx_impl->selfmanaged_snap_remove(snapid);
}

void librados::IoCtx::aio_selfmanaged_snap_remove(uint64_t snapid,
AioCompletion *c)
{
io_ctx_impl->aio_selfmanaged_snap_remove(snapid, c->pc);
}

int librados::IoCtx::selfmanaged_snap_rollback(const std::string& oid, uint64_t snapid)
{
return io_ctx_impl->selfmanaged_snap_rollback_object(oid,
Expand Down Expand Up @@ -3786,6 +3798,18 @@ extern "C" int rados_ioctx_selfmanaged_snap_create(rados_ioctx_t io,
return retval;
}

extern "C" void
rados_aio_ioctx_selfmanaged_snap_create(rados_ioctx_t io,
rados_snap_t *snapid,
rados_completion_t completion)
{
tracepoint(librados, rados_ioctx_selfmanaged_snap_create_enter, io);
librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
librados::AioCompletionImpl *c = (librados::AioCompletionImpl*)completion;
ctx->aio_selfmanaged_snap_create(snapid, c);
tracepoint(librados, rados_ioctx_selfmanaged_snap_create_exit, 0, 0);
}

extern "C" int rados_ioctx_selfmanaged_snap_remove(rados_ioctx_t io,
uint64_t snapid)
{
Expand All @@ -3796,6 +3820,18 @@ extern "C" int rados_ioctx_selfmanaged_snap_remove(rados_ioctx_t io,
return retval;
}

extern "C" void
rados_aio_ioctx_selfmanaged_snap_remove(rados_ioctx_t io,
rados_snap_t snapid,
rados_completion_t completion)
{
tracepoint(librados, rados_ioctx_selfmanaged_snap_remove_enter, io, snapid);
librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
librados::AioCompletionImpl *c = (librados::AioCompletionImpl*)completion;
ctx->aio_selfmanaged_snap_remove(snapid, c);
tracepoint(librados, rados_ioctx_selfmanaged_snap_remove_exit, 0);
}

extern "C" int rados_ioctx_selfmanaged_snap_rollback(rados_ioctx_t io,
const char *oid,
uint64_t snapid)
Expand Down
56 changes: 10 additions & 46 deletions src/librbd/operation/SnapshotCreateRequest.cc
Expand Up @@ -22,42 +22,6 @@ using util::create_async_context_callback;
using util::create_context_callback;
using util::create_rados_safe_callback;

namespace {

template <typename ImageCtxT>
struct C_CreateSnapId: public Context {
ImageCtxT &image_ctx;
uint64_t *snap_id;
Context *on_finish;

C_CreateSnapId(ImageCtxT &image_ctx, uint64_t *snap_id, Context *on_finish)
: image_ctx(image_ctx), snap_id(snap_id), on_finish(on_finish) {
}

virtual void finish(int r) {
r = image_ctx.md_ctx.selfmanaged_snap_create(snap_id);
on_finish->complete(r);
}
};

template <typename ImageCtxT>
struct C_RemoveSnapId: public Context {
ImageCtxT &image_ctx;
uint64_t snap_id;
Context *on_finish;

C_RemoveSnapId(ImageCtxT &image_ctx, uint64_t snap_id, Context *on_finish)
: image_ctx(image_ctx), snap_id(snap_id), on_finish(on_finish) {
}

virtual void finish(int r) {
r = image_ctx.md_ctx.selfmanaged_snap_remove(snap_id);
on_finish->complete(r);
}
};

} // anonymous namespace

template <typename I>
SnapshotCreateRequest<I>::SnapshotCreateRequest(I &image_ctx,
Context *on_finish,
Expand Down Expand Up @@ -162,11 +126,11 @@ void SnapshotCreateRequest<I>::send_allocate_snap_id() {
CephContext *cct = image_ctx.cct;
ldout(cct, 5) << this << " " << __func__ << dendl;

// TODO create an async version of selfmanaged_snap_create
image_ctx.op_work_queue->queue(new C_CreateSnapId<I>(
image_ctx, &m_snap_id, create_context_callback<
SnapshotCreateRequest<I>,
&SnapshotCreateRequest<I>::handle_allocate_snap_id>(this)), 0);
librados::AioCompletion *rados_completion = create_rados_safe_callback<
SnapshotCreateRequest<I>,
&SnapshotCreateRequest<I>::handle_allocate_snap_id>(this);
image_ctx.md_ctx.aio_selfmanaged_snap_create(&m_snap_id, rados_completion);
rados_completion->release();
}

template <typename I>
Expand Down Expand Up @@ -291,11 +255,11 @@ void SnapshotCreateRequest<I>::send_release_snap_id() {

assert(m_snap_id != CEPH_NOSNAP);

// TODO create an async version of selfmanaged_snap_remove
image_ctx.op_work_queue->queue(new C_RemoveSnapId<I>(
image_ctx, m_snap_id, create_context_callback<
SnapshotCreateRequest<I>,
&SnapshotCreateRequest<I>::handle_release_snap_id>(this)), 0);
librados::AioCompletion *rados_completion = create_rados_safe_callback<
SnapshotCreateRequest<I>,
&SnapshotCreateRequest<I>::handle_release_snap_id>(this);
image_ctx.md_ctx.aio_selfmanaged_snap_remove(m_snap_id, rados_completion);
rados_completion->release();
}

template <typename I>
Expand Down
7 changes: 4 additions & 3 deletions src/librbd/operation/SnapshotRemoveRequest.cc
Expand Up @@ -205,9 +205,10 @@ void SnapshotRemoveRequest<I>::send_release_snap_id() {
<< "snap_id=" << m_snap_id << dendl;
m_state = STATE_RELEASE_SNAP_ID;

// TODO add async version of selfmanaged_snap_remove
int r = image_ctx.md_ctx.selfmanaged_snap_remove(m_snap_id);
this->async_complete(r);
librados::AioCompletion *rados_completion =
this->create_callback_completion();
image_ctx.md_ctx.aio_selfmanaged_snap_remove(m_snap_id, rados_completion);
rados_completion->release();
}

template <typename I>
Expand Down

0 comments on commit 06a0eb5

Please sign in to comment.