]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: load omap header and xattr in parallel
authorKefu Chai <kchai@redhat.com>
Sun, 20 Dec 2020 15:12:31 +0000 (23:12 +0800)
committerKefu Chai <kchai@redhat.com>
Sun, 20 Dec 2020 16:41:44 +0000 (00:41 +0800)
no need to load them sequentially.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/replicated_recovery_backend.cc

index b0fbe097d0162e257258fbec31965393cbb5e684..644c51eb9e12018083acac4d0208bd22c732d504 100644 (file)
@@ -362,26 +362,31 @@ seastar::future<PushOp> ReplicatedRecoveryBackend::build_push_op(
     return [this, &recovery_info, &progress, &new_progress, &oi, &v, pop=&pop] {
       v = recovery_info.version;
       if (progress.first) {
-       return backend->omap_get_header(coll, ghobject_t(recovery_info.soid)).safe_then(
-          [this, &recovery_info, pop](auto bl) {
-         pop->omap_header.claim_append(bl);
-         return store->get_attrs(coll, ghobject_t(recovery_info.soid));
-       }).safe_then([&oi, pop, &new_progress, &v](auto attrs) mutable {
-         for (auto& [key, val] : attrs) {
-           pop->attrset[std::move(key)].push_back(std::move(val));
-         }
-         logger().debug("build_push_op: {}", pop->attrset[OI_ATTR]);
-         oi.decode(pop->attrset[OI_ATTR]);
-         new_progress.first = false;
-         if (v == eversion_t()) {
-           v = oi.version;
-         }
-         return seastar::make_ready_future<>();
-       }, crimson::os::FuturizedStore::read_errorator::all_same_way(
-           [] (const std::error_code& e) {
-           return seastar::make_exception_future<>(e);
-         })
-       );
+        return seastar::when_all_succeed(
+          backend->omap_get_header(coll, ghobject_t(recovery_info.soid)).safe_then(
+            [&pop](auto bl) {
+            pop->omap_header.claim_append(bl);
+          }, crimson::os::FuturizedStore::read_errorator::all_same_way(
+            [] (const std::error_code& e) {
+            return seastar::make_exception_future<>(e);
+          })),
+          store->get_attrs(coll, ghobject_t(recovery_info.soid)).safe_then(
+            [&oi, pop, &v](auto attrs) mutable {
+            for (auto& [key, val] : attrs) {
+              pop->attrset[std::move(key)].push_back(std::move(val));
+            }
+            logger().debug("build_push_op: {}", pop->attrset[OI_ATTR]);
+            oi.decode(pop->attrset[OI_ATTR]);
+            if (v == eversion_t()) {
+              v = oi.version;
+            }
+          }, crimson::os::FuturizedStore::read_errorator::all_same_way(
+            [] (const std::error_code& e) {
+            return seastar::make_exception_future<>(e);
+          }))
+        ).then_unpack([&new_progress] {
+          new_progress.first = false;
+        });
       }
       return seastar::make_ready_future<>();
     }().then([this, &recovery_info, &progress, &new_progress, &available, &pop]() mutable {