diff options
author | Yehuda Sadeh <yehuda@hq.newdream.net> | 2012-01-31 13:45:49 -0800 |
---|---|---|
committer | Yehuda Sadeh <yehuda@hq.newdream.net> | 2012-01-31 13:45:49 -0800 |
commit | 7b1420ededa3e4525347554a0516aca1483748e6 (patch) | |
tree | fd3fe3af152dec741251394d624927580d858004 | |
parent | cbc3e5a193ab74f18deab61faa5fda8cee04c020 (diff) | |
download | ceph-7b1420ededa3e4525347554a0516aca1483748e6.tar.gz |
librados: define api for object expiration
added new set_expiration call
Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
-rw-r--r-- | src/include/rados/librados.h | 10 | ||||
-rw-r--r-- | src/include/rados/librados.hpp | 2 | ||||
-rw-r--r-- | src/librados.cc | 55 |
3 files changed, 67 insertions, 0 deletions
diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index 4d113fc8a12..12d67e36cec 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -917,6 +917,16 @@ int rados_setxattr(rados_ioctx_t io, const char *o, const char *name, const char int rados_rmxattr(rados_ioctx_t io, const char *o, const char *name); /** + * Sets an expiration time on an object + * + * @param io the context in which to delete the xattr + * @param o the name of the object + * @param t time in UTC after which object may be removed by storage + * @returns 0 on success, negative error code on failure + */ +int rados_set_expiration(rados_ioctx_t io, const char *o, time_t t); + +/** * Start iterating over xattrs on an object. * * @post iter is a valid iterator diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index e27f9fc3f78..d7df1a6cb2e 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -168,6 +168,7 @@ namespace librados void zero(uint64_t off, uint64_t len); void rmxattr(const char *name); void setxattr(const char *name, const bufferlist& bl); + void set_expiration(time_t t); void tmap_update(const bufferlist& cmdbl); void clone_range(uint64_t dst_off, const std::string& src_oid, uint64_t src_off, @@ -248,6 +249,7 @@ namespace librados int getxattrs(const std::string& oid, std::map<std::string, bufferlist>& attrset); int setxattr(const std::string& oid, const char *name, bufferlist& bl); int rmxattr(const std::string& oid, const char *name); + int set_expiration(const std::string& oid, time_t t); int stat(const std::string& oid, uint64_t *psize, time_t *pmtime); int exec(const std::string& oid, const char *cls, const char *method, bufferlist& inbl, bufferlist& outbl); diff --git a/src/librados.cc b/src/librados.cc index 9e728982a4c..0b6e4704767 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -270,6 +270,13 @@ void librados::ObjectWriteOperation::rmxattr(const char *name) o->rmxattr(name); } +void librados::ObjectWriteOperation::set_expiration(time_t t) +{ + ::ObjectOperation *o = (::ObjectOperation *)impl; + utime_t ut(t, 0); + o->set_expiration(ut); +} + void librados::ObjectWriteOperation::setxattr(const char *name, const bufferlist& v) { ::ObjectOperation *o = (::ObjectOperation *)impl; @@ -612,6 +619,7 @@ public: int setxattr(IoCtxImpl& io, const object_t& oid, const char *name, bufferlist& bl); int getxattrs(IoCtxImpl& io, const object_t& oid, map<string, bufferlist>& attrset); int rmxattr(IoCtxImpl& io, const object_t& oid, const char *name); + int set_expiration(IoCtxImpl& io, const object_t& oid, time_t t); int pool_list(std::list<string>& ls); int get_pool_stats(std::list<string>& ls, map<string,::pool_stat_t>& result); @@ -2348,6 +2356,40 @@ int librados::RadosClient::rmxattr(IoCtxImpl& io, const object_t& oid, const cha return 0; } +int librados::RadosClient::set_expiration(IoCtxImpl& io, const object_t& oid, time_t t) +{ + utime_t ut = ceph_clock_now(cct); + + /* can't write to a snapshot */ + if (io.snap_seq != CEPH_NOSNAP) + return -EROFS; + + Mutex mylock("RadosClient::create::mylock"); + Cond cond; + bool done; + int r; + eversion_t ver; + + Context *onack = new C_SafeCond(&mylock, &cond, &done, &r); + + utime_t expire(t, 0); + ::ObjectOperation o; + o.set_expiration(expire); + + lock.Lock(); + objecter->mutate(oid, io.oloc, o, io.snapc, ut, 0, onack, NULL, &ver); + lock.Unlock(); + + mylock.Lock(); + while (!done) + cond.Wait(mylock); + mylock.Unlock(); + + set_sync_op_version(io, ver); + + return r; +} + int librados::RadosClient::setxattr(IoCtxImpl& io, const object_t& oid, const char *name, bufferlist& bl) { @@ -2891,6 +2933,12 @@ int librados::IoCtx::rmxattr(const std::string& oid, const char *name) return io_ctx_impl->client->rmxattr(*io_ctx_impl, obj, name); } +int librados::IoCtx::set_expiration(const std::string& oid, time_t t) +{ + object_t obj(oid); + return io_ctx_impl->client->set_expiration(*io_ctx_impl, obj, t); +} + int librados::IoCtx::stat(const std::string& oid, uint64_t *psize, time_t *pmtime) { object_t obj(oid); @@ -3934,6 +3982,13 @@ extern "C" int rados_rmxattr(rados_ioctx_t io, const char *o, const char *name) return ctx->client->rmxattr(*ctx, oid, name); } +extern "C" int rados_set_expiration(rados_ioctx_t io, const char *o, time_t t) +{ + librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io; + object_t oid(o); + return ctx->client->set_expiration(*ctx, oid, t); +} + extern "C" int rados_stat(rados_ioctx_t io, const char *o, uint64_t *psize, time_t *pmtime) { librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io; |