m->set_connection(this);
if (async_msgr->get_myaddr() == get_peer_addr()) { //loopback connection
- ldout(async_msgr->cct, 20) << __func__ << " " << *m << " local" << dendl;
- Mutex::Locker l(write_lock);
- local_messages.push_back(m);
- center->dispatch_event_external(local_deliver_handler);
- return 0;
+ ldout(async_msgr->cct, 20) << __func__ << " " << *m << " local" << dendl;
+ Mutex::Locker l(write_lock);
+ if (can_write != CLOSED) {
+ local_messages.push_back(m);
+ center->dispatch_event_external(local_deliver_handler);
+ } else {
+ ldout(async_msgr->cct, 10) << __func__ << " loopback connection closed."
+ << " Drop message " << m << dendl;
+ m->put();
+ }
+ return 0;
}
// we don't want to consider local message here, it's too lightweight which