[MEDIUM] massive cleanup of process_srv()
Server-specific calls were extracted and moved to the caller.
The function is now nearly server-agnostic.
diff --git a/src/proto_http.c b/src/proto_http.c
index f458122..3b8cca9 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -746,8 +746,37 @@
process_srv_conn(s);
if (s->req->cons->state == SI_ST_EST) {
+ if ((s->req->flags & (BF_SHUTW|BF_EMPTY|BF_MAY_FORWARD)) == (BF_EMPTY|BF_MAY_FORWARD) &&
+ s->be->options & PR_O_FORCE_CLO &&
+ s->rep->flags & BF_READ_STATUS) {
+ /* We want to force the connection to the server to close,
+ * and the server has begun to respond. That's the right
+ * time.
+ */
+ buffer_shutw_now(s->req);
+ }
+
if (process_srv_data(s))
resync |= PROCESS_SRV;
+
+ /* Count server-side errors (but not timeouts). */
+ if (s->req->flags & BF_WRITE_ERROR) {
+ s->be->failed_resp++;
+ if (s->srv)
+ s->srv->failed_resp++;
+ }
+
+ /* When a server-side connection is released, we have to
+ * count it and check for pending connections on this server.
+ */
+ if (s->req->cons->state == SI_ST_CLO) {
+ if (s->srv) {
+ s->srv->cur_sess--;
+ sess_change_server(s, NULL);
+ if (may_dequeue_tasks(s->srv, s->be))
+ process_srv_queue(s->srv);
+ }
+ }
}
if (unlikely((s->req->cons->state == SI_ST_CLO) &&
@@ -3872,7 +3901,6 @@
// goto update_timeouts;
/* read or write error */
- /* FIXME: what happens when we have to deal with HTTP ??? */
if (fdtab[fd].state == FD_STERROR) {
trace_term(t, TT_HTTP_SRV_6);
buffer_shutw(req);
@@ -3881,23 +3909,10 @@
rep->flags |= BF_READ_ERROR;
fd_delete(fd);
req->cons->state = SI_ST_CLO;
- if (t->srv) {
- t->srv->cur_sess--;
- //t->srv->failed_resp++;
- //FIXME: si on ne traite pas l'erreur ici, le serveur est perdu et on ne la comptabilisera plus ensuite.
- //il va donc falloir stocker l'info du dernier serveur en erreur pour que les couches du dessus traitent.
- sess_change_server(t, NULL);
+ if (!req->cons->err_type) {
+ req->cons->err_loc = t->srv;
+ req->cons->err_type = SI_ET_DATA_ERR;
}
- //t->be->failed_resp++;
- //if (!rep->analysers) {
- // if (!(t->flags & SN_ERR_MASK))
- // t->flags |= SN_ERR_SRVCL;
- // if (!(t->flags & SN_FINST_MASK))
- // t->flags |= SN_FINST_D;
- //}
- if (may_dequeue_tasks(t->srv, t->be))
- process_srv_queue(t->srv);
-
return 0;
}
@@ -3905,22 +3920,15 @@
if (!(rep->flags & BF_SHUTR) && /* not already done */
rep->flags & (BF_READ_NULL|BF_SHUTR_NOW|BF_SHUTW)) {
buffer_shutr(rep);
- if (!(req->flags & BF_SHUTW)) {
- EV_FD_CLR(fd, DIR_RD);
- trace_term(t, TT_HTTP_SRV_7);
- } else {
+ if (req->flags & BF_SHUTW) {
/* output was already closed */
trace_term(t, TT_HTTP_SRV_8);
fd_delete(fd);
req->cons->state = SI_ST_CLO;
- if (t->srv) {
- t->srv->cur_sess--;
- sess_change_server(t, NULL);
- }
-
- if (may_dequeue_tasks(t->srv, t->be))
- process_srv_queue(t->srv);
return 0;
+ } else {
+ EV_FD_CLR(fd, DIR_RD);
+ trace_term(t, TT_HTTP_SRV_7);
}
}
/* end of client read and no more data to send. We can forward
@@ -3930,29 +3938,20 @@
* coming from the server.
*/
- // FIXME: option FORCE_CLOSE should move to upper layer.
if (!(req->flags & BF_SHUTW) && /* not already done */
(req->flags & BF_SHUTW_NOW ||
- (req->flags & BF_EMPTY && req->flags & BF_MAY_FORWARD &&
- (req->flags & BF_SHUTR ||
- (t->be->options & PR_O_FORCE_CLO && rep->flags & BF_READ_STATUS))))) {
+ (req->flags & (BF_EMPTY|BF_MAY_FORWARD|BF_SHUTR)) == (BF_EMPTY|BF_MAY_FORWARD|BF_SHUTR))) {
buffer_shutw(req);
- if (!(rep->flags & BF_SHUTR)) {
- trace_term(t, TT_HTTP_SRV_9);
- EV_FD_CLR(fd, DIR_WR);
- shutdown(fd, SHUT_WR);
- } else {
+ if (rep->flags & BF_SHUTR) {
+ /* input was already closed */
trace_term(t, TT_HTTP_SRV_10);
fd_delete(fd);
req->cons->state = SI_ST_CLO;
- if (t->srv) {
- t->srv->cur_sess--;
- sess_change_server(t, NULL);
- }
-
- if (may_dequeue_tasks(t->srv, t->be))
- process_srv_queue(t->srv);
return 0;
+ } else {
+ trace_term(t, TT_HTTP_SRV_9);
+ EV_FD_CLR(fd, DIR_WR);
+ shutdown(fd, SHUT_WR);
}
}
@@ -3960,28 +3959,20 @@
if ((rep->flags & (BF_SHUTR|BF_READ_TIMEOUT)) == 0 &&
tick_is_expired(rep->rex, now_ms)) {
rep->flags |= BF_READ_TIMEOUT;
- //if (!rep->analysers) {
- // if (!(t->flags & SN_ERR_MASK))
- // t->flags |= SN_ERR_SRVTO;
- // if (!(t->flags & SN_FINST_MASK))
- // t->flags |= SN_FINST_D;
- //}
+ if (!req->cons->err_type) {
+ req->cons->err_loc = t->srv;
+ req->cons->err_type = SI_ET_DATA_TO;
+ }
+
buffer_shutr(rep);
- if (!(req->flags & BF_SHUTW)) {
- trace_term(t, TT_HTTP_SRV_11);
- EV_FD_CLR(fd, DIR_RD);
- } else {
+ if (req->flags & BF_SHUTW) {
trace_term(t, TT_HTTP_SRV_12);
fd_delete(fd);
req->cons->state = SI_ST_CLO;
- if (t->srv) {
- t->srv->cur_sess--;
- sess_change_server(t, NULL);
- }
-
- if (may_dequeue_tasks(t->srv, t->be))
- process_srv_queue(t->srv);
return 0;
+ } else {
+ trace_term(t, TT_HTTP_SRV_11);
+ EV_FD_CLR(fd, DIR_RD);
}
}
@@ -3989,29 +3980,21 @@
if ((req->flags & (BF_SHUTW|BF_WRITE_TIMEOUT)) == 0 &&
tick_is_expired(req->wex, now_ms)) {
req->flags |= BF_WRITE_TIMEOUT;
- //if (!rep->analysers) {
- // if (!(t->flags & SN_ERR_MASK))
- // t->flags |= SN_ERR_SRVTO;
- // if (!(t->flags & SN_FINST_MASK))
- // t->flags |= SN_FINST_D;
- //}
+ if (!req->cons->err_type) {
+ req->cons->err_loc = t->srv;
+ req->cons->err_type = SI_ET_DATA_TO;
+ }
+
buffer_shutw(req);
- if (!(rep->flags & BF_SHUTR)) {
- trace_term(t, TT_HTTP_SRV_13);
- EV_FD_CLR(fd, DIR_WR);
- shutdown(fd, SHUT_WR);
- } else {
+ if (rep->flags & BF_SHUTR) {
trace_term(t, TT_HTTP_SRV_14);
fd_delete(fd);
req->cons->state = SI_ST_CLO;
- if (t->srv) {
- t->srv->cur_sess--;
- sess_change_server(t, NULL);
- }
-
- if (may_dequeue_tasks(t->srv, t->be))
- process_srv_queue(t->srv);
return 0;
+ } else {
+ trace_term(t, TT_HTTP_SRV_13);
+ EV_FD_CLR(fd, DIR_WR);
+ shutdown(fd, SHUT_WR);
}
}