msgr: don't queue message on closed pipe

If we have a con that refs a pipe but it is closed, don't use it.  If
the ref is still there, it is only because we are racing with fault()
and it is about to (or just was) be detached.  Either way,

Signed-off-by: Sage Weil <sage@inktank.com>
This commit is contained in:
Sage Weil 2012-12-23 09:19:05 -08:00
parent 7bf0b0854d
commit 6339c5d439
2 changed files with 11 additions and 8 deletions

View File

@ -243,11 +243,6 @@ class DispatchQueue;
}
void stop();
void send(Message *m) {
pipe_lock.Lock();
_send(m);
pipe_lock.Unlock();
}
void _send(Message *m) {
out_q[m->get_priority()].push_back(m);
cond.Signal();

View File

@ -397,10 +397,18 @@ void SimpleMessenger::submit_message(Message *m, Connection *con,
return;
}
if (pipe) {
ldout(cct,20) << "submit_message " << *m << " remote, " << dest_addr << ", have pipe." << dendl;
pipe->send(m);
pipe->pipe_lock.Lock();
if (pipe->state != Pipe::STATE_CLOSED) {
ldout(cct,20) << "submit_message " << *m << " remote, " << dest_addr << ", have pipe." << dendl;
pipe->_send(m);
pipe->pipe_lock.Unlock();
pipe->put();
return;
}
pipe->pipe_lock.Unlock();
pipe->put();
return;
ldout(cct,20) << "submit_message " << *m << " remote, " << dest_addr
<< ", had pipe " << pipe << ", but it closed." << dendl;
}
}