]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: dissect pg listing implementation from OpsExecuter.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 13 Aug 2019 12:59:51 +0000 (14:59 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Sat, 24 Aug 2019 01:34:00 +0000 (03:34 +0200)
Additionally improve const-correctness for PGBackend.

Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/ops_executer.h
src/crimson/osd/pg.h

index 0ddfbd550db78defbea55674976c3760f4b59f2d..56065d38b1bf41e7ea48adaf53707cd4a0cb39b2 100644 (file)
@@ -161,7 +161,7 @@ static inline std::unique_ptr<const PGLSFilter> get_pgls_filter(
 
 static seastar::future<bool, hobject_t> pgls_filter(
   const PGLSFilter& filter,
-  PGBackend& backend,
+  const PGBackend& backend,
   const hobject_t& sobj)
 {
   if (const auto xattr = filter.get_xattr(); !xattr.empty()) {
@@ -190,7 +190,7 @@ static seastar::future<bool, hobject_t> pgls_filter(
 static seastar::future<ceph::bufferlist> do_pgnls_common(
   const hobject_t& pg_start,
   const hobject_t& pg_end,
-  PGBackend& backend,
+  const PGBackend& backend,
   const hobject_t& lower_bound,
   const std::string& nspace,
   const uint64_t limit,
@@ -268,7 +268,10 @@ static seastar::future<ceph::bufferlist> do_pgnls_common(
   });
 }
 
-seastar::future<> OpsExecuter::do_pgnls(OSDOp& osd_op)
+static seastar::future<> do_pgnls(
+  const PG& pg,
+  const std::string& nspace,
+  OSDOp& osd_op)
 {
   hobject_t lower_bound;
   try {
@@ -279,14 +282,23 @@ seastar::future<> OpsExecuter::do_pgnls(OSDOp& osd_op)
   const auto pg_start = pg.get_pgid().pgid.get_hobj_start();
   const auto pg_end = \
     pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num());
-  return do_pgnls_common(pg_start, pg_end, backend, lower_bound, os->oi.soid.get_namespace(), osd_op.op.pgls.count, nullptr /* no filter */)
+  return do_pgnls_common(pg_start,
+                         pg_end,
+                         pg.get_backend(),
+                         lower_bound,
+                         nspace,
+                         osd_op.op.pgls.count,
+                         nullptr /* no filter */)
     .then([&osd_op](bufferlist bl) {
       osd_op.outdata = std::move(bl);
       return seastar::now();
   });
 }
 
-seastar::future<> OpsExecuter::do_pgnls_filtered(OSDOp& osd_op)
+static seastar::future<> do_pgnls_filtered(
+  const PG& pg,
+  const std::string& nspace,
+  OSDOp& osd_op)
 {
   std::string cname, mname, type;
   auto bp = osd_op.indata.cbegin();
@@ -311,12 +323,16 @@ seastar::future<> OpsExecuter::do_pgnls_filtered(OSDOp& osd_op)
                  __func__, cname, mname, type, lower_bound,
                  static_cast<const void*>(filter.get()));
   return seastar::do_with(std::move(filter),
-    [this, &osd_op, lower_bound=std::move(lower_bound)](auto&& filter) {
+    [&, lower_bound=std::move(lower_bound)](auto&& filter) {
       const auto pg_start = pg.get_pgid().pgid.get_hobj_start();
-      const auto pg_end = \
-        pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num());
-      return do_pgnls_common(pg_start, pg_end, backend, lower_bound, os->oi.soid.get_namespace(),
-                             osd_op.op.pgls.count, filter.get())
+      const auto pg_end = pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num());
+      return do_pgnls_common(pg_start,
+                             pg_end,
+                             pg.get_backend(),
+                             lower_bound,
+                             nspace,
+                             osd_op.op.pgls.count,
+                             filter.get())
         .then([&osd_op](bufferlist bl) {
           osd_op.outdata = std::move(bl);
           return seastar::now();
@@ -367,9 +383,13 @@ OpsExecuter::do_osd_op(OSDOp& osd_op)
       return backend.setxattr(os, osd_op, txn);
     });
   case CEPH_OSD_OP_PGNLS_FILTER:
-     return do_pgnls_filtered(osd_op);
+    return do_pg_op([&osd_op] (const auto& pg, const auto& nspace) {
+      return do_pgnls_filtered(pg, nspace, osd_op);
+    });
   case CEPH_OSD_OP_PGNLS:
-    return do_pgnls(osd_op);
+    return do_pg_op([&osd_op] (const auto& pg, const auto& nspace) {
+      return do_pgnls(pg, nspace, osd_op);
+    });
   case CEPH_OSD_OP_DELETE:
     return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
       return backend.remove(os, txn);
index d8c66dc7900443f145d3015e5de8c355b688c4b2..3e8564570dfcb1cd7b2c3fb096fd65cdbc5681b0 100644 (file)
@@ -39,22 +39,19 @@ class OpsExecuter {
   size_t num_read = 0;    ///< count read ops
   size_t num_write = 0;   ///< count update ops
 
-  seastar::future<> do_pgnls(OSDOp& osd_op);
-  seastar::future<> do_pgnls_filtered(OSDOp& osd_op);
-
   seastar::future<> do_op_call(class OSDOp& osd_op);
 
   template <class Func>
   auto do_const_op(Func&& f) {
     // TODO: pass backend as read-only
-    return std::forward<Func>(f)(backend, const_cast<const ObjectState&>(*os));
+    return std::forward<Func>(f)(backend, std::as_const(*os));
   }
 
   template <class Func>
   auto do_read_op(Func&& f) {
     ++num_read;
     // TODO: pass backend as read-only
-    return std::forward<Func>(f)(backend, const_cast<const ObjectState&>(*os));
+    return do_const_op(std::forward<Func>(f));
   }
 
   template <class Func>
@@ -63,6 +60,13 @@ class OpsExecuter {
     return std::forward<Func>(f)(backend, *os, txn);
   }
 
+  // PG operations are being provided with pg instead of os.
+  template <class Func>
+  auto do_pg_op(Func&& f) {
+    return std::forward<Func>(f)(std::as_const(pg),
+                                 std::as_const(os->oi.soid.get_namespace()));
+  }
+
 public:
   OpsExecuter(PGBackend::cached_os_t os, PG& pg)
     : os(std::move(os)), pg(pg), backend(pg.get_backend()) {
index dbf9df18cbb3b00a6baca144a45561bd4bf50133..542cb7912a3237a6731d146a85d08f0703294021 100644 (file)
@@ -84,6 +84,9 @@ public:
   PGBackend& get_backend() {
     return *backend;
   }
+  const PGBackend& get_backend() const {
+    return *backend;
+  }
 
   // EpochSource
   epoch_t get_osdmap_epoch() const final {