diff options
-rw-r--r-- | src/include/rados/librados.h | 9 | ||||
-rw-r--r-- | src/include/rados/librados.hpp | 2 | ||||
-rw-r--r-- | src/librados.cc | 33 | ||||
-rw-r--r-- | src/rados.cc | 3 |
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; |