]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/ertr: let ErrVisitorT return plain value if ValueFuncT returns seastar::future
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 22 Nov 2022 16:03:42 +0000 (16:03 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 28 Feb 2023 16:22:04 +0000 (16:22 +0000)
The following corner case was unsupported till now:

```cpp
  return os->omap_get_values(
    ch, hoid, keys
  ).safe_then([] (FuturizedStore::omap_values_t&& vals) {
    return 0;
  }, FuturizedStore::read_errorator::all_same_way([] (auto&) {
    return -1;
  })).get();
```
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/common/errorator.h

index 33583983c011763a4edd1239599fba5c243a66a9..705a9f05210ce271efde83cb49f35ac2d362eedd 100644 (file)
@@ -335,6 +335,13 @@ public:
         // to throwing an exception by the handler.
         std::invoke(std::forward<ErrorVisitorT>(errfunc),
                     ErrorT::error_t::from_exception_ptr(std::move(ep)));
+      } else if constexpr (seastar::Future<decltype(result)>) {
+        // result is seastar::future but return_t is e.g. int. If so,
+        // the else clause cannot be used as seastar::future lacks
+        // errorator_type member.
+        result = seastar::make_ready_future<return_t>(
+          std::invoke(std::forward<ErrorVisitorT>(errfunc),
+                      ErrorT::error_t::from_exception_ptr(std::move(ep))));
       } else {
         result = FuturatorT::type::errorator_type::template make_ready_future<return_t>(
           std::invoke(std::forward<ErrorVisitorT>(errfunc),