summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@hq.newdream.net>2012-01-31 14:21:08 -0800
committerYehuda Sadeh <yehuda@hq.newdream.net>2012-01-31 14:21:08 -0800
commitc1dc58b967addd7b2587b8108775a0f6e17a1c46 (patch)
tree86fb12e3f90bbe1f96c48f41486e9371a405e527
parentafe1eaa3c17c4e61dee2b6411724d369ef193f47 (diff)
downloadceph-historic/wip-objs-expire.tar.gz
librados: add explicit remove_expiration() call to libradoshistoric/wip-objs-expire
also, time is converted to utc. Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
-rw-r--r--src/include/rados/librados.h9
-rw-r--r--src/include/rados/librados.hpp2
-rw-r--r--src/librados.cc33
-rw-r--r--src/rados.cc3
4 files changed, 43 insertions, 4 deletions
diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h
index 12d67e36cec..5b9285c9c8b 100644
--- a/src/include/rados/librados.h
+++ b/src/include/rados/librados.h
@@ -927,6 +927,15 @@ int rados_rmxattr(rados_ioctx_t io, const char *o, const char *name);
int rados_set_expiration(rados_ioctx_t io, const char *o, time_t t);
/**
+ * Removes object expiration
+ *
+ * @param io the context in which to delete the xattr
+ * @param o the name of the object
+ * @returns 0 on success, negative error code on failure
+ */
+int rados_remove_expiration(rados_ioctx_t io, const char *o);
+
+/**
* 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 d7df1a6cb2e..c2133877f33 100644
--- a/src/include/rados/librados.hpp
+++ b/src/include/rados/librados.hpp
@@ -169,6 +169,7 @@ namespace librados
void rmxattr(const char *name);
void setxattr(const char *name, const bufferlist& bl);
void set_expiration(time_t t);
+ void remove_expiration();
void tmap_update(const bufferlist& cmdbl);
void clone_range(uint64_t dst_off,
const std::string& src_oid, uint64_t src_off,
@@ -250,6 +251,7 @@ namespace librados
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 remove_expiration(const std::string& oid);
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 0b6e4704767..bbe75a9f6f0 100644
--- a/src/librados.cc
+++ b/src/librados.cc
@@ -273,7 +273,15 @@ void librados::ObjectWriteOperation::rmxattr(const char *name)
void librados::ObjectWriteOperation::set_expiration(time_t t)
{
::ObjectOperation *o = (::ObjectOperation *)impl;
- utime_t ut(t, 0);
+ time_t utc;
+ if (t > 0) {
+ struct tm bdt;
+ gmtime_r(&t, &bdt);
+ utc = mktime(&bdt);
+ } else {
+ utc = 0;
+ }
+ utime_t ut(utc, 0);
o->set_expiration(ut);
}
@@ -2372,7 +2380,15 @@ int librados::RadosClient::set_expiration(IoCtxImpl& io, const object_t& oid, ti
Context *onack = new C_SafeCond(&mylock, &cond, &done, &r);
- utime_t expire(t, 0);
+ time_t utc;
+ if (t > 0) {
+ struct tm bdt;
+ gmtime_r(&t, &bdt);
+ utc = mktime(&bdt);
+ } else {
+ utc = 0;
+ }
+ utime_t expire(utc, 0);
::ObjectOperation o;
o.set_expiration(expire);
@@ -2939,6 +2955,12 @@ int librados::IoCtx::set_expiration(const std::string& oid, time_t t)
return io_ctx_impl->client->set_expiration(*io_ctx_impl, obj, t);
}
+int librados::IoCtx::remove_expiration(const std::string& oid)
+{
+ object_t obj(oid);
+ return io_ctx_impl->client->set_expiration(*io_ctx_impl, obj, 0);
+}
+
int librados::IoCtx::stat(const std::string& oid, uint64_t *psize, time_t *pmtime)
{
object_t obj(oid);
@@ -3989,6 +4011,13 @@ extern "C" int rados_set_expiration(rados_ioctx_t io, const char *o, time_t t)
return ctx->client->set_expiration(*ctx, oid, t);
}
+extern "C" int rados_remove_expiration(rados_ioctx_t io, const char *o)
+{
+ librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
+ object_t oid(o);
+ return ctx->client->set_expiration(*ctx, oid, 0);
+}
+
extern "C" int rados_stat(rados_ioctx_t io, const char *o, uint64_t *psize, time_t *pmtime)
{
librados::IoCtxImpl *ctx = (librados::IoCtxImpl *)io;
diff --git a/src/rados.cc b/src/rados.cc
index d33c6b1f484..9d2840ce5e4 100644
--- a/src/rados.cc
+++ b/src/rados.cc
@@ -1068,9 +1068,8 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts,
if (!pool_name || nargs.size() < 2)
usage_exit();
string oid(nargs[1]);
- utime_t t(0, 0);
- ret = io_ctx.set_expiration(oid, t);
+ ret = io_ctx.remove_expiration(oid);
if (ret < 0) {
cerr << "error removing expiration from " << pool_name << "/" << oid << ": " << strerror_r(-ret, buf, sizeof(buf)) << std::endl;
return 1;