In remote_send_thread, if sending a request fails don't take the
request back from the receive queue -- it might already be processed by remote_recv_thread, which lead to crashes like below: (primary) Unable to receive reply header: Connection reset by peer. (primary) Unable to send request (Connection reset by peer): WRITE(954662912, 131072). (primary) Disconnected from kopusha:7772. (primary) Increasing localcnt to 1. (primary) Assertion failed: (old > 0), function refcnt_release, file refcnt.h, line 62. Taking the request back was not necessary (it would properly be processed by the remote_recv_thread) and only complicated things. MFC after: 2 weeks
This commit is contained in:
parent
4d70e06ffc
commit
d685f88bee
@ -1656,18 +1656,9 @@ remote_send_thread(void *arg)
|
||||
"Unable to send request (%s): ",
|
||||
strerror(hio->hio_errors[ncomp]));
|
||||
remote_close(res, ncomp);
|
||||
/*
|
||||
* Take request back from the receive queue and move
|
||||
* it immediately to the done queue.
|
||||
*/
|
||||
mtx_lock(&hio_recv_list_lock[ncomp]);
|
||||
TAILQ_REMOVE(&hio_recv_list[ncomp], hio,
|
||||
hio_next[ncomp]);
|
||||
hio_recv_list_size[ncomp]--;
|
||||
mtx_unlock(&hio_recv_list_lock[ncomp]);
|
||||
goto done_queue;
|
||||
} else {
|
||||
rw_unlock(&hio_remote_lock[ncomp]);
|
||||
}
|
||||
rw_unlock(&hio_remote_lock[ncomp]);
|
||||
nv_free(nv);
|
||||
if (wakeup)
|
||||
cv_signal(&hio_recv_list_cond[ncomp]);
|
||||
|
Loading…
Reference in New Issue
Block a user