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) {
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;
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();
+}