Implement aio stat and also export this functionality to the C API.
---
src/include/rados/librados.h | 16 ++++++++++++++-
src/include/rados/librados.hpp | 4 +++-
src/librados/IoCtxImpl.cc | 42 ++++++++++++++++++++++++++++++++++++++++
src/librados/IoCtxImpl.h | 9 +++++++++
src/librados/librados.cc | 18 +++++++++++++++++
5 files changed, 87 insertions(+), 2 deletions(-)
diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h
index 44d6f71..b2df767 100644
--- a/src/include/rados/librados.h
+++ b/src/include/rados/librados.h
@@ -23,7 +23,7 @@ extern "C" {
#endif
#define LIBRADOS_VER_MAJOR 0
-#define LIBRADOS_VER_MINOR 48
+#define LIBRADOS_VER_MINOR 49
#define LIBRADOS_VER_EXTRA 0
#define LIBRADOS_VERSION(maj, min, extra) ((maj << 16) + (min << 8) + extra)
@@ -1444,6 +1444,20 @@ int rados_aio_read(rados_ioctx_t io, const char *oid,
*/
int rados_aio_flush(rados_ioctx_t io);
+
+/**
+ * Asynchronously get object stats (size/mtime)
+ *
+ * @param io ioctx
+ * @param o object name
+ * @param psize where to store object size
+ * @param pmtime where to store modification time
+ * @returns 0 on success, negative error code on failure
+ */
+int rados_aio_stat(rados_ioctx_t io, const char *o,
+ rados_completion_t completion,
+ uint64_t *psize, time_t *pmtime);
+
/** @} Asynchronous I/O */
/**
diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp
index 3df4c86..b30b18f 100644
--- a/src/include/rados/librados.hpp
+++ b/src/include/rados/librados.hpp
@@ -478,9 +478,11 @@ namespace librados
* other than CEPH_NOSNAP
*/
int aio_remove(const std::string& oid, AioCompletion *c);
-
+
int aio_flush();
+ int aio_stat(const std::string& oid, AioCompletion *c, uint64_t *psize,
time_t *pmtime);
+
int aio_exec(const std::string& oid, AioCompletion *c, const char *cls,
const char *method,
bufferlist& inbl, bufferlist *outbl);
diff --git a/src/librados/IoCtxImpl.cc b/src/librados/IoCtxImpl.cc
index 934a101..808a30e 100644
--- a/src/librados/IoCtxImpl.cc
+++ b/src/librados/IoCtxImpl.cc
@@ -851,6 +851,21 @@ int librados::IoCtxImpl::aio_remove(const object_t &oid,
AioCompletionImpl *c)
return 0;
}
+
+int librados::IoCtxImpl::aio_stat(const object_t& oid, AioCompletionImpl *c,
+ uint64_t *psize, time_t *pmtime)
+{
+ c->io = this;
+ C_aio_stat_Ack *onack = new C_aio_stat_Ack(c, pmtime);
+
+ Mutex::Locker l(*lock);
+ objecter->stat(oid, oloc,
+ snap_seq, psize, &onack->mtime, 0,
+ onack, &c->objver);
+
+ return 0;
+}
+
int librados::IoCtxImpl::remove(const object_t& oid)
{
utime_t ut = ceph_clock_now(client->cct);
@@ -1564,6 +1579,33 @@ void librados::IoCtxImpl::C_aio_Ack::finish(int r)
c->put_unlock();
}
+///////////////////////////// C_aio_stat_Ack ////////////////////////////
+
+librados::IoCtxImpl::C_aio_stat_Ack::C_aio_stat_Ack(AioCompletionImpl *_c,
+ time_t *pm)
+ : c(_c), pmtime(pm)
+{
+ c->get();
+}
+
+void librados::IoCtxImpl::C_aio_stat_Ack::finish(int r)
+{
+ c->lock.Lock();
+ c->rval = r;
+ c->ack = true;
+ c->cond.Signal();
+
+ if (r >= 0 && pmtime) {
+ *pmtime = mtime.sec();
+ }
+
+ if (c->callback_complete) {
+ c->io->client->finisher.queue(new C_AioComplete(c));
+ }
+
+ c->put_unlock();
+}
+
/////////////////////// C_aio_sparse_read_Ack //////////////////////////
librados::IoCtxImpl::C_aio_sparse_read_Ack::C_aio_sparse_read_Ack(AioCompletionImpl
*_c,
diff --git a/src/librados/IoCtxImpl.h b/src/librados/IoCtxImpl.h
index feea0e8..55b07ee 100644
--- a/src/librados/IoCtxImpl.h
+++ b/src/librados/IoCtxImpl.h
@@ -144,6 +144,14 @@ struct librados::IoCtxImpl {
C_aio_Ack(AioCompletionImpl *_c);
void finish(int r);
};
+
+ struct C_aio_stat_Ack : public Context {
+ librados::AioCompletionImpl *c;
+ time_t *pmtime;
+ utime_t mtime;
+ C_aio_stat_Ack(AioCompletionImpl *_c, time_t *pm);
+ void finish(int r);
+ };
struct C_aio_sparse_read_Ack : public Context {
AioCompletionImpl *c;
@@ -177,6 +185,7 @@ struct librados::IoCtxImpl {
int aio_remove(const object_t &oid, AioCompletionImpl *c);
int aio_exec(const object_t& oid, AioCompletionImpl *c, const char *cls,
const char *method, bufferlist& inbl, bufferlist *outbl);
+ int aio_stat(const object_t& oid, AioCompletionImpl *c, uint64_t *psize,
time_t *pmtime);
int pool_change_auid(unsigned long long auid);
int pool_change_auid_async(unsigned long long auid, PoolAsyncCompletionImpl
*c);
diff --git a/src/librados/librados.cc b/src/librados/librados.cc
index c31b82a..c3756cd 100644
--- a/src/librados/librados.cc
+++ b/src/librados/librados.cc
@@ -978,6 +978,14 @@ int librados::IoCtx::aio_flush()
return 0;
}
+int librados::IoCtx::aio_stat(const std::string& oid, librados::AioCompletion
*c,
+ uint64_t *psize, time_t *pmtime)
+{
+ object_t obj(oid);
+ return io_ctx_impl->aio_stat(oid, c->pc, psize, pmtime);
+}
+
+
int librados::IoCtx::watch(const string& oid, uint64_t ver, uint64_t *cookie,
librados::WatchCtx *ctx)
{
@@ -2173,6 +2181,16 @@ extern "C" int rados_aio_flush(rados_ioctx_t io)
return 0;
}
+extern "C" int rados_aio_stat(rados_ioctx_t io, const char *o,
+ rados_completion_t completion,
+ uint64_t *psize, time_t *pmtime)
+{
+ librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
+ object_t oid(o);
+ return ctx->aio_stat(oid, (librados::AioCompletionImpl*)completion,
+ psize, pmtime);
+}
+
struct C_WatchCB : public librados::WatchCtx {
rados_watchcb_t wcb;
void *arg;
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html