]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: separate bucket vs object owner tracking
authorSage Weil <sage@newdream.net>
Fri, 30 Sep 2011 16:10:56 +0000 (09:10 -0700)
committerSage Weil <sage@newdream.net>
Fri, 30 Sep 2011 16:11:18 +0000 (09:11 -0700)
- track bucket_owner in session
- separte bucket and object owner fields in log entries

Signed-off-by: Sage Weil <sage@newdream.net>
src/rgw/rgw_admin.cc
src/rgw/rgw_common.h
src/rgw/rgw_log.cc
src/rgw/rgw_log.h
src/rgw/rgw_op.cc

index af98f9887d9a0b9279689604beaf768dfc364dd2..966ef7398d101527635bcf177b128e5b33f91fdc 100644 (file)
@@ -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<string, RGWBucketEnt>& m = buckets.get_buckets();
-        for (map<string, RGWBucketEnt>::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<string, RGWBucketEnt>& m = buckets.get_buckets();
+        for (map<string, RGWBucketEnt>::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) {
index 4870e179466061b6b6631ac69bfbed9b4cd799d3..bebcf5343e25b9ec120ae0cab287a2493475045f 100644 (file)
@@ -473,6 +473,7 @@ struct req_state {
    rgw_bucket bucket;
    string bucket_name_str;
    string object_str;
+   string bucket_owner;
 
    map<string, string> x_meta_map;
 
index 0e55b115c437565dd251c5bb81778751a34ffae7..8702733f2e0efe8aeabf04606e49249554a8c6fd 100644 (file)
@@ -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;
index 45915594d3a56be0a34b45d2339bbf0d6bac06b4..dd8d08854ba0e62a9e9ddcd6a01c8694897da68c 100644 (file)
@@ -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);
index 47e4e80e22f20916bbdb9553c367bf32ed15d111..5c4a9eb45d38dcb80b3577091d127cd5b1bdc30b 100644 (file)
@@ -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) {