return ioctx->operate(oid, &op);
}
+ int aio_unlock(IoCtx *ioctx, const string& oid,
+ const string& name, const string& cookie,
+ librados::AioCompletion *completion)
+ {
+ ObjectWriteOperation op;
+ unlock(&op, name, cookie);
+ return ioctx->aio_operate(oid, completion, &op);
+ }
+
void break_lock(ObjectWriteOperation *rados_op,
const string& name, const string& cookie,
const entity_name_t& locker)
extern int unlock(librados::IoCtx *ioctx, const std::string& oid,
const std::string& name, const std::string& cookie);
+ extern int aio_unlock(librados::IoCtx *ioctx, const std::string& oid,
+ const std::string& name, const std::string& cookie,
+ librados::AioCompletion *completion);
+
extern void break_lock(librados::ObjectWriteOperation *op,
const std::string& name, const std::string& cookie,
const entity_name_t& locker);
CEPH_RADOS_API int rados_unlock(rados_ioctx_t io, const char *o,
const char *name, const char *cookie);
+/**
+ * Asynchronous release a shared or exclusive lock on an object.
+ *
+ * @param io the context to operate in
+ * @param o the name of the object
+ * @param name the name of the lock
+ * @param cookie user-defined identifier for the instance of the lock
+ * @param completion what to do when operation has been attempted
+ * @returns 0 on success, negative error code on failure
+ */
+CEPH_RADOS_API int rados_aio_unlock(rados_ioctx_t io, const char *o,
+ const char *name, const char *cookie,
+ rados_completion_t completion);
+
/**
* List clients that have locked the named object lock and information about
* the lock.
int aio_exec(const std::string& oid, AioCompletion *c, const char *cls, const char *method,
bufferlist& inbl, bufferlist *outbl);
+ /*
+ * asynchronous version of unlock
+ */
+ int aio_unlock(const std::string &oid, const std::string &name,
+ const std::string &cookie, AioCompletion *c);
+
// compound object operations
int operate(const std::string& oid, ObjectWriteOperation *op);
int operate(const std::string& oid, ObjectReadOperation *op, bufferlist *pbl);
return rados::cls::lock::unlock(this, oid, name, cookie);
}
+struct AioUnlockCompletion : public librados::ObjectOperationCompletion {
+ librados::AioCompletionImpl *completion;
+ AioUnlockCompletion(librados::AioCompletion *c) : completion(c->pc) {
+ completion->get();
+ };
+ void handle_completion(int r, bufferlist& outbl) {
+ rados_callback_t cb = completion->callback_complete;
+ void *cb_arg = completion->callback_complete_arg;
+ cb(completion, cb_arg);
+ completion->lock.Lock();
+ completion->callback_complete = NULL;
+ completion->cond.Signal();
+ completion->put_unlock();
+ }
+};
+
+int librados::IoCtx::aio_unlock(const std::string &oid, const std::string &name,
+ const std::string &cookie, AioCompletion *c)
+{
+ librados::AioCompletion *completion = librados::Rados::aio_create_completion();
+ int rc = rados::cls::lock::aio_unlock(this, oid, name, cookie, completion);
+ completion->release();
+ return rc;
+}
+
int librados::IoCtx::break_lock(const std::string &oid, const std::string &name,
const std::string &client, const std::string &cookie)
{
return retval;
}
+extern "C" int rados_aio_unlock(rados_ioctx_t io, const char *o, const char *name,
+ const char *cookie, rados_completion_t completion)
+{
+ tracepoint(librados, rados_aio_unlock_enter, io, o, name, cookie, completion);
+ librados::IoCtx ctx;
+ librados::IoCtx::from_rados_ioctx_t(io, ctx);
+ librados::AioCompletionImpl *comp = (librados::AioCompletionImpl*)completion;
+ librados::AioCompletion c(comp);
+ int retval = ctx.aio_unlock(o, name, cookie, &c);
+ tracepoint(librados, rados_aio_unlock_exit, retval);
+ return retval;
+}
+
extern "C" ssize_t rados_list_lockers(rados_ioctx_t io, const char *o,
const char *name, int *exclusive,
char *tag, size_t *tag_len,
)
)
+TRACEPOINT_EVENT(librados, rados_aio_unlock_enter,
+ TP_ARGS(
+ rados_ioctx_t, ioctx,
+ const char*, oid,
+ const char*, name,
+ const char*, cookie,
+ rados_completion_t, completion),
+ TP_FIELDS(
+ ctf_integer_hex(rados_ioctx_t, ioctx, ioctx)
+ ctf_string(oid, oid)
+ ceph_ctf_string(name, name)
+ ceph_ctf_string(cookie, cookie)
+ ctf_integer_hex(rados_completion_t, completion, completion)
+ )
+)
+
+TRACEPOINT_EVENT(librados, rados_aio_unlock_exit,
+ TP_ARGS(
+ int, retval),
+ TP_FIELDS(
+ ctf_integer(int, retval, retval)
+ )
+)
+
TRACEPOINT_EVENT(librados, rados_list_lockers_enter,
TP_ARGS(
rados_ioctx_t, ioctx,