summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@hq.newdream.net>2012-01-31 13:45:49 -0800
committerYehuda Sadeh <yehuda@hq.newdream.net>2012-01-31 13:45:49 -0800
commit7b1420ededa3e4525347554a0516aca1483748e6 (patch)
treefd3fe3af152dec741251394d624927580d858004
parentcbc3e5a193ab74f18deab61faa5fda8cee04c020 (diff)
downloadceph-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.h10
-rw-r--r--src/include/rados/librados.hpp2
-rw-r--r--src/librados.cc55
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;