mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-21 13:51:26 +02:00
BUG/MEDIUM: stream: Keep FLT_END analyzers if a stream detects a channel error
If a channel error (READ_ERRO|READ_TIMEOUT|WRITE_ERROR|WRITE_TIMEOUT) is detected by the stream, in process_stream(), FLT_END analyers must be preserved. It is important to be sure to ends filter analysis and be able to release the stream. First, filters may release some ressources when FLT_END analyzers are called. Then, the CF_FL_ANALYZE flag is used to sync end of analysis for the request and the response. If FLT_END analyzer is ignored on a channel, this may block the other side and freeze the stream. This patch must be backported to all stable versions
This commit is contained in:
parent
8abed17a34
commit
813f913444
@ -2008,7 +2008,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
|
|||||||
if (unlikely(!(s->flags & SF_ERR_MASK))) {
|
if (unlikely(!(s->flags & SF_ERR_MASK))) {
|
||||||
if (req->flags & (CF_READ_ERROR|CF_READ_TIMEOUT|CF_WRITE_ERROR|CF_WRITE_TIMEOUT)) {
|
if (req->flags & (CF_READ_ERROR|CF_READ_TIMEOUT|CF_WRITE_ERROR|CF_WRITE_TIMEOUT)) {
|
||||||
/* Report it if the client got an error or a read timeout expired */
|
/* Report it if the client got an error or a read timeout expired */
|
||||||
req->analysers = 0;
|
req->analysers &= AN_REQ_FLT_END;
|
||||||
if (req->flags & CF_READ_ERROR) {
|
if (req->flags & CF_READ_ERROR) {
|
||||||
_HA_ATOMIC_INC(&s->be->be_counters.cli_aborts);
|
_HA_ATOMIC_INC(&s->be->be_counters.cli_aborts);
|
||||||
_HA_ATOMIC_INC(&sess->fe->fe_counters.cli_aborts);
|
_HA_ATOMIC_INC(&sess->fe->fe_counters.cli_aborts);
|
||||||
@ -2062,7 +2062,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
|
|||||||
}
|
}
|
||||||
else if (res->flags & (CF_READ_ERROR|CF_READ_TIMEOUT|CF_WRITE_ERROR|CF_WRITE_TIMEOUT)) {
|
else if (res->flags & (CF_READ_ERROR|CF_READ_TIMEOUT|CF_WRITE_ERROR|CF_WRITE_TIMEOUT)) {
|
||||||
/* Report it if the server got an error or a read timeout expired */
|
/* Report it if the server got an error or a read timeout expired */
|
||||||
res->analysers = 0;
|
res->analysers &= AN_RES_FLT_END;
|
||||||
if (res->flags & CF_READ_ERROR) {
|
if (res->flags & CF_READ_ERROR) {
|
||||||
_HA_ATOMIC_INC(&s->be->be_counters.srv_aborts);
|
_HA_ATOMIC_INC(&s->be->be_counters.srv_aborts);
|
||||||
_HA_ATOMIC_INC(&sess->fe->fe_counters.srv_aborts);
|
_HA_ATOMIC_INC(&sess->fe->fe_counters.srv_aborts);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user