From 48558bb623e58bb2f7884860b61f3b9d4693a9e9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 30 Sep 2011 09:10:56 -0700 Subject: [PATCH] rgw: separate bucket vs object owner tracking - track bucket_owner in session - separte bucket and object owner fields in log entries Signed-off-by: Sage Weil --- src/rgw/rgw_admin.cc | 130 +++++++++++++++++++++---------------------- src/rgw/rgw_common.h | 1 + src/rgw/rgw_log.cc | 5 +- src/rgw/rgw_log.h | 12 ++-- src/rgw/rgw_op.cc | 3 + 5 files changed, 79 insertions(+), 72 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index af98f9887d9a0..966ef7398d101 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -1154,7 +1154,7 @@ int main(int argc, char **argv) if (!first_iter.end()) { ::decode(entry, first_iter); formatter->dump_int("bucket_id", entry.bucket_id); - formatter->dump_string("owner", entry.owner); + formatter->dump_string("bucket_owner", entry.bucket_owner); formatter->dump_string("bucket", entry.bucket); } formatter->open_array_section("log_entries"); @@ -1168,8 +1168,8 @@ int main(int argc, char **argv) formatter->dump_string("bucket", entry.bucket.c_str()); formatter->dump_stream("time") << entry.time; formatter->dump_string("remote_addr", entry.remote_addr.c_str()); - if (entry.owner.size()) - formatter->dump_string("owner", entry.owner.c_str()); + if (entry.object_owner.length()) + formatter->dump_string("object_owner", entry.object_owner.c_str()); formatter->dump_string("user", entry.user.c_str()); formatter->dump_string("operation", entry.op.c_str()); formatter->dump_string("uri", entry.uri.c_str()); @@ -1198,72 +1198,72 @@ int main(int argc, char **argv) } } } - + if (opt_cmd == OPT_USER_RM) { rgw_delete_user(info, purge_data); } - + if (opt_cmd == OPT_POOL_INFO) { - if (bucket_name.empty() && bucket_id < 0) { - cerr << "either bucket or bucket-id needs to be specified" << std::endl; - return usage(); - } - formatter->reset(); - formatter->open_object_section("pool_info"); - formatter->dump_int("id", bucket_id); - formatter->dump_string("bucket", bucket_info.bucket.name.c_str()); - formatter->dump_string("pool", bucket_info.bucket.pool.c_str()); - formatter->dump_string("owner", bucket_info.owner.c_str()); - formatter->close_section(); - formatter->flush(cout); - } - - if (opt_cmd == OPT_BUCKET_STATS) { - if (bucket_name.empty() && bucket_id < 0 && user_id.empty()) { - cerr << "either bucket or bucket-id or uid needs to be specified" << std::endl; - return usage(); - } - formatter->reset(); - if (user_id.empty()) { - bucket_stats(bucket, formatter); - } else { - RGWUserBuckets buckets; - if (rgw_read_user_buckets(user_id, buckets, false) < 0) { - cerr << "could not get buckets for uid " << user_id << std::endl; - } else { - formatter->open_array_section("buckets"); - map& m = buckets.get_buckets(); - for (map::iterator iter = m.begin(); iter != m.end(); ++iter) { - RGWBucketEnt obj = iter->second; - bucket_stats(obj.bucket, formatter); - } - formatter->close_section(); - } - } - formatter->flush(cout); - } - - if (opt_cmd == OPT_POOL_CREATE) { -#if 0 - if (bucket_name.empty()) - return usage(); - string no_object; - int ret; - bufferlist bl; - rgw_obj obj(bucket, no_object); - - ret = rgwstore->get_attr(NULL, obj, RGW_ATTR_ACL, bl); - if (ret < 0) { - RGW_LOG(0) << "can't read bucket acls: " << ret << dendl; - return ret; - } - RGWAccessControlPolicy policy; - bufferlist::iterator iter = bl.begin(); - policy.decode(iter); - - RGWBucketInfo info; - info.bucket = bucket; - info.owner = policy.get_owner().get_id(); + if (bucket_name.empty() && bucket_id < 0) { + cerr << "either bucket or bucket-id needs to be specified" << std::endl; + return usage(); + } + formatter->reset(); + formatter->open_object_section("pool_info"); + formatter->dump_int("id", bucket_id); + formatter->dump_string("bucket", bucket_info.bucket.name.c_str()); + formatter->dump_string("pool", bucket_info.bucket.pool.c_str()); + formatter->dump_string("owner", bucket_info.owner.c_str()); + formatter->close_section(); + formatter->flush(cout); + } + + if (opt_cmd == OPT_BUCKET_STATS) { + if (bucket_name.empty() && bucket_id < 0 && user_id.empty()) { + cerr << "either bucket or bucket-id or uid needs to be specified" << std::endl; + return usage(); + } + formatter->reset(); + if (user_id.empty()) { + bucket_stats(bucket, formatter); + } else { + RGWUserBuckets buckets; + if (rgw_read_user_buckets(user_id, buckets, false) < 0) { + cerr << "could not get buckets for uid " << user_id << std::endl; + } else { + formatter->open_array_section("buckets"); + map& m = buckets.get_buckets(); + for (map::iterator iter = m.begin(); iter != m.end(); ++iter) { + RGWBucketEnt obj = iter->second; + bucket_stats(obj.bucket, formatter); + } + formatter->close_section(); + } + } + formatter->flush(cout); + } + + if (opt_cmd == OPT_POOL_CREATE) { + #if 0 + if (bucket_name.empty()) + return usage(); + string no_object; + int ret; + bufferlist bl; + rgw_obj obj(bucket, no_object); + + ret = rgwstore->get_attr(NULL, obj, RGW_ATTR_ACL, bl); + if (ret < 0) { + RGW_LOG(0) << "can't read bucket acls: " << ret << dendl; + return ret; + } + RGWAccessControlPolicy policy; + bufferlist::iterator iter = bl.begin(); + policy.decode(iter); + + RGWBucketInfo info; + info.bucket = bucket; + info.owner = policy.get_owner().get_id(); ret = rgw_store_bucket_info_id(bucket.bucket_id, info); if (ret < 0) { diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 4870e17946606..bebcf5343e25b 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -473,6 +473,7 @@ struct req_state { rgw_bucket bucket; string bucket_name_str; string object_str; + string bucket_owner; map x_meta_map; diff --git a/src/rgw/rgw_log.cc b/src/rgw/rgw_log.cc index 0e55b115c4375..8702733f2e0ef 100644 --- a/src/rgw/rgw_log.cc +++ b/src/rgw/rgw_log.cc @@ -59,9 +59,8 @@ int rgw_log_op(struct req_state *s) entry.user = s->user.user_id; if (s->acl) - entry.owner = s->acl->get_owner().get_id(); - else - entry.user = s->user.user_id; // FIXME: this is probably wrong! + entry.object_owner = s->acl->get_owner().get_id(); + entry.bucket_owner = s->bucket_owner; entry.time = s->time; entry.total_time = ceph_clock_now(g_ceph_context) - s->time; diff --git a/src/rgw/rgw_log.h b/src/rgw/rgw_log.h index 45915594d3a56..dd8d08854ba0e 100644 --- a/src/rgw/rgw_log.h +++ b/src/rgw/rgw_log.h @@ -4,7 +4,7 @@ #include "rgw_common.h" #include "include/utime.h" -#define LOG_ENTRY_VER 3 +#define LOG_ENTRY_VER 4 #define INTENT_LOG_ENTRY_VER 1 #define RGW_SHOULD_LOG_DEFAULT 1 @@ -13,7 +13,8 @@ #define RGW_INTENT_LOG_POOL_NAME ".intent-log" struct rgw_log_entry { - string owner; + string object_owner; + string bucket_owner; string bucket; utime_t time; string remote_addr; @@ -35,7 +36,8 @@ struct rgw_log_entry { uint8_t ver; ver = LOG_ENTRY_VER; ::encode(ver, bl); - ::encode(owner, bl); + ::encode(object_owner, bl); + ::encode(bucket_owner, bl); ::encode(bucket, bl); ::encode(time, bl); ::encode(remote_addr, bl); @@ -56,7 +58,9 @@ struct rgw_log_entry { void decode(bufferlist::iterator &p) { uint8_t ver; ::decode(ver, p); - ::decode(owner, p); + ::decode(object_owner, p); + if (ver > 3) + ::decode(bucket_owner, p); ::decode(bucket, p); ::decode(time, p); ::decode(remote_addr, p); diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 47e4e80e22f20..5c4a9eb45d38d 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -241,6 +241,7 @@ int read_acls(struct req_state *s, bool only_bucket) return ret; } s->bucket = bucket_info.bucket; + s->bucket_owner = bucket_info.owner; } ret = read_acls(s, s->acl, s->bucket, obj_str); @@ -447,6 +448,8 @@ void RGWCreateBucket::execute() rgw_obj obj(rgw_root_bucket, s->bucket_name_str); + s->bucket_owner = s->user.user_id; + int r = get_policy_from_attr(s->obj_ctx, &old_policy, obj); if (r >= 0) { if (old_policy.get_owner().get_id().compare(s->user.user_id) != 0) { -- 2.39.5