]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG,librados: add filter_prefix to omap_get_vals
authorSamuel Just <rexludorum@gmail.com>
Wed, 7 Mar 2012 21:08:36 +0000 (13:08 -0800)
committerSamuel Just <rexludorum@gmail.com>
Thu, 8 Mar 2012 01:20:23 +0000 (17:20 -0800)
Signed-off-by: Samuel Just <rexludorum@gmail.com>
src/include/rados/librados.hpp
src/leveldb
src/librados.cc
src/osd/ReplicatedPG.cc
src/osdc/Objecter.h
src/test/rados-api/aio.cc

index 2309343652de10594cd4cd85ab41dc5d22f7892f..15a376c04ab356a6a1b06339f381c351bc3c6ff1 100644 (file)
@@ -236,6 +236,24 @@ namespace librados
       std::map<std::string, bufferlist> *out_vals,
       int *prval);
 
+    /**
+     * omap_get_vals: keys and values from the object omap
+     *
+     * Get up to max_return keys and values beginning after start_after
+     *
+     * @param start_after [in] list no keys smaller than start_after
+     * @param filter_prefix [in] list only keys beginning with filter_prefix
+     * @parem max_return [in] list no more than max_return key/value pairs
+     * @param out_vals [out] place returned values in out_vals on completion
+     * @param prval [out] place error code in prval upon completion
+     */
+    void omap_get_vals(
+      const std::string &start_after,
+      const std::string &filter_prefix,
+      uint64_t max_return,
+      std::map<std::string, bufferlist> *out_vals,
+      int *prval);
+
 
     /**
      * omap_get_keys: keys from the object omap
index 8b5ada5c89c0fc34b3c277337d9b3f2c6f1fb85d..08c39ee222de6c07f94724bcd61d33573e2f873a 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 8b5ada5c89c0fc34b3c277337d9b3f2c6f1fb85d
+Subproject commit 08c39ee222de6c07f94724bcd61d33573e2f873a
index b8fc434f02c8fb402d2f981ff0920d9d26e98fcc..88fcc2cd380673935fb8dfe9c636b31c6339887c 100644 (file)
@@ -214,12 +214,23 @@ void librados::ObjectReadOperation::getxattr(const char *name, bufferlist *pbl,
 
 void librados::ObjectReadOperation::omap_get_vals(
   const std::string &start_after,
+  const std::string &filter_prefix,
   uint64_t max_return,
   std::map<std::string, bufferlist> *out_vals,
   int *prval)
 {
   ::ObjectOperation *o = (::ObjectOperation *)impl;
-  o->omap_get_vals(start_after, max_return, out_vals, prval);
+  o->omap_get_vals(start_after, filter_prefix, max_return, out_vals, prval);
+}
+
+void librados::ObjectReadOperation::omap_get_vals(
+  const std::string &start_after,
+  uint64_t max_return,
+  std::map<std::string, bufferlist> *out_vals,
+  int *prval)
+{
+  ::ObjectOperation *o = (::ObjectOperation *)impl;
+  o->omap_get_vals(start_after, "", max_return, out_vals, prval);
 }
 
 void librados::ObjectReadOperation::omap_get_keys(
index fd7e8ed46742cc7596767a7e232579d0671550f3..bd278f3f003773cd9f6fa3f2129419ab034b4b1a 100644 (file)
@@ -2456,8 +2456,10 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
       {
        string start_after;
        uint64_t max_return;
+       string filter_prefix;
        ::decode(start_after, bp);
        ::decode(max_return, bp);
+       ::decode(filter_prefix, bp);
        map<string, bufferlist> out_set;
 
        if (oi.uses_tmap && g_conf->osd_auto_upgrade_tmap) {
@@ -2468,8 +2470,10 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
          int r = _get_tmap(ctx, &vals, &header);
          if (r == 0) {
            map<string, bufferlist>::iterator iter = vals.upper_bound(start_after);
+           if (filter_prefix > start_after) iter = vals.lower_bound(filter_prefix);
            for (uint64_t i = 0;
-                i < max_return && iter != vals.end();
+                i < max_return && iter != vals.end() &&
+                  iter->first.substr(0, filter_prefix.size()) == filter_prefix;
                 ++i, iter++) {
              out_set.insert(*iter);
            }
@@ -2486,8 +2490,10 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
            );
          assert(iter);
          iter->upper_bound(start_after);
+         if (filter_prefix >= start_after) iter->lower_bound(filter_prefix);
          for (uint64_t i = 0;
-              i < max_return && iter->valid();
+              i < max_return && iter->valid() &&
+                iter->key().substr(0, filter_prefix.size()) == filter_prefix;
               ++i, iter->next()) {
            dout(20) << "Found key " << iter->key() << dendl;
            out_set.insert(make_pair(iter->key(), iter->value()));
index 2b3b8a323762e97f11c2656416a1ab7cacf2f83c..bad08582020fd8a9d28b1af449c5eabb1e6de0bf 100644 (file)
@@ -383,6 +383,7 @@ struct ObjectOperation {
   }
 
   void omap_get_vals(const string &start_after,
+                    const string &filter_prefix,
                     uint64_t max_to_get,
                     std::map<std::string, bufferlist> *out_set,
                     int *prval) {
@@ -390,6 +391,7 @@ struct ObjectOperation {
     bufferlist bl;
     ::encode(start_after, bl);
     ::encode(max_to_get, bl);
+    ::encode(filter_prefix, bl);
     op.op.extent.offset = 0;
     op.op.extent.length = bl.length();
     op.indata.claim_append(bl);
index d42210458e4d45bf7bb0b68714128cd25ec6626c..4c605600aa7280f7cfc666219958a73730f71693 100644 (file)
@@ -715,7 +715,7 @@ TEST(LibRadosAio, OmapPP) {
     string val = "bar";
     to_set["foo"] = header_to_set;
     to_set["foo2"] = header_to_set;
-    to_set["foo3"] = header_to_set;
+    to_set["qfoo3"] = header_to_set;
     op.omap_set(to_set);
 
     op.omap_set_header(header_to_set);
@@ -737,17 +737,21 @@ TEST(LibRadosAio, OmapPP) {
     set<string> to_get;
     map<string, bufferlist> got3;
 
+    map<string, bufferlist> got4;
+
     bufferlist header;
 
     op.omap_get_keys("", 1, &set_got, 0);
     op.omap_get_vals("foo", 1, &map_got, 0);
 
     to_get.insert("foo");
-    to_get.insert("foo3");
+    to_get.insert("qfoo3");
     op.omap_get_vals_by_key(to_get, &got3, 0);
 
     op.omap_get_header(&header, 0);
 
+               op.omap_get_vals("foo2", "q", 1, &got4, 0);
+
     ioctx.aio_operate("test_obj", my_completion.get(), &op, 0);
     {
       TestAlarm alarm;
@@ -761,7 +765,9 @@ TEST(LibRadosAio, OmapPP) {
     ASSERT_EQ(map_got.begin()->first, "foo2");
     ASSERT_EQ(got3.size(), (unsigned)2);
     ASSERT_EQ(got3.begin()->first, "foo");
-    ASSERT_EQ(got3.rbegin()->first, "foo3");
+    ASSERT_EQ(got3.rbegin()->first, "qfoo3");
+    ASSERT_EQ(got4.size(), (unsigned)1);
+    ASSERT_EQ(got4.begin()->first, "qfoo3");
   }
 
   {