]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
objclass: add methods to get keys without values, and set multiple values
authorJosh Durgin <josh.durgin@inktank.com>
Sun, 3 Jun 2012 10:42:43 +0000 (03:42 -0700)
committerJosh Durgin <josh.durgin@inktank.com>
Fri, 8 Jun 2012 21:31:49 +0000 (14:31 -0700)
These will be useful in the new rbd header format. This brings the
API into parity with the available OSD ops for omaps.

Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
src/objclass/class_api.cc
src/objclass/objclass.h

index 6220484c890eb0fbae7c4b2a4b2d265caa2a9b65..e5db43d27d47eb884abf3368bc1a04c137ec7712 100644 (file)
@@ -282,6 +282,32 @@ int cls_cxx_map_get_all_vals(cls_method_context_t hctx, map<string, bufferlist>*
   return vals->size();
 }
 
+int cls_cxx_map_get_keys(cls_method_context_t hctx, const string &start_obj,
+                        uint64_t max_to_get, set<string> *keys)
+{
+  ReplicatedPG::OpContext **pctx = (ReplicatedPG::OpContext **)hctx;
+  vector<OSDOp> ops(1);
+  OSDOp& op = ops[0];
+  int ret;
+
+  ::encode(start_obj, op.indata);
+  ::encode(max_to_get, op.indata);
+
+  op.op.op = CEPH_OSD_OP_OMAPGETKEYS;
+
+  ret = (*pctx)->pg->do_osd_ops(*pctx, ops);
+  if (ret < 0)
+    return ret;
+
+  bufferlist::iterator iter = op.outdata.begin();
+  try {
+    ::decode(*keys, iter);
+  } catch (buffer::error& err) {
+    return -EIO;
+  }
+  return keys->size();
+}
+
 int cls_cxx_map_get_vals(cls_method_context_t hctx, const string &start_obj,
                         const string &filter_prefix, uint64_t max_to_get,
                         map<string, bufferlist> *vals)
@@ -378,6 +404,20 @@ int cls_cxx_map_set_val(cls_method_context_t hctx, const string &key,
   return (*pctx)->pg->do_osd_ops(*pctx, ops);
 }
 
+int cls_cxx_map_set_vals(cls_method_context_t hctx,
+                        std::map<string, bufferlist> *map)
+{
+  ReplicatedPG::OpContext **pctx = (ReplicatedPG::OpContext **)hctx;
+  vector<OSDOp> ops(1);
+  OSDOp& op = ops[0];
+  bufferlist& update_bl = op.indata;
+  ::encode(*map, update_bl);
+
+  op.op.op = CEPH_OSD_OP_OMAPSETVALS;
+
+  return (*pctx)->pg->do_osd_ops(*pctx, ops);
+}
+
 int cls_cxx_map_clear(cls_method_context_t hctx)
 {
   ReplicatedPG::OpContext **pctx = (ReplicatedPG::OpContext **)hctx;
index 64293a708dc07d9334fdd07c4d1b25e5da2a395c..5d25077c81219dc75b3c3ca21a1615007d22a5d3 100644 (file)
@@ -100,6 +100,10 @@ extern int cls_cxx_snap_revert(cls_method_context_t hctx, snapid_t snapid);
 extern int cls_cxx_map_clear(cls_method_context_t hctx);
 extern int cls_cxx_map_get_all_vals(cls_method_context_t hctx,
                                     std::map<string, bufferlist> *vals);
+extern int cls_cxx_map_get_keys(cls_method_context_t hctx,
+                                const string &start_after,
+                                uint64_t max_to_get,
+                                std::set<string> *keys);
 extern int cls_cxx_map_get_vals(cls_method_context_t hctx,
                                 const string &start_after,
                                 const string &filter_prefix,
@@ -110,6 +114,8 @@ extern int cls_cxx_map_get_val(cls_method_context_t hctx,
                                const string &key, bufferlist *outbl);
 extern int cls_cxx_map_set_val(cls_method_context_t hctx,
                                const string &key, bufferlist *inbl);
+extern int cls_cxx_map_set_vals(cls_method_context_t hctx,
+                                std::map<string, bufferlist> *map);
 extern int cls_cxx_map_write_header(cls_method_context_t hctx, bufferlist *inbl);
 extern int cls_cxx_map_remove_key(cls_method_context_t hctx, const string &key);
 extern int cls_cxx_map_update(cls_method_context_t hctx, bufferlist *inbl);