]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados: add get_inconsistent_snapsets() API
authorKefu Chai <kchai@redhat.com>
Sat, 30 Jan 2016 07:51:33 +0000 (15:51 +0800)
committerKefu Chai <kchai@redhat.com>
Thu, 25 Feb 2016 04:41:55 +0000 (12:41 +0800)
Fixes: #13505
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/include/rados/librados.hpp
src/librados/IoCtxImpl.cc
src/librados/IoCtxImpl.h
src/librados/librados.cc
src/osdc/Objecter.cc
src/osdc/Objecter.h

index 765d8cde7821d90612c27c869900780d71ce24aa..0ae84cfe42b9320b65bec1d7d86a9c97b55622bb 100644 (file)
@@ -1222,6 +1222,24 @@ namespace librados
                                  AioCompletion *c,
                                  std::vector<inconsistent_obj_t>* objects,
                                  uint32_t* interval);
+    /**
+     * List the inconsistent snapsets found in a given PG by last scrub
+     *
+     * @param pg the placement group returned by @c pg_list()
+     * @param start_after the first returned @c objects
+     * @param max_return the max number of the returned @c objects
+     * @param c what to do when the operation is complete and safe
+     * @param snapsets [out] the objects where inconsistencies are found
+     * @param interval [in,out] an epoch indicating current interval
+     * @returns if a non-zero @c interval is specified, will return -EAGAIN i
+     *          the current interval begin epoch is different.
+     */
+    int get_inconsistent_snapsets(const PlacementGroup& pg,
+                                  const object_id_t &start_after,
+                                  unsigned max_return,
+                                  AioCompletion *c,
+                                  std::vector<inconsistent_snapset_t>* snapset,
+                                  uint32_t* interval);
 
     /// get/wait for the most recent osdmap
     int wait_for_latest_osdmap();
index 5a984484e923882a167d826e729e9157f5294d67..f5f47b4447537e88a2211880e77718941225206a 100644 (file)
@@ -991,6 +991,25 @@ int librados::IoCtxImpl::get_inconsistent_objects(const pg_t& pg,
   return 0;
 }
 
+int librados::IoCtxImpl::get_inconsistent_snapsets(const pg_t& pg,
+                                                  const librados::object_id_t& start_after,
+                                                  uint64_t max_to_get,
+                                                  AioCompletionImpl *c,
+                                                  std::vector<inconsistent_snapset_t>* snapsets,
+                                                  uint32_t* interval)
+{
+  Context *onack = new C_aio_Ack(c);
+  c->is_read = true;
+  c->io = this;
+
+  ::ObjectOperation op;
+  op.scrub_ls(start_after, max_to_get, snapsets, interval, nullptr);
+  object_locator_t oloc{poolid, pg.ps()};
+  c->tid = objecter->pg_read(oloc.hash, oloc, op, nullptr, CEPH_OSD_FLAG_PGOP, onack,
+                            nullptr, nullptr);
+  return 0;
+}
+
 int librados::IoCtxImpl::tmap_update(const object_t& oid, bufferlist& cmdbl)
 {
   ::ObjectOperation wr;
index 4e0cb0801e5003fffa0fe273bcdb381a3c554679..f0eb2580eec890d6070d46f4ed7eb188f90b3d84 100644 (file)
@@ -213,6 +213,13 @@ struct librados::IoCtxImpl {
                               std::vector<inconsistent_obj_t>* objects,
                               uint32_t* interval);
 
+  int get_inconsistent_snapsets(const pg_t& pg,
+                               const librados::object_id_t& start_after,
+                               uint64_t max_to_get,
+                               AioCompletionImpl *c,
+                               std::vector<inconsistent_snapset_t>* snapsets,
+                               uint32_t* interval);
+
   void set_sync_op_version(version_t ver);
   int watch(const object_t& oid, uint64_t *cookie, librados::WatchCtx *ctx,
            librados::WatchCtx2 *ctx2);
index 5ff38ca4e5604594b6a97828e20f5ca87f48aebb..dc067aaa303be40adf1831e0893e8404655252f8 100644 (file)
@@ -2415,6 +2415,28 @@ int librados::Rados::get_inconsistent_objects(const PlacementGroup& pg,
                                                     interval);
 }
 
+int librados::Rados::get_inconsistent_snapsets(const PlacementGroup& pg,
+                                              const object_id_t &start_after,
+                                              unsigned max_return,
+                                              AioCompletion *c,
+                                              std::vector<inconsistent_snapset_t>* snapsets,
+                                              uint32_t* interval)
+{
+  IoCtx ioctx;
+  const pg_t pgid = pg.impl->pgid;
+  int r = ioctx_create2(pgid.pool(), ioctx);
+  if (r < 0) {
+    return r;
+  }
+
+  return ioctx.io_ctx_impl->get_inconsistent_snapsets(pgid,
+                                                     start_after,
+                                                     max_return,
+                                                     c->pc,
+                                                     snapsets,
+                                                     interval);
+}
+
 int librados::Rados::wait_for_latest_osdmap()
 {
   return client->wait_for_latest_osdmap();
index 598c86aad6f636691d3f6872fa2b6c2941e82eee..56b91e56817dade21438cbf4766d780d3c444d73 100644 (file)
@@ -5026,12 +5026,17 @@ namespace {
     bufferlist bl;
     uint32_t *interval;
     std::vector<inconsistent_obj_t> *objects = nullptr;
+    std::vector<inconsistent_snapset_t> *snapsets = nullptr;
     int *rval;
 
     C_ObjectOperation_scrub_ls(uint32_t *interval,
                               std::vector<inconsistent_obj_t> *objects,
                               int *rval)
       : interval(interval), objects(objects), rval(rval) {}
+    C_ObjectOperation_scrub_ls(uint32_t *interval,
+                              std::vector<inconsistent_snapset_t> *snapsets,
+                              int *rval)
+      : interval(interval), snapsets(snapsets), rval(rval) {}
     void finish(int r) override {
       if (r < 0 && r != -EAGAIN)
        return;
@@ -5050,6 +5055,8 @@ namespace {
       *interval = result.interval;
       if (objects) {
        do_decode(*objects, result.vals);
+      } else {
+       do_decode(*snapsets, result.vals);
       }
     }
   };
@@ -5082,3 +5089,13 @@ void ::ObjectOperation::scrub_ls(const librados::object_id_t& start_after,
   scrub_ls_arg_t arg = {*interval, 0, start_after, max_to_get};
   do_scrub_ls(this, arg, objects, interval, rval);
 }
+
+void ::ObjectOperation::scrub_ls(const librados::object_id_t& start_after,
+                                uint64_t max_to_get,
+                                std::vector<librados::inconsistent_snapset_t> *snapsets,
+                                uint32_t *interval,
+                                int *rval)
+{
+  scrub_ls_arg_t arg = {*interval, 1, start_after, max_to_get};
+  do_scrub_ls(this, arg, snapsets, interval, rval);
+}
index 3e8661ee71ba4e1db7214e7859ccea224256d8b0..21ec53f8263a5a4218aa1a88a5de5afcfc6f3761 100644 (file)
@@ -241,6 +241,11 @@ struct ObjectOperation {
                std::vector<librados::inconsistent_obj_t> *objects,
                uint32_t *interval,
                int *rval);
+  void scrub_ls(const librados::object_id_t& start_after,
+               uint64_t max_to_get,
+               std::vector<librados::inconsistent_snapset_t> *objects,
+               uint32_t *interval,
+               int *rval);
 
   void create(bool excl) {
     OSDOp& o = add_op(CEPH_OSD_OP_CREATE);