From: Willy Tarreau Date: Mon, 14 May 2012 10:11:47 +0000 (+0200) Subject: MINOR: stream_interface: add reporting of ressouce allocation errors X-Git-Tag: v1.5-dev20~74 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2d400bb931442dda9c84014c3321794bf4d2c63d;p=thirdparty%2Fhaproxy.git MINOR: stream_interface: add reporting of ressouce allocation errors SSL and keep-alive will need to be able to fail on allocation errors, and the stream interface did not allow to report such a cause. The flag will then be "RC" as already documented. --- diff --git a/include/types/stream_interface.h b/include/types/stream_interface.h index afe1ec86d4..f0b63c485c 100644 --- a/include/types/stream_interface.h +++ b/include/types/stream_interface.h @@ -57,10 +57,11 @@ enum { SI_ET_CONN_TO = 0x0008, /* connection timeout */ SI_ET_CONN_ERR = 0x0010, /* connection error (eg: no server available) */ SI_ET_CONN_ABRT = 0x0020, /* connection aborted by external cause (eg: abort) */ - SI_ET_CONN_OTHER = 0x0040, /* connection aborted for other reason (eg: 500) */ - SI_ET_DATA_TO = 0x0080, /* timeout during data phase */ - SI_ET_DATA_ERR = 0x0100, /* error during data phase */ - SI_ET_DATA_ABRT = 0x0200, /* data phase aborted by external cause */ + SI_ET_CONN_RES = 0x0040, /* connection aborted due to lack of resources */ + SI_ET_CONN_OTHER = 0x0080, /* connection aborted for other reason (eg: 500) */ + SI_ET_DATA_TO = 0x0100, /* timeout during data phase */ + SI_ET_DATA_ERR = 0x0200, /* error during data phase */ + SI_ET_DATA_ABRT = 0x0400, /* data phase aborted by external cause */ }; /* flags set after I/O (16 bit) */ diff --git a/src/proto_http.c b/src/proto_http.c index a7e42fc5d0..900f747ee3 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -936,6 +936,9 @@ void http_return_srv_error(struct session *s, struct stream_interface *si) else if (err_type & SI_ET_CONN_ERR) http_server_error(s, si, SN_ERR_SRVCL, SN_FINST_C, 503, 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, + 503, http_error_message(s, HTTP_ERR_503)); else /* SI_ET_CONN_OTHER and others */ http_server_error(s, si, SN_ERR_INTERNAL, SN_FINST_C, 500, http_error_message(s, HTTP_ERR_500)); diff --git a/src/session.c b/src/session.c index 1183d91e30..75ac04c77d 100644 --- a/src/session.c +++ b/src/session.c @@ -2576,6 +2576,10 @@ void default_srv_error(struct session *s, struct stream_interface *si) err = SN_ERR_SRVCL; fin = SN_FINST_C; } + else if (err_type & SI_ET_CONN_RES) { + err = SN_ERR_RESOURCE; + fin = SN_FINST_C; + } else /* SI_ET_CONN_OTHER and others */ { err = SN_ERR_INTERNAL; fin = SN_FINST_C;