Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

librados: asynchronous selfmanaged_snap_create/selfmanaged_snap_remove APIs #12050

Merged
merged 2 commits into from Jan 5, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
24 changes: 16 additions & 8 deletions src/include/rados/librados.h
Expand Up @@ -331,6 +331,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 @@ -1199,6 +1207,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 @@ -1212,6 +1224,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 @@ -1711,14 +1727,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 @@ -794,8 +794,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 @@ -1583,11 +1583,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 @@ -3782,6 +3794,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 @@ -3792,6 +3816,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