]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/net: fix messenger creation
authorYingxin Cheng <yingxincheng@gmail.com>
Thu, 28 Mar 2019 15:07:35 +0000 (23:07 +0800)
committerKefu Chai <kchai@redhat.com>
Fri, 5 Apr 2019 03:21:18 +0000 (11:21 +0800)
sharded data structures should only be allocated in core#0, or the
program will hang during exit.

Signed-off-by: Yingxin Cheng <yingxincheng@gmail.com>
src/crimson/net/Fwd.h

index 8dbb3cabbc65497255dccbde56ae9908bba24835..f47b61dc1c5fb0611b8702e1da62da76cfd166b8 100644 (file)
@@ -40,14 +40,19 @@ class Messenger;
 
 template <typename T, typename... Args>
 seastar::future<T*> create_sharded(Args... args) {
-  auto sharded_obj = seastar::make_lw_shared<seastar::sharded<T>>();
-  return sharded_obj->start(args...).then([sharded_obj]() {
-      auto ret = &sharded_obj->local();
+  // seems we should only construct/stop shards on #0
+  return seastar::smp::submit_to(0, [=] {
+    auto sharded_obj = seastar::make_lw_shared<seastar::sharded<T>>();
+    return sharded_obj->start(args...).then([sharded_obj]() {
       seastar::engine().at_exit([sharded_obj]() {
           return sharded_obj->stop().finally([sharded_obj] {});
         });
-      return ret;
+      return sharded_obj.get();
     });
+  }).then([] (seastar::sharded<T> *ptr_shard) {
+    // return the pointer valid for the caller CPU
+    return &ptr_shard->local();
+  });
 }
 
 } // namespace ceph::net