int bucket_stats(rgw_bucket& bucket, Formatter *formatter)
{
RGWBucketInfo bucket_info;
- int r = store->get_bucket_info(NULL, bucket.name, bucket_info, NULL);
+ time_t mtime;
+ int r = store->get_bucket_info(NULL, bucket.name, bucket_info, NULL, &mtime);
if (r < 0)
return r;
formatter->dump_string("id", bucket.bucket_id);
formatter->dump_string("marker", bucket.marker);
formatter->dump_string("owner", bucket_info.owner);
+ formatter->dump_int("mtime", mtime);
formatter->dump_int("ver", bucket_ver);
formatter->dump_int("master_ver", master_ver);
dump_bucket_usage(stats, formatter);
{
if (!bucket_name.empty()) {
RGWBucketInfo bucket_info;
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info, NULL);
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, NULL, NULL);
if (r < 0) {
cerr << "could not get bucket info for bucket=" << bucket_name << std::endl;
return r;
policy.encode(aclbl);
RGWObjVersionTracker objv_tracker;
+ time_t mtime;
- ret = store->get_bucket_info(NULL, bucket_str, bucket_info, &objv_tracker);
+ ret = store->get_bucket_info(NULL, bucket_str, bucket_info, &objv_tracker, &mtime);
if (ret < 0)
return ret;
RGWBucketInfo bucket_info;
RGWObjVersionTracker objv_tracker;
- int r = store->get_bucket_info(NULL, bucket.name, bucket_info, &objv_tracker);
+ time_t mtime;
+ int r = store->get_bucket_info(NULL, bucket.name, bucket_info, &objv_tracker, &mtime);
if (r < 0) {
ldout(store->ctx(), 0) << "could not get bucket info for bucket=" << bucket << dendl;
continue;
obj.bucket = bucket;
int max = 1000;
- ret = rgw_get_system_obj(store, NULL, store->zone.domain_root, bucket.name, bl, NULL);
+ ret = rgw_get_system_obj(store, NULL, store->zone.domain_root, bucket.name, bl, NULL, NULL);
bufferlist::iterator iter = bl.begin();
try {
if (!bucket_name.empty()) {
RGWObjVersionTracker objv_tracker;
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker);
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker, NULL);
if (r < 0) {
ldout(store->ctx(), 0) << "could not get bucket info for bucket=" << bucket_name << dendl;
return r;
map<RGWObjCategory, RGWBucketStats> stats;
RGWObjVersionTracker objv_tracker;
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker);
+ time_t mtime;
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &objv_tracker, &mtime);
if (r < 0)
return r;
formatter->dump_string("owner", bucket_info.owner);
formatter->dump_int("ver", bucket_ver);
formatter->dump_int("master_ver", master_ver);
+ formatter->dump_int("mtime", mtime);
dump_bucket_usage(stats, formatter);
formatter->close_section();
class RGWBucketMetadataObject : public RGWMetadataObject {
RGWBucketCompleteInfo info;
public:
- RGWBucketMetadataObject(RGWBucketCompleteInfo& i, obj_version& v) : info(i) {
+ RGWBucketMetadataObject(RGWBucketCompleteInfo& i, obj_version& v, time_t m) : info(i) {
objv = v;
+ mtime = m;
}
void dump(Formatter *f) const {
int init_bucket(RGWRados *store, string& bucket_name, rgw_bucket& bucket, RGWObjVersionTracker *objv_tracker) {
RGWBucketInfo bucket_info;
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info, objv_tracker);
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, objv_tracker, NULL);
if (r < 0) {
cerr << "could not get bucket info for bucket=" << bucket_name << std::endl;
return r;
RGWBucketCompleteInfo bci;
RGWObjVersionTracker objv_tracker;
+ time_t mtime;
- int ret = store->get_bucket_info(NULL, entry, bci.info, &objv_tracker, &bci.attrs);
+ int ret = store->get_bucket_info(NULL, entry, bci.info, &objv_tracker, &mtime, &bci.attrs);
if (ret < 0)
return ret;
- RGWBucketMetadataObject *mdo = new RGWBucketMetadataObject(bci, objv_tracker.read_version);
+ RGWBucketMetadataObject *mdo = new RGWBucketMetadataObject(bci, objv_tracker.read_version, mtime);
*obj = mdo;
RGWBucketCompleteInfo bci, old_bci;
decode_json_obj(bci, obj);
- int ret = store->get_bucket_info(NULL, entry, old_bci.info, &objv_tracker, &old_bci.attrs);
+ time_t orig_mtime;
+
+ int ret = store->get_bucket_info(NULL, entry, old_bci.info, &objv_tracker, &orig_mtime, &old_bci.attrs);
if (ret < 0 && ret != -ENOENT)
return ret;
f->open_object_section("metadata_info");
encode_json("key", metadata_key, f);
encode_json("ver", obj->get_version(), f);
+ time_t mtime = obj->get_mtime();
+ if (mtime > 0) {
+ encode_json("mtime", mtime, f);
+ }
encode_json("data", *obj, f);
f->close_section();
class RGWMetadataObject {
protected:
obj_version objv;
+ time_t mtime;
public:
+ RGWMetadataObject() : mtime(0) {}
virtual ~RGWMetadataObject() {}
obj_version& get_version();
+ time_t get_mtime() { return mtime; }
virtual void dump(Formatter *f) const = 0;
};
/* object exists, but policy is broken */
RGWBucketInfo info;
RGWUserInfo uinfo;
- int r = store->get_bucket_info(ctx, obj.bucket.name, info, objv_tracker);
+ int r = store->get_bucket_info(ctx, obj.bucket.name, info, objv_tracker, NULL);
if (r < 0)
goto done;
r = rgw_get_user_info_by_uid(store, info.owner, uinfo);
RGWBucketInfo source_info;
- ret = store->get_bucket_info(s->obj_ctx, copy_source_str, source_info, NULL);
+ ret = store->get_bucket_info(s->obj_ctx, copy_source_str, source_info, NULL, NULL);
if (ret == 0) {
string& region = source_info.region;
s->local_source = (region.empty() && store->region.is_master) ||
if (s->bucket_name_str.size()) {
bool exists = true;
- ret = store->get_bucket_info(s->obj_ctx, s->bucket_name_str, bucket_info, &s->objv_tracker);
+ ret = store->get_bucket_info(s->obj_ctx, s->bucket_name_str, bucket_info, &s->objv_tracker, NULL);
if (ret < 0) {
if (ret != -ENOENT) {
ldout(s->cct, 0) << "NOTICE: couldn't get bucket from bucket_name (name=" << s->bucket_name_str << ")" << dendl;
if (bucket_name.compare(s->bucket.name) != 0) {
RGWBucketInfo bucket_info;
- int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &s->objv_tracker);
+ int r = store->get_bucket_info(NULL, bucket_name, bucket_info, &s->objv_tracker, NULL);
if (r < 0) {
ldout(s->cct, 0) << "could not get bucket info for bucket=" << bucket_name << dendl;
return r;
*/
RGWBucketInfo info;
map<string, bufferlist> attrs;
- int r = store->get_bucket_info(NULL, s->bucket.name, info, &s->objv_tracker, &attrs);
+ int r = store->get_bucket_info(NULL, s->bucket.name, info, &s->objv_tracker, NULL, &attrs);
if (r < 0) {
ldout(s->cct, 0) << "ERROR: get_bucket_info on bucket=" << s->bucket.name << " returned err=" << r << " after create_bucket returned -EEXIST" << dendl;
ret = r;
if (ret < 0)
return ret;
- ret = store->get_bucket_info(s->obj_ctx, src_bucket_name, src_bucket_info, NULL);
+ ret = store->get_bucket_info(s->obj_ctx, src_bucket_name, src_bucket_info, NULL, NULL);
if (ret < 0)
return ret;
if (src_bucket_name.compare(dest_bucket_name) == 0) { /* will only happen if s->local_source */
dest_bucket_info = src_bucket_info;
} else {
- ret = store->get_bucket_info(s->obj_ctx, dest_bucket_name, dest_bucket_info, NULL);
+ ret = store->get_bucket_info(s->obj_ctx, dest_bucket_name, dest_bucket_info, NULL, NULL);
if (ret < 0)
return ret;
}
rgw_bucket pool(pool_name.c_str());
bufferlist bl;
- int ret = rgw_get_system_obj(store, NULL, pool, oid, bl, NULL);
+ int ret = rgw_get_system_obj(store, NULL, pool, oid, bl, NULL, NULL);
if (ret < 0)
return ret;
string oid = region_info_oid_prefix + name;
- int ret = rgw_get_system_obj(store, NULL, pool, oid, bl, NULL);
+ int ret = rgw_get_system_obj(store, NULL, pool, oid, bl, NULL, NULL);
if (ret < 0) {
lderr(cct) << "failed reading region info from " << pool << ":" << oid << ": " << cpp_strerror(-ret) << dendl;
return ret;
bufferlist bl;
string oid = zone_info_oid_prefix + name;
- int ret = rgw_get_system_obj(store, NULL, pool, oid, bl, NULL);
+ int ret = rgw_get_system_obj(store, NULL, pool, oid, bl, NULL, NULL);
if (ret < 0)
return ret;
rgw_bucket pool(pool_name.c_str());
bufferlist bl;
- int ret = rgw_get_system_obj(store, NULL, pool, oid, bl, NULL);
+ int ret = rgw_get_system_obj(store, NULL, pool, oid, bl, NULL, NULL);
if (ret < 0)
return ret;
rgw_obj obj(zone.domain_root, avail_pools);
- int ret = rgw_get_system_obj(this, NULL, zone.domain_root, avail_pools, map_bl, NULL);
+ int ret = rgw_get_system_obj(this, NULL, zone.domain_root, avail_pools, map_bl, NULL, NULL);
if (ret < 0) {
goto read_omap;
}
RGWBucketInfo info;
map<string, bufferlist> attrs;
RGWObjVersionTracker objv_tracker;
- int r = get_bucket_info(NULL, bucket.name, info, &objv_tracker, &attrs);
+ int r = get_bucket_info(NULL, bucket.name, info, &objv_tracker, NULL, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: get_bucket_info on bucket=" << bucket.name << " returned err=" << r << dendl;
return r;
RGWBucketInfo info;
RGWObjVersionTracker objv_tracker;
map<string, bufferlist> attrs;
- int r = get_bucket_info(NULL, bucket.name, info, &objv_tracker, &attrs);
+ int r = get_bucket_info(NULL, bucket.name, info, &objv_tracker, NULL, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: get_bucket_info on bucket=" << bucket.name << " returned err=" << r << ", skipping bucket" << dendl;
ret = r;
int RGWRados::bucket_suspended(rgw_bucket& bucket, bool *suspended)
{
RGWBucketInfo bucket_info;
- int ret = get_bucket_info(NULL, bucket.name, bucket_info, NULL);
+ int ret = get_bucket_info(NULL, bucket.name, bucket_info, NULL, NULL);
if (ret < 0) {
return ret;
}
return 0;
}
-int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs)
+int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, RGWObjVersionTracker *objv_tracker,
+ time_t *pmtime, map<string, bufferlist> *pattrs)
{
bufferlist bl;
- int ret = rgw_get_system_obj(this, ctx, zone.domain_root, bucket_name, bl, objv_tracker, pattrs);
+ int ret = rgw_get_system_obj(this, ctx, zone.domain_root, bucket_name, bl, objv_tracker, pmtime, pattrs);
if (ret < 0) {
info.bucket.name = bucket_name; /* only init this field */
return ret;
int decode_policy(bufferlist& bl, ACLOwner *owner);
int get_bucket_stats(rgw_bucket& bucket, uint64_t *bucket_ver, uint64_t *master_ver, map<RGWObjCategory, RGWBucketStats>& stats);
- virtual int get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs = NULL);
+ virtual int get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, RGWObjVersionTracker *objv_tracker,
+ time_t *pmtime, map<string, bufferlist> *pattrs = NULL);
virtual int put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs);
int cls_rgw_init_index(librados::IoCtx& io_ctx, librados::ObjectWriteOperation& op, string& oid);
return;
}
- http_ret = store->get_bucket_info(NULL, bucket_name, bucket_info, NULL);
+ http_ret = store->get_bucket_info(NULL, bucket_name, bucket_info, NULL, NULL);
if (http_ret < 0) {
dout(5) << "could not get bucket info for bucket=" << bucket_name << dendl;
return;
http_ret = -EINVAL;
return;
}
- http_ret = store->get_bucket_info(NULL, bucket_name, bucket_info, NULL);
+ http_ret = store->get_bucket_info(NULL, bucket_name, bucket_info, NULL, NULL);
if (http_ret < 0) {
dout(5) << "could not get bucket info for bucket=" << bucket_name << dendl;
return;
}
int rgw_get_system_obj(RGWRados *rgwstore, void *ctx, rgw_bucket& bucket, string& key, bufferlist& bl,
- RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs)
+ RGWObjVersionTracker *objv_tracker, time_t *pmtime, map<string, bufferlist> *pattrs)
{
int ret;
struct rgw_err err;
do {
ret = rgwstore->prepare_get_obj(ctx, obj, NULL, NULL, pattrs, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, objv_tracker, &handle, &err);
+ NULL, pmtime, NULL, NULL, NULL, NULL, objv_tracker, &handle, &err);
if (ret < 0)
return ret;
int rgw_put_system_obj(RGWRados *rgwstore, rgw_bucket& bucket, string& oid, const char *data, size_t size, bool exclusive,
RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs = NULL);
int rgw_get_system_obj(RGWRados *rgwstore, void *ctx, rgw_bucket& bucket, string& key, bufferlist& bl,
- RGWObjVersionTracker *objv_tracker, map<string, bufferlist> *pattrs = NULL);
+ RGWObjVersionTracker *objv_tracker, time_t *pmtime, map<string, bufferlist> *pattrs = NULL);
int rgw_tools_init(CephContext *cct);
void rgw_tools_cleanup();
return ret;
}
-int rgw_get_user_info_from_index(RGWRados *store, string& key, rgw_bucket& bucket, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker)
+int rgw_get_user_info_from_index(RGWRados *store, string& key, rgw_bucket& bucket, RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker, time_t *pmtime)
{
bufferlist bl;
RGWUID uid;
- int ret = rgw_get_system_obj(store, NULL, bucket, key, bl, NULL);
+ int ret = rgw_get_system_obj(store, NULL, bucket, key, bl, NULL, pmtime);
if (ret < 0)
return ret;
* Given a uid, finds the user info associated with it.
* returns: 0 on success, -ERR# on failure (including nonexistence)
*/
-int rgw_get_user_info_by_uid(RGWRados *store, string& uid, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker)
+int rgw_get_user_info_by_uid(RGWRados *store, string& uid, RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker, time_t *pmtime)
{
bufferlist bl;
RGWUID user_id;
- int ret = rgw_get_system_obj(store, NULL, store->zone.user_uid_pool, uid, bl, objv_tracker);
+ int ret = rgw_get_system_obj(store, NULL, store->zone.user_uid_pool, uid, bl, objv_tracker, pmtime);
if (ret < 0)
return ret;
* Given an email, finds the user info associated with it.
* returns: 0 on success, -ERR# on failure (including nonexistence)
*/
-int rgw_get_user_info_by_email(RGWRados *store, string& email, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker)
+int rgw_get_user_info_by_email(RGWRados *store, string& email, RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker, time_t *pmtime)
{
- return rgw_get_user_info_from_index(store, email, store->zone.user_email_pool, info, objv_tracker);
+ return rgw_get_user_info_from_index(store, email, store->zone.user_email_pool, info, objv_tracker, pmtime);
}
/**
* Given an swift username, finds the user_info associated with it.
* returns: 0 on success, -ERR# on failure (including nonexistence)
*/
-extern int rgw_get_user_info_by_swift(RGWRados *store, string& swift_name, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker)
+extern int rgw_get_user_info_by_swift(RGWRados *store, string& swift_name, RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker, time_t *pmtime)
{
- return rgw_get_user_info_from_index(store, swift_name, store->zone.user_swift_pool, info, objv_tracker);
+ return rgw_get_user_info_from_index(store, swift_name, store->zone.user_swift_pool, info, objv_tracker, pmtime);
}
/**
* Given an access key, finds the user info associated with it.
* returns: 0 on success, -ERR# on failure (including nonexistence)
*/
-extern int rgw_get_user_info_by_access_key(RGWRados *store, string& access_key, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker)
+extern int rgw_get_user_info_by_access_key(RGWRados *store, string& access_key, RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker, time_t *pmtime)
{
- return rgw_get_user_info_from_index(store, access_key, store->zone.user_keys_pool, info, objv_tracker);
+ return rgw_get_user_info_from_index(store, access_key, store->zone.user_keys_pool, info, objv_tracker, pmtime);
}
int rgw_remove_key_index(RGWRados *store, RGWAccessKey& access_key)
{
RGWObjVersionTracker objv_tracker;
RGWUserInfo info;
- int ret = rgw_get_user_info_by_uid(store, uid, info, &objv_tracker);
+ int ret = rgw_get_user_info_by_uid(store, uid, info, &objv_tracker, NULL);
if (ret < 0)
return ret;
* Given an email, finds the user info associated with it.
* returns: 0 on success, -ERR# on failure (including nonexistence)
*/
-extern int rgw_get_user_info_by_uid(RGWRados *store, string& user_id, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker = NULL);
+extern int rgw_get_user_info_by_uid(RGWRados *store, string& user_id, RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker = NULL, time_t *pmtime = NULL);
/**
* Given an swift username, finds the user info associated with it.
* returns: 0 on success, -ERR# on failure (including nonexistence)
*/
-extern int rgw_get_user_info_by_email(RGWRados *store, string& email, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker = NULL);
+extern int rgw_get_user_info_by_email(RGWRados *store, string& email, RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker = NULL, time_t *pmtime = NULL);
/**
* Given an swift username, finds the user info associated with it.
* returns: 0 on success, -ERR# on failure (including nonexistence)
*/
-extern int rgw_get_user_info_by_swift(RGWRados *store, string& swift_name, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker = NULL);
+extern int rgw_get_user_info_by_swift(RGWRados *store, string& swift_name, RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker = NULL, time_t *pmtime = NULL);
/**
* Given an access key, finds the user info associated with it.
* returns: 0 on success, -ERR# on failure (including nonexistence)
*/
-extern int rgw_get_user_info_by_access_key(RGWRados *store, string& access_key, RGWUserInfo& info, RGWObjVersionTracker *objv_tracker = NULL);
+extern int rgw_get_user_info_by_access_key(RGWRados *store, string& access_key, RGWUserInfo& info,
+ RGWObjVersionTracker *objv_tracker = NULL, time_t *pmtime = NULL);
/**
* Given an RGWUserInfo, deletes the user and its bucket ACLs.
*/