]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: implement rgw_rados helpers for class calls
authorYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 21 Sep 2011 04:34:42 +0000 (21:34 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Wed, 21 Sep 2011 04:34:42 +0000 (21:34 -0700)
src/cls_rgw.cc
src/rgw/rgw_cls_api.h
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 7d1b91666bb88be28ec780d24523c6932ad0f5c8..a59633973a954f20e7d696db85d98e43d4df2f6a 100644 (file)
@@ -96,7 +96,7 @@ int rgw_bucket_modify(cls_method_context_t hctx, bufferlist *in, bufferlist *out
     CLS_LOG("ERROR: rgw_bucket_modify(): failed to decode request\n");
     return -EINVAL;
   }
-  CLS_LOG("rgw_bucket_modify(): request: op=%d name=%s epoch=%lld\n", op.op, op.entry.name.c_str(), op.epoch);
+  CLS_LOG("rgw_bucket_modify(): request: op=%d name=%s epoch=%lld\n", op.op, op.entry.name.c_str(), op.entry.epoch);
 
   std::map<string, struct rgw_bucket_dir_entry>::iterator miter = dir.m.find(op.entry.name);
 
@@ -131,8 +131,8 @@ void __cls_init()
   CLS_LOG("Loaded rgw class!");
 
   cls_register("rgw", &h_class);
-  cls_register_cxx_method(h_class, "rgw_bucket_list", CLS_METHOD_RD | CLS_METHOD_PUBLIC, rgw_bucket_list, &h_rgw_bucket_list);
-  cls_register_cxx_method(h_class, "rgw_bucket_modify", CLS_METHOD_RD | CLS_METHOD_WR | CLS_METHOD_PUBLIC, rgw_bucket_modify, &h_rgw_bucket_modify);
+  cls_register_cxx_method(h_class, "bucket_list", CLS_METHOD_RD | CLS_METHOD_PUBLIC, rgw_bucket_list, &h_rgw_bucket_list);
+  cls_register_cxx_method(h_class, "bucket_modify", CLS_METHOD_RD | CLS_METHOD_WR | CLS_METHOD_PUBLIC, rgw_bucket_modify, &h_rgw_bucket_modify);
 
   return;
 }
index 1db96e546b07e9fb9d7db4a27b0e7f1d5e4756fe..5ca4bc7a1b2225584ef730d4ec6021edd167f200 100644 (file)
@@ -75,21 +75,18 @@ enum modify_op {
 struct rgw_cls_obj_op
 {
   uint8_t op;
-  uint64_t epoch;
   struct rgw_bucket_dir_entry entry;
 
   void encode(bufferlist &bl) const {
     __u8 struct_v = 1;
     ::encode(struct_v, bl);
     ::encode(op, bl);
-    ::encode(epoch, bl);
     ::encode(entry, bl);
   }
   void decode(bufferlist::iterator &bl) {
     __u8 struct_v;
     ::decode(struct_v, bl);
     ::decode(op, bl);
-    ::decode(epoch, bl);
     ::decode(entry, bl);
   }
 };
index d7c81a5a9ffc5eb976846336fb9cdd6bedcfc9cb..c18e88ec065aa94e2904871fbfcaec65698772c1 100644 (file)
@@ -6,6 +6,8 @@
 #include "rgw_rados.h"
 #include "rgw_acl.h"
 
+#include "rgw_cls_api.h"
+
 #include "include/rados/librados.hpp"
 using namespace librados;
 
@@ -1760,3 +1762,89 @@ int RGWRados::distribute(bufferlist& bl)
   int r = control_pool_ctx.notify(notify_oid, 0, bl);
   return r;
 }
+
+int RGWRados::cls_obj_op(rgw_bucket& bucket, uint8_t op, uint64_t epoch,
+                         string& name, uint64_t size, utime_t& mtime)
+{
+  librados::IoCtx io_ctx;
+  int r = open_bucket_ctx(bucket, io_ctx);
+  if (r < 0)
+    return r;
+
+  if (bucket.marker.empty()) {
+    RGW_LOG(0) << "ERROR: empty marker for cls_rgw bucket operation" << dendl;
+    return -EIO;
+  }
+
+  string oid = ".dir.";
+  oid.append(bucket.marker);
+
+  bufferlist in, out;
+  struct rgw_cls_obj_op call;
+  call.op = op;
+  call.entry.name = name;
+  call.entry.size = size;
+  call.entry.mtime = mtime;
+  call.entry.epoch = epoch;
+  ::encode(call, in);
+  r = io_ctx.exec(oid, "rgw", "bucket_modify", in, out);
+  return r;
+}
+
+int RGWRados::cls_obj_add(rgw_bucket& bucket, uint64_t epoch, string& name, uint64_t size, utime_t& mtime)
+{
+  return cls_obj_op(bucket, CLS_RGW_OP_ADD, epoch, name, size, mtime);
+}
+
+int RGWRados::cls_obj_del(rgw_bucket& bucket, uint64_t epoch, string& name)
+{
+  utime_t mtime;
+  return cls_obj_op(bucket, CLS_RGW_OP_DEL, epoch, name, 0, mtime);
+}
+
+int RGWRados::cls_bucket_list(rgw_bucket& bucket, string start, uint32_t num, map<string, RGWObjEnt>& m)
+{
+  librados::IoCtx io_ctx;
+  int r = open_bucket_ctx(bucket, io_ctx);
+  if (r < 0)
+    return r;
+
+  if (bucket.marker.empty()) {
+    RGW_LOG(0) << "ERROR: empty marker for cls_rgw bucket operation" << dendl;
+    return -EIO;
+  }
+
+  string oid = ".dir.";
+  oid.append(bucket.marker);
+
+  bufferlist in, out;
+  struct rgw_cls_list_op call;
+  call.start_obj = start;
+  call.num_entries = num;
+  ::encode(call, in);
+  r = io_ctx.exec(oid, "rgw", "bucket_list", in, out);
+  if (r < 0)
+    return r;
+
+  struct rgw_cls_list_ret ret;
+  try {
+    bufferlist::iterator iter = out.begin();
+    ::decode(ret, iter);
+  } catch (buffer::error& err) {
+    RGW_LOG(0) << "ERROR: failed to decode bucket_list returned buffer" << dendl;
+    return -EIO;
+  }
+
+  struct rgw_bucket_dir& dir = ret.dir;
+  map<string, struct rgw_bucket_dir_entry>::iterator miter;
+  for (miter = dir.m.begin(); miter != dir.m.end(); ++miter) {
+    RGWObjEnt e;
+    rgw_bucket_dir_entry& dirent = miter->second;
+    e.name = dirent.name;
+    e.size = dirent.size;
+    e.mtime = dirent.mtime;
+    m[e.name] = e;
+  }
+
+  return m.size();
+}
index 3c22f6bf2800f6d9ca030ec9f493f330a265e30b..95393097e023dd261cbd3b280488d522f0adc319 100644 (file)
@@ -276,6 +276,12 @@ public:
   }
 
   int get_bucket_stats(rgw_bucket& bucket, map<string, RGWBucketStats>& stats);
+
+  int cls_obj_op(rgw_bucket& bucket, uint8_t op, uint64_t epoch,
+                 string& name, uint64_t size, utime_t& mtime);
+  int cls_obj_add(rgw_bucket& bucket, uint64_t epoch, string& name, uint64_t size, utime_t& mtime);
+  int cls_obj_del(rgw_bucket& bucket, uint64_t epoch, string& name);
+  int cls_bucket_list(rgw_bucket& bucket, string start, uint32_t num, map<string, RGWObjEnt>& m);
 };
 
 #endif