From c9b593d2d76a196f5d64a39f0c9d2db7979ab89f Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Sat, 30 Jan 2016 15:51:33 +0800 Subject: [PATCH] librados: add get_inconsistent_snapsets() API Fixes: #13505 Signed-off-by: Kefu Chai --- src/include/rados/librados.hpp | 18 ++++++++++++++++++ src/librados/IoCtxImpl.cc | 19 +++++++++++++++++++ src/librados/IoCtxImpl.h | 7 +++++++ src/librados/librados.cc | 22 ++++++++++++++++++++++ src/osdc/Objecter.cc | 17 +++++++++++++++++ src/osdc/Objecter.h | 5 +++++ 6 files changed, 88 insertions(+) diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index 765d8cde7821d..0ae84cfe42b93 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -1222,6 +1222,24 @@ namespace librados AioCompletion *c, std::vector* 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* snapset, + uint32_t* interval); /// get/wait for the most recent osdmap int wait_for_latest_osdmap(); diff --git a/src/librados/IoCtxImpl.cc b/src/librados/IoCtxImpl.cc index 5a984484e9238..f5f47b4447537 100644 --- a/src/librados/IoCtxImpl.cc +++ b/src/librados/IoCtxImpl.cc @@ -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* 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; diff --git a/src/librados/IoCtxImpl.h b/src/librados/IoCtxImpl.h index 4e0cb0801e500..f0eb2580eec89 100644 --- a/src/librados/IoCtxImpl.h +++ b/src/librados/IoCtxImpl.h @@ -213,6 +213,13 @@ struct librados::IoCtxImpl { std::vector* 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* 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); diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 5ff38ca4e5604..dc067aaa303be 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -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* 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(); diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 598c86aad6f63..56b91e56817da 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -5026,12 +5026,17 @@ namespace { bufferlist bl; uint32_t *interval; std::vector *objects = nullptr; + std::vector *snapsets = nullptr; int *rval; C_ObjectOperation_scrub_ls(uint32_t *interval, std::vector *objects, int *rval) : interval(interval), objects(objects), rval(rval) {} + C_ObjectOperation_scrub_ls(uint32_t *interval, + std::vector *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 *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); +} diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 3e8661ee71ba4..21ec53f8263a5 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -241,6 +241,11 @@ struct ObjectOperation { std::vector *objects, uint32_t *interval, int *rval); + void scrub_ls(const librados::object_id_t& start_after, + uint64_t max_to_get, + std::vector *objects, + uint32_t *interval, + int *rval); void create(bool excl) { OSDOp& o = add_op(CEPH_OSD_OP_CREATE); -- 2.39.5