]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/seastar/tests/unit/sharded_test.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / seastar / tests / unit / sharded_test.cc
index 25266f273ca4cdcc4a4ab24960b620cfe159c786..2b39faee67fec5e161609dac75c29ec60b4b4836 100644 (file)
@@ -59,6 +59,31 @@ public:
     future<int> count_from(int base) const {
         return container().map_reduce0([] (auto& pc) { return 1; }, base, std::plus<int>());
     }
+
+    future<int> count_from_const(int base) const {
+        return container().map_reduce0(&peering_counter::get_1_c, base, std::plus<int>());
+    }
+
+    future<int> count_from_mutate(int base) {
+        return container().map_reduce0(&peering_counter::get_1_m, base, std::plus<int>());
+    }
+
+    future<int> count_const() const {
+        return container().map_reduce(adder<int>(), &peering_counter::get_1_c);
+    }
+
+    future<int> count_mutate() {
+        return container().map_reduce(adder<int>(), &peering_counter::get_1_m);
+    }
+
+private:
+    future<int> get_1_c() const {
+        return make_ready_future<int>(1);
+    }
+
+    future<int> get_1_m() {
+        return make_ready_future<int>(1);
+    }
 };
 
 SEASTAR_THREAD_TEST_CASE(test_const_map_reduces) {
@@ -71,6 +96,17 @@ SEASTAR_THREAD_TEST_CASE(test_const_map_reduces) {
     c.stop().get();
 }
 
+SEASTAR_THREAD_TEST_CASE(test_member_map_reduces) {
+    sharded<peering_counter> c;
+    c.start().get();
+
+    BOOST_REQUIRE_EQUAL(std::as_const(c.local()).count_const().get0(), smp::count);
+    BOOST_REQUIRE_EQUAL(c.local().count_mutate().get0(), smp::count);
+    BOOST_REQUIRE_EQUAL(std::as_const(c.local()).count_from_const(1).get0(), smp::count + 1);
+    BOOST_REQUIRE_EQUAL(c.local().count_from_mutate(1).get0(), smp::count + 1);
+    c.stop().get();
+}
+
 class mydata {
 public:
     int x = 1;
@@ -129,3 +165,39 @@ SEASTAR_THREAD_TEST_CASE(failed_sharded_start_doesnt_hang) {
     seastar::sharded<fail_to_start> s;
     s.start().then_wrapped([] (auto&& fut) { fut.ignore_ready_future(); }).get();
 }
+
+class argument {
+    int _x;
+public:
+    argument() : _x(this_shard_id()) {}
+    int get() const { return _x; }
+};
+
+class service {
+public:
+    void fn_local(argument& arg) {
+        BOOST_REQUIRE_EQUAL(arg.get(), this_shard_id());
+    }
+
+    void fn_sharded(sharded<argument>& arg) {
+        BOOST_REQUIRE_EQUAL(arg.local().get(), this_shard_id());
+    }
+
+    void fn_sharded_param(int arg) {
+        BOOST_REQUIRE_EQUAL(arg, this_shard_id());
+    }
+};
+
+SEASTAR_THREAD_TEST_CASE(invoke_on_all_sharded_arg) {
+    seastar::sharded<service> srv;
+    srv.start().get();
+    seastar::sharded<argument> arg;
+    arg.start().get();
+
+    srv.invoke_on_all(&service::fn_local, std::ref(arg)).get();
+    srv.invoke_on_all(&service::fn_sharded, std::ref(arg)).get();
+    srv.invoke_on_all(&service::fn_sharded_param, sharded_parameter([&arg] { return arg.local().get(); })).get();
+
+    srv.stop().get();
+    arg.stop().get();
+}