]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson: bring discard_all{} to errorator.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 9 Sep 2019 11:28:50 +0000 (13:28 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 20 Nov 2019 19:35:15 +0000 (20:35 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/common/errorator.h

index dc20887f1cc1678d3305302b25d3bf9380365183..3a639c2a7ba1a271b2787895e9735078f288fc9f 100644 (file)
@@ -96,6 +96,12 @@ struct errorator {
           // `report_failed_future()` during `operator=()`.
           std::move(result).get_exception();
           result = std::forward<ErrorVisitorT>(errfunc)(e);
+        } else {
+          constexpr bool explicitly_discarded = std::is_invocable_r<
+            struct ignore_marker_t&&, ErrorVisitorT, decltype(e)>::value;
+          if constexpr (!explicitly_discarded) {
+            result = std::forward<ErrorVisitorT>(errfunc)(e);
+          }
         }
       }
 
@@ -278,7 +284,18 @@ struct errorator {
     }
   };
 
+  struct discard_all {
+    template <_impl::ct_error ErrorV>
+    auto operator()(const unthrowable_wrapper<ErrorV>& e) {
+      static_assert((... || (e == WrappedAllowedErrorsT::instance)),
+                    "discarding disallowed ct_error");
+      return ignore_marker_t{};
+    }
+  };
+
 private:
+  struct ignore_marker_t{};
+
   template <class... Args>
   static decltype(auto) plainify(seastar::future<Args...>&& fut) {
     return std::forward<seastar::future<Args...>>(fut);