]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: add repeat_eagain helper
authorSamuel Just <sjust@redhat.com>
Mon, 25 Jan 2021 21:09:15 +0000 (13:09 -0800)
committerSamuel Just <sjust@redhat.com>
Wed, 24 Feb 2021 02:43:39 +0000 (18:43 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/transaction_manager.h
src/crimson/tools/store-nbd.cc

index 9e08e66437a58d8a1aa4d39de6fc25e916a71ed0..0bfc9d6e2b589f3a86add6d3f5b60d13bf156c3f 100644 (file)
 namespace crimson::os::seastore {
 class Journal;
 
+template <typename F>
+auto repeat_eagain(F &&f) {
+  return seastar::do_with(
+    std::forward<F>(f),
+    [](auto &f) {
+      return crimson::do_until(
+       [&f] {
+         return std::invoke(f
+         ).safe_then([] {
+           return true;
+         }).handle_error(
+           [](const crimson::ct_error::eagain &e) {
+             return seastar::make_ready_future<bool>(false);
+           },
+           crimson::ct_error::pass_further_all{}
+         );
+       });
+    });
+}
+
 /**
  * TransactionManager
  *
index fc0975b153f66d467176447c8c03eee0e93855eb..22b9e987d61f8acde5250a221957249655909e7e 100644 (file)
@@ -530,42 +530,34 @@ public:
     logger().debug("Writing offset {}", offset);
     assert(offset % segment_manager->get_block_size() == 0);
     assert(ptr.length() == (size_t)segment_manager->get_block_size());
-    return crimson::do_until(
-      [this, offset, ptr=std::move(ptr)] {
-       return seastar::do_with(
-         tm->create_transaction(),
-         ptr,
-         [this, offset](auto &t, auto &ptr) mutable {
-           return tm->dec_ref(
+    return repeat_eagain([this, offset, ptr=std::move(ptr)] {
+      return seastar::do_with(
+       tm->create_transaction(),
+       ptr,
+       [this, offset](auto &t, auto &ptr) mutable {
+         return tm->dec_ref(
+           *t,
+           offset
+         ).safe_then([](auto){}).handle_error(
+           crimson::ct_error::enoent::handle([](auto) { return seastar::now(); }),
+           crimson::ct_error::pass_further_all{}
+         ).safe_then([=, &t, &ptr] {
+           logger().debug("dec_ref complete");
+           return tm->alloc_extent<TestBlock>(
              *t,
-             offset
-           ).safe_then([](auto){}).handle_error(
-             crimson::ct_error::enoent::handle([](auto) { return seastar::now(); }),
-             crimson::ct_error::pass_further_all{}
-           ).safe_then([=, &t, &ptr] {
-             logger().debug("dec_ref complete");
-             return tm->alloc_extent<TestBlock>(
-               *t,
-               offset,
-               ptr.length());
-           }).safe_then([=, &t, &ptr](auto ext) mutable {
-             assert(ext->get_laddr() == (size_t)offset);
-             assert(ext->get_bptr().length() == ptr.length());
-             ext->get_bptr().swap(ptr);
-             logger().debug("submitting transaction");
-             return tm->submit_transaction(std::move(t));
-           }).safe_then([] {
-             return true;
-           }).handle_error(
-             [](const crimson::ct_error::eagain &e) {
-               return seastar::make_ready_future<bool>(false);
-             },
-             crimson::ct_error::pass_further_all{}
-           );
+             offset,
+             ptr.length());
+         }).safe_then([=, &t, &ptr](auto ext) mutable {
+           assert(ext->get_laddr() == (size_t)offset);
+           assert(ext->get_bptr().length() == ptr.length());
+           ext->get_bptr().swap(ptr);
+           logger().debug("submitting transaction");
+           return tm->submit_transaction(std::move(t));
          });
-      }).handle_error(
-       crimson::ct_error::assert_all{"store-nbd write"}
-      );
+       });
+    }).handle_error(
+      crimson::ct_error::assert_all{"store-nbd write"}
+    );
   }
 
   seastar::future<bufferlist> read(
@@ -576,41 +568,34 @@ public:
     assert(size % (size_t)segment_manager->get_block_size() == 0);
     auto blptrret = std::make_unique<bufferlist>();
     auto &blret = *blptrret;
-    return crimson::do_until(
-      [=, &blret] {
-       return seastar::do_with(
-         tm->create_transaction(),
-         [=, &blret](auto &t) {
-           return tm->read_extents<TestBlock>(*t, offset, size
-           ).safe_then([=, &blret](auto ext_list) mutable {
-             size_t cur = offset;
-             for (auto &i: ext_list) {
-               if (cur != i.first) {
-                 assert(cur < i.first);
-                 blret.append_zero(i.first - cur);
-                 cur = i.first;
-               }
-               blret.append(i.second->get_bptr());
-               cur += i.second->get_bptr().length();
-             }
-             if (blret.length() != size) {
-               assert(blret.length() < size);
-               blret.append_zero(size - blret.length());
+    return repeat_eagain([=, &blret] {
+      return seastar::do_with(
+       tm->create_transaction(),
+       [=, &blret](auto &t) {
+         return tm->read_extents<TestBlock>(*t, offset, size
+         ).safe_then([=, &blret](auto ext_list) mutable {
+           size_t cur = offset;
+           for (auto &i: ext_list) {
+             if (cur != i.first) {
+               assert(cur < i.first);
+               blret.append_zero(i.first - cur);
+               cur = i.first;
              }
-             return seastar::make_ready_future<bool>(true);
-           }).handle_error(
-             [](const crimson::ct_error::eagain &e) {
-               return seastar::make_ready_future<bool>(false);
-             },
-             crimson::ct_error::pass_further_all{}
-           );
+             blret.append(i.second->get_bptr());
+             cur += i.second->get_bptr().length();
+           }
+           if (blret.length() != size) {
+             assert(blret.length() < size);
+             blret.append_zero(size - blret.length());
+           }
          });
-      }).handle_error(
-       crimson::ct_error::assert_all{"store-nbd read"}
-      ).then([blptrret=std::move(blptrret)]() mutable {
-       logger().debug("read complete");
-       return std::move(*blptrret);
-      });
+       });
+    }).handle_error(
+      crimson::ct_error::assert_all{"store-nbd read"}
+    ).then([blptrret=std::move(blptrret)]() mutable {
+      logger().debug("read complete");
+      return std::move(*blptrret);
+    });
   }
 
   void init() {