BUG/MEDIUM: stream-int: convert some co_data() checks to channel_is_empty()

Splicing was in great part broken over the last few development version
due to the use of co_data() to detect if data are available in the channel.
But co_data() only looks at buffered data, not spliced data.

Channel_is_empty() takes care of both and should be used. With this,
splicing restarts to work but there are still a few cases where transfers
may stall.

No backport is needed.
This commit is contained in:
Willy Tarreau 2018-11-12 18:48:52 +01:00
parent f26c26cca2
commit 691fe39284
1 changed files with 4 additions and 4 deletions

View File

@ -700,7 +700,7 @@ int si_cs_send(struct conn_stream *cs)
} }
} }
/* We couldn't send all of our data, let the mux know we'd like to send more */ /* We couldn't send all of our data, let the mux know we'd like to send more */
if (co_data(oc)) if (!channel_is_empty(oc))
conn->mux->subscribe(cs, SUB_CAN_SEND, &si->wait_event); conn->mux->subscribe(cs, SUB_CAN_SEND, &si->wait_event);
return did_send; return did_send;
} }
@ -719,7 +719,7 @@ struct task *si_cs_io_cb(struct task *t, void *ctx, unsigned short state)
if (!cs) if (!cs)
return NULL; return NULL;
if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && co_data(si_oc(si))) if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && !channel_is_empty(si_oc(si)))
ret = si_cs_send(cs); ret = si_cs_send(cs);
if (!(si->wait_event.wait_reason & SUB_CAN_RECV)) { if (!(si->wait_event.wait_reason & SUB_CAN_RECV)) {
ret |= si_cs_recv(cs); ret |= si_cs_recv(cs);
@ -747,7 +747,7 @@ void stream_int_update(struct stream_interface *si)
if (!(ic->flags & CF_SHUTR)) { if (!(ic->flags & CF_SHUTR)) {
/* Read not closed, update FD status and timeout for reads */ /* Read not closed, update FD status and timeout for reads */
if ((ic->flags & CF_DONT_READ) || co_data(ic)) { if ((ic->flags & CF_DONT_READ) || !channel_is_empty(ic)) {
/* stop reading, imposed by channel's policy or contents */ /* stop reading, imposed by channel's policy or contents */
si_cant_put(si); si_cant_put(si);
ic->rex = TICK_ETERNITY; ic->rex = TICK_ETERNITY;
@ -1022,7 +1022,7 @@ static void stream_int_chk_snd_conn(struct stream_interface *si)
!(si->flags & SI_FL_WAIT_DATA)) /* not waiting for data */ !(si->flags & SI_FL_WAIT_DATA)) /* not waiting for data */
return; return;
if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && co_data(si_oc(si))) if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && !channel_is_empty(si_oc(si)))
si_cs_send(cs); si_cs_send(cs);
if (cs->flags & CS_FL_ERROR || cs->conn->flags & CO_FL_ERROR) { if (cs->flags & CS_FL_ERROR || cs->conn->flags & CO_FL_ERROR) {