Thanks, verified both in the trivial test case and on a production server, now seems to work as before.
- Finn Arne On Mon, Feb 24, 2014 at 2:56 PM, Willy Tarreau <[email protected]> wrote: > Hi Finn Arne, > > On Mon, Feb 24, 2014 at 01:44:46PM +0100, Finn Arne Gangstad wrote: > > For clients that are keeping their connection open, 503 replies from > > haproxy seem to be silenced. The connection is just closed without > sending > > the 503 reply, if an earlier request has already been served on the same > > connection. > > > > git bisect tells me this appeared in > > 6b726adb35d998eb55671c0d98ef889cb9fd64ab, MEDIUM: http: do not report > > connection errors for second and further requests > > > > This kills haproxy in all our production setups since we base pretty much > > all monitoring and small time static file serving on empty haproxy > backends > > with more or less clever 503 error files. As far as I can see, none of > the > > clients (will) retry the request. > > Indeed, I forgot about this usage... I think that we'll really need the > return directive to get rid of this definitely. > > Anyway, could you please try with the following patch ? It limits > the test to errors resulting from a reuse of the *same* server-side > connection, which does not happen when you "abuse" the 503 to return > static contents. Normally it should be OK. > > I'm waiting for your confirmation before merging it. > > Thanks, > Willy > > diff --git a/include/types/session.h b/include/types/session.h > index 9b5a5bf..02772a8 100644 > --- a/include/types/session.h > +++ b/include/types/session.h > @@ -89,6 +89,7 @@ > #define SN_IGNORE_PRST 0x00080000 /* ignore persistence */ > > #define SN_COMP_READY 0x00100000 /* the compression is initialized > */ > +#define SN_SRV_REUSED 0x00200000 /* the server-side connection was > reused */ > > /* WARNING: if new fields are added, they must be initialized in > session_accept() > * and freed in session_free() ! > diff --git a/src/backend.c b/src/backend.c > index e561919..4d0dda1 100644 > --- a/src/backend.c > +++ b/src/backend.c > @@ -1072,6 +1072,7 @@ int connect_server(struct session *s) > else { > /* the connection is being reused, just re-attach it */ > si_attach_conn(s->req->cons, srv_conn); > + s->flags |= SN_SRV_REUSED; > } > > /* flag for logging source ip/port */ > diff --git a/src/proto_http.c b/src/proto_http.c > index 1f31dd0..ceae4b9 100644 > --- a/src/proto_http.c > +++ b/src/proto_http.c > @@ -992,7 +992,7 @@ void http_return_srv_error(struct session *s, struct > stream_interface *si) > http_error_message(s, HTTP_ERR_503)); > else if (err_type & SI_ET_CONN_ERR) > http_server_error(s, si, SN_ERR_SRVCL, SN_FINST_C, > - 503, (s->txn.flags & TX_NOT_FIRST) ? > NULL : > + 503, (s->flags & SN_SRV_REUSED) ? NULL : > http_error_message(s, HTTP_ERR_503)); > else if (err_type & SI_ET_CONN_RES) > http_server_error(s, si, SN_ERR_RESOURCE, SN_FINST_C, > @@ -4461,7 +4461,7 @@ void http_end_txn_clean_session(struct session *s) > s->req->flags &= > ~(CF_SHUTW|CF_SHUTW_NOW|CF_AUTO_CONNECT|CF_WRITE_ERROR|CF_STREAMER|CF_STREAMER_FAST|CF_NEVER_WAIT); > s->rep->flags &= > ~(CF_SHUTR|CF_SHUTR_NOW|CF_READ_ATTACHED|CF_READ_ERROR|CF_READ_NOEXP|CF_STREAMER|CF_STREAMER_FAST|CF_WRITE_PARTIAL|CF_NEVER_WAIT); > s->flags &= > ~(SN_DIRECT|SN_ASSIGNED|SN_ADDR_SET|SN_BE_ASSIGNED|SN_FORCE_PRST|SN_IGNORE_PRST); > - s->flags &= ~(SN_CURR_SESS|SN_REDIRECTABLE); > + s->flags &= ~(SN_CURR_SESS|SN_REDIRECTABLE|SN_SRV_REUSED); > > if (s->flags & SN_COMP_READY) > s->comp_algo->end(&s->comp_ctx); >

