]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commit
crimson/common: let errorator's handlers to conditionally forward errors
authorRadosław Zarzyński <rzarzyns@redhat.com>
Wed, 30 Mar 2022 13:02:20 +0000 (15:02 +0200)
committerRadosław Zarzyński <rzarzyns@redhat.com>
Wed, 30 Mar 2022 23:17:16 +0000 (01:17 +0200)
commitfc3d1b2f014794532631f5d4b380ca387721948c
treef593ec2fda74695355ea4a3d4ff00aa9f9dcd9ea
parentc976e67e3a365844ddc661874832f2ea28b6af68
crimson/common: let errorator's handlers to conditionally forward errors

The use case is like the following one:

```diff
diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc
index a96f1b8dd2b..055add2e407 100644
--- a/src/crimson/osd/replicated_recovery_backend.cc
+++ b/src/crimson/osd/replicated_recovery_backend.cc
@@ -516,10 +516,14 @@ ReplicatedRecoveryBackend::read_object_for_push_op(
       recovered_to = push_op->data_included.range_end();
     }
     return seastar::make_ready_future<uint64_t>(recovered_to);
-  }, PGBackend::read_errorator::all_same_way([](auto e) {
+  }, PGBackend::read_errorator::all_same_way([](auto e, auto&& e_raw) -> PGBackend::read_errorator::future<uint64_t> {
     logger().debug("build_push_op: read exception");
-    return seastar::make_exception_future<uint64_t>(e);
-  }));
+    if (42) {
+      return std::move(e_raw);
+    } else {
+      return seastar::make_exception_future<uint64_t>(e);
+    }
+  })).handle_error_interruptible(PGBackend::read_errorator::discard_all{});
 }

 RecoveryBackend::interruptible_future<>
```

Signed-off-by: Radosław Zarzyński <rzarzyns@redhat.com>
src/crimson/common/errorator.h