assert(seastar::this_shard_id() == PRIMARY_CORE);
bool dispatched = true;
gate.dispatch_in_background(__func__, *this, [this, conn=std::move(conn),
- m=std::move(m), &dispatched] {
+ m=std::move(m), &dispatched]() mutable {
switch (m->get_type()) {
case CEPH_MSG_OSD_MAP:
case CEPH_MSG_OSD_OP:
case MSG_OSD_PG_UPDATE_LOG_MISSING:
case MSG_OSD_PG_UPDATE_LOG_MISSING_REPLY:
{
- return shard_dispatchers.invoke_on(0,
- [conn, m = std::move(m)]
- (auto &local_dispatcher) mutable ->seastar::future<>{
- return local_dispatcher.ms_dispatch(std::move(conn), m);
+ return conn.get_foreign().then([this, m = std::move(m)](auto f_conn) {
+ return shard_dispatchers.invoke_on(PRIMARY_CORE,
+ [f_conn = std::move(f_conn), m = std::move(m)]
+ (auto &local_dispatcher) mutable ->seastar::future<>{
+ return local_dispatcher.ms_dispatch(std::move(f_conn), std::move(m));
+ });
});
}
default:
seastar::future<>
OSD::ShardDispatcher::ms_dispatch(
- crimson::net::ConnectionRef conn,
+ crimson::net::ConnectionFRef f_conn,
MessageRef m)
{
+ crimson::net::ConnectionRef conn = make_local_shared_foreign(std::move(f_conn));
if (pg_shard_manager.is_stopping()) {
return seastar::now();
}