mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 07:37:02 +02:00
[MEDIUM] added counters for connect/response/security errors
This commit is contained in:
parent
38d79062b3
commit
e3b3065877
107
haproxy.c
107
haproxy.c
@ -588,6 +588,8 @@ struct server {
|
|||||||
unsigned int cum_sess; /* cumulated number of sessions really sent to this server */
|
unsigned int cum_sess; /* cumulated number of sessions really sent to this server */
|
||||||
unsigned int maxconn; /* max # of active sessions. 0 = unlimited. */
|
unsigned int maxconn; /* max # of active sessions. 0 = unlimited. */
|
||||||
unsigned failed_checks, down_trans; /* failed checks and up-down transitions */
|
unsigned failed_checks, down_trans; /* failed checks and up-down transitions */
|
||||||
|
unsigned failed_conns, failed_resp; /* failed connect() and responses */
|
||||||
|
unsigned failed_secu; /* blocked responses because of security concerns */
|
||||||
struct proxy *proxy; /* the proxy this server belongs to */
|
struct proxy *proxy; /* the proxy this server belongs to */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -695,6 +697,8 @@ struct proxy {
|
|||||||
int nbconn, nbconn_max; /* # of active sessions */
|
int nbconn, nbconn_max; /* # of active sessions */
|
||||||
unsigned int cum_conn; /* cumulated number of processed sessions */
|
unsigned int cum_conn; /* cumulated number of processed sessions */
|
||||||
int maxconn; /* max # of active sessions */
|
int maxconn; /* max # of active sessions */
|
||||||
|
unsigned failed_conns, failed_resp; /* failed connect() and responses */
|
||||||
|
unsigned failed_secu; /* blocked responses because of security concerns */
|
||||||
int conn_retries; /* maximum number of connect retries */
|
int conn_retries; /* maximum number of connect retries */
|
||||||
int options; /* PR_O_REDISP, PR_O_TRANSP, ... */
|
int options; /* PR_O_REDISP, PR_O_TRANSP, ... */
|
||||||
int mode; /* mode = PR_MODE_TCP, PR_MODE_HTTP or PR_MODE_HEALTH */
|
int mode; /* mode = PR_MODE_TCP, PR_MODE_HTTP or PR_MODE_HEALTH */
|
||||||
@ -3190,6 +3194,7 @@ int produce_content(struct session *s) {
|
|||||||
while (s->data_ctx.stats.px) {
|
while (s->data_ctx.stats.px) {
|
||||||
int dispatch_sess, dispatch_cum;
|
int dispatch_sess, dispatch_cum;
|
||||||
int failed_checks, down_trans;
|
int failed_checks, down_trans;
|
||||||
|
int failed_secu, failed_conns, failed_resp;
|
||||||
|
|
||||||
if (s->data_ctx.stats.px_st == DATA_ST_INIT) {
|
if (s->data_ctx.stats.px_st == DATA_ST_INIT) {
|
||||||
/* we are on a new proxy */
|
/* we are on a new proxy */
|
||||||
@ -3231,17 +3236,17 @@ int produce_content(struct session *s) {
|
|||||||
px->nbconn, px->maxconn, px->totpend, px->nbpend, px->cum_conn);
|
px->nbconn, px->maxconn, px->totpend, px->nbpend, px->cum_conn);
|
||||||
|
|
||||||
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
||||||
"<table cols=\"13\" class=\"tbl\">\n"
|
"<table cols=\"16\" class=\"tbl\">\n"
|
||||||
"<tr align=\"center\" bgcolor=\"#20C0C0\">"
|
"<tr align=\"center\" bgcolor=\"#20C0C0\">"
|
||||||
"<th colspan=5>Server</th>"
|
"<th colspan=5>Server</th>"
|
||||||
"<th colspan=2>Queue</th>"
|
"<th colspan=2>Queue</th>"
|
||||||
"<th colspan=4>Sessions</th>"
|
"<th colspan=4>Sessions</th>"
|
||||||
"<th colspan=2>Checks</th></tr>\n"
|
"<th colspan=5>Errors</th></tr>\n"
|
||||||
"<tr align=\"center\" bgcolor=\"#20C0C0\">"
|
"<tr align=\"center\" bgcolor=\"#20C0C0\">"
|
||||||
"<th>Name</th><th>Weight</th><th>Status</th><th>Act.</th><th>Bck.</th>"
|
"<th>Name</th><th>Weight</th><th>Status</th><th>Act.</th><th>Bck.</th>"
|
||||||
"<th>Curr.</th><th>Max.</th>"
|
"<th>Curr.</th><th>Max.</th>"
|
||||||
"<th>Curr.</th><th>Max.</th><th>Limit</th><th>Cumul.</th>"
|
"<th>Curr.</th><th>Max.</th><th>Limit</th><th>Cumul.</th>"
|
||||||
"<th>Failed</th><th>Fatal</th></tr>\n");
|
"<th>Conn.</th><th>Resp.</th><th>Sec.</th><th>Check</th><th>Down</th></tr>\n");
|
||||||
|
|
||||||
if (buffer_write(rep, trash, msglen) != 0)
|
if (buffer_write(rep, trash, msglen) != 0)
|
||||||
return 0;
|
return 0;
|
||||||
@ -3302,7 +3307,12 @@ int produce_content(struct session *s) {
|
|||||||
"<td align=right>%d</td><td align=right>%d</td><td align=right>%s</td><td align=right>%d</td>",
|
"<td align=right>%d</td><td align=right>%d</td><td align=right>%s</td><td align=right>%d</td>",
|
||||||
sv->cur_sess, sv->cur_sess_max, sv->maxconn ? ultoa(sv->maxconn) : "-", sv->cum_sess);
|
sv->cur_sess, sv->cur_sess_max, sv->maxconn ? ultoa(sv->maxconn) : "-", sv->cum_sess);
|
||||||
|
|
||||||
/* failures : unique, fatal */
|
/* errors : connect, response, security */
|
||||||
|
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
||||||
|
"<td align=right>%d</td><td align=right>%d</td><td align=right>%d</td>\n",
|
||||||
|
sv->failed_conns, sv->failed_resp, sv->failed_secu);
|
||||||
|
|
||||||
|
/* check failures : unique, fatal */
|
||||||
if (sv->state & SRV_CHECKED)
|
if (sv->state & SRV_CHECKED)
|
||||||
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
||||||
"<td align=right>%d</td><td align=right>%d</td></tr>\n",
|
"<td align=right>%d</td><td align=right>%d</td></tr>\n",
|
||||||
@ -3326,15 +3336,23 @@ int produce_content(struct session *s) {
|
|||||||
* might be interrupted multiple times.
|
* might be interrupted multiple times.
|
||||||
*/
|
*/
|
||||||
dispatch_sess = px->nbconn;
|
dispatch_sess = px->nbconn;
|
||||||
dispatch_cum = px->cum_conn;
|
dispatch_cum = px->cum_conn;
|
||||||
|
failed_secu = px->failed_secu;
|
||||||
|
failed_conns = px->failed_conns;
|
||||||
|
failed_resp = px->failed_resp;
|
||||||
failed_checks = down_trans = 0;
|
failed_checks = down_trans = 0;
|
||||||
|
|
||||||
sv = px->srv;
|
sv = px->srv;
|
||||||
while (sv) {
|
while (sv) {
|
||||||
dispatch_sess -= sv->cur_sess;
|
dispatch_sess -= sv->cur_sess;
|
||||||
dispatch_cum -= sv->cum_sess;
|
dispatch_cum -= sv->cum_sess;
|
||||||
failed_checks += sv->failed_checks;
|
failed_conns -= sv->failed_conns;
|
||||||
down_trans += sv->down_trans;
|
failed_resp -= sv->failed_resp;
|
||||||
|
failed_secu -= sv->failed_secu;
|
||||||
|
if (sv->state & SRV_CHECKED) {
|
||||||
|
failed_checks += sv->failed_checks;
|
||||||
|
down_trans += sv->down_trans;
|
||||||
|
}
|
||||||
sv = sv->next;
|
sv = sv->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3355,7 +3373,12 @@ int produce_content(struct session *s) {
|
|||||||
"<td align=right>%d</td><td align=right>%d</td><td align=right>%d</td><td align=right>%d</td>",
|
"<td align=right>%d</td><td align=right>%d</td><td align=right>%d</td><td align=right>%d</td>",
|
||||||
dispatch_sess, px->nbconn_max, px->maxconn, dispatch_cum);
|
dispatch_sess, px->nbconn_max, px->maxconn, dispatch_cum);
|
||||||
|
|
||||||
/* failures : unique, fatal */
|
/* errors : connect, response, security */
|
||||||
|
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
||||||
|
"<td align=right>%d</td><td align=right>%d</td><td align=right>%d</td>\n",
|
||||||
|
failed_conns, failed_resp, failed_secu);
|
||||||
|
|
||||||
|
/* check failures : unique, fatal */
|
||||||
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
||||||
"<td align=right>-</td><td align=right>-</td></tr>\n");
|
"<td align=right>-</td><td align=right>-</td></tr>\n");
|
||||||
|
|
||||||
@ -3379,7 +3402,12 @@ int produce_content(struct session *s) {
|
|||||||
"<td align=right><b>%d</b></td><td align=right><b>%d</b></td><td align=right><b>%d</b></td><td align=right><b>%d</b></td>",
|
"<td align=right><b>%d</b></td><td align=right><b>%d</b></td><td align=right><b>%d</b></td><td align=right><b>%d</b></td>",
|
||||||
px->nbconn, px->nbconn_max, px->maxconn, px->cum_conn);
|
px->nbconn, px->nbconn_max, px->maxconn, px->cum_conn);
|
||||||
|
|
||||||
/* failures : unique, fatal */
|
/* errors : connect, response, security */
|
||||||
|
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
||||||
|
"<td align=right>%d</td><td align=right>%d</td><td align=right>%d</td>\n",
|
||||||
|
px->failed_conns, px->failed_resp, px->failed_secu);
|
||||||
|
|
||||||
|
/* check failures : unique, fatal */
|
||||||
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
msglen += snprintf(trash + msglen, sizeof(trash) - msglen,
|
||||||
"<td align=right>%d</td><td align=right>%d</td></tr>\n",
|
"<td align=right>%d</td><td align=right>%d</td></tr>\n",
|
||||||
failed_checks, down_trans);
|
failed_checks, down_trans);
|
||||||
@ -5209,7 +5237,10 @@ int srv_count_retry_down(struct session *t, int conn_err) {
|
|||||||
tv_eternity(&t->cnexpire);
|
tv_eternity(&t->cnexpire);
|
||||||
srv_close_with_err(t, conn_err, SN_FINST_C,
|
srv_close_with_err(t, conn_err, SN_FINST_C,
|
||||||
503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
|
503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
|
||||||
|
if (t->srv)
|
||||||
|
t->srv->failed_conns++;
|
||||||
|
t->proxy->failed_conns++;
|
||||||
|
|
||||||
/* We used to have a free connection slot. Since we'll never use it,
|
/* We used to have a free connection slot. Since we'll never use it,
|
||||||
* we have to inform the server that it may be used by another session.
|
* we have to inform the server that it may be used by another session.
|
||||||
*/
|
*/
|
||||||
@ -5246,6 +5277,9 @@ int srv_retryable_connect(struct session *t) {
|
|||||||
tv_eternity(&t->cnexpire);
|
tv_eternity(&t->cnexpire);
|
||||||
srv_close_with_err(t, SN_ERR_INTERNAL, SN_FINST_C,
|
srv_close_with_err(t, SN_ERR_INTERNAL, SN_FINST_C,
|
||||||
500, t->proxy->errmsg.len500, t->proxy->errmsg.msg500);
|
500, t->proxy->errmsg.len500, t->proxy->errmsg.msg500);
|
||||||
|
if (t->srv)
|
||||||
|
t->srv->failed_conns++;
|
||||||
|
t->proxy->failed_conns++;
|
||||||
/* release other sessions waiting for this server */
|
/* release other sessions waiting for this server */
|
||||||
if (may_dequeue_tasks(t->srv, t->proxy))
|
if (may_dequeue_tasks(t->srv, t->proxy))
|
||||||
task_wakeup(&rq, t->srv->queue_mgt);
|
task_wakeup(&rq, t->srv->queue_mgt);
|
||||||
@ -5267,6 +5301,10 @@ int srv_retryable_connect(struct session *t) {
|
|||||||
if (may_dequeue_tasks(t->srv, t->proxy))
|
if (may_dequeue_tasks(t->srv, t->proxy))
|
||||||
task_wakeup(&rq, t->srv->queue_mgt);
|
task_wakeup(&rq, t->srv->queue_mgt);
|
||||||
|
|
||||||
|
if (t->srv)
|
||||||
|
t->srv->failed_conns++;
|
||||||
|
t->proxy->failed_conns++;
|
||||||
|
|
||||||
t->flags &= ~(SN_DIRECT | SN_ASSIGNED | SN_ADDR_SET);
|
t->flags &= ~(SN_DIRECT | SN_ASSIGNED | SN_ADDR_SET);
|
||||||
t->srv = NULL; /* it's left to the dispatcher to choose a server */
|
t->srv = NULL; /* it's left to the dispatcher to choose a server */
|
||||||
if ((t->flags & SN_CK_MASK) == SN_CK_VALID) {
|
if ((t->flags & SN_CK_MASK) == SN_CK_VALID) {
|
||||||
@ -5300,6 +5338,10 @@ int srv_redispatch_connect(struct session *t) {
|
|||||||
tv_eternity(&t->cnexpire);
|
tv_eternity(&t->cnexpire);
|
||||||
srv_close_with_err(t, SN_ERR_SRVTO, SN_FINST_C,
|
srv_close_with_err(t, SN_ERR_SRVTO, SN_FINST_C,
|
||||||
503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
|
503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
|
||||||
|
if (t->srv)
|
||||||
|
t->srv->failed_conns++;
|
||||||
|
t->proxy->failed_conns++;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case SRV_STATUS_QUEUED:
|
case SRV_STATUS_QUEUED:
|
||||||
@ -5318,6 +5360,10 @@ int srv_redispatch_connect(struct session *t) {
|
|||||||
tv_eternity(&t->cnexpire);
|
tv_eternity(&t->cnexpire);
|
||||||
srv_close_with_err(t, SN_ERR_INTERNAL, SN_FINST_C,
|
srv_close_with_err(t, SN_ERR_INTERNAL, SN_FINST_C,
|
||||||
500, t->proxy->errmsg.len500, t->proxy->errmsg.msg500);
|
500, t->proxy->errmsg.len500, t->proxy->errmsg.msg500);
|
||||||
|
if (t->srv)
|
||||||
|
t->srv->failed_conns++;
|
||||||
|
t->proxy->failed_conns++;
|
||||||
|
|
||||||
/* release other sessions waiting for this server */
|
/* release other sessions waiting for this server */
|
||||||
if (may_dequeue_tasks(t->srv, t->proxy))
|
if (may_dequeue_tasks(t->srv, t->proxy))
|
||||||
task_wakeup(&rq, t->srv->queue_mgt);
|
task_wakeup(&rq, t->srv->queue_mgt);
|
||||||
@ -5381,6 +5427,9 @@ int process_srv(struct session *t) {
|
|||||||
t->logs.t_queue = tv_diff(&t->logs.tv_accept, &now);
|
t->logs.t_queue = tv_diff(&t->logs.tv_accept, &now);
|
||||||
srv_close_with_err(t, SN_ERR_SRVTO, SN_FINST_Q,
|
srv_close_with_err(t, SN_ERR_SRVTO, SN_FINST_Q,
|
||||||
503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
|
503, t->proxy->errmsg.len503, t->proxy->errmsg.msg503);
|
||||||
|
if (t->srv)
|
||||||
|
t->srv->failed_conns++;
|
||||||
|
t->proxy->failed_conns++;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5517,8 +5566,11 @@ int process_srv(struct session *t) {
|
|||||||
tv_eternity(&t->srexpire);
|
tv_eternity(&t->srexpire);
|
||||||
tv_eternity(&t->swexpire);
|
tv_eternity(&t->swexpire);
|
||||||
fd_delete(t->srv_fd);
|
fd_delete(t->srv_fd);
|
||||||
if (t->srv)
|
if (t->srv) {
|
||||||
t->srv->cur_sess--;
|
t->srv->cur_sess--;
|
||||||
|
t->srv->failed_secu++;
|
||||||
|
}
|
||||||
|
t->proxy->failed_secu++;
|
||||||
t->srv_state = SV_STCLOSE;
|
t->srv_state = SV_STCLOSE;
|
||||||
t->logs.status = 502;
|
t->logs.status = 502;
|
||||||
client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
|
client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
|
||||||
@ -5545,8 +5597,11 @@ int process_srv(struct session *t) {
|
|||||||
tv_eternity(&t->srexpire);
|
tv_eternity(&t->srexpire);
|
||||||
tv_eternity(&t->swexpire);
|
tv_eternity(&t->swexpire);
|
||||||
fd_delete(t->srv_fd);
|
fd_delete(t->srv_fd);
|
||||||
if (t->srv)
|
if (t->srv) {
|
||||||
t->srv->cur_sess--;
|
t->srv->cur_sess--;
|
||||||
|
t->srv->failed_secu++;
|
||||||
|
}
|
||||||
|
t->proxy->failed_secu++;
|
||||||
t->srv_state = SV_STCLOSE;
|
t->srv_state = SV_STCLOSE;
|
||||||
t->logs.status = 502;
|
t->logs.status = 502;
|
||||||
client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
|
client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
|
||||||
@ -5684,7 +5739,7 @@ int process_srv(struct session *t) {
|
|||||||
* unless the response includes appropriate
|
* unless the response includes appropriate
|
||||||
* Cache-Control or Expires header fields."
|
* Cache-Control or Expires header fields."
|
||||||
*/
|
*/
|
||||||
if ((!t->flags & SN_POST) && (t->proxy->options & PR_O_CHK_CACHE))
|
if (!t->flags & SN_POST && (t->proxy->options & PR_O_CHK_CACHE))
|
||||||
t->flags |= SN_CACHEABLE | SN_CACHE_COOK;
|
t->flags |= SN_CACHEABLE | SN_CACHE_COOK;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -5985,8 +6040,12 @@ int process_srv(struct session *t) {
|
|||||||
tv_eternity(&t->srexpire);
|
tv_eternity(&t->srexpire);
|
||||||
tv_eternity(&t->swexpire);
|
tv_eternity(&t->swexpire);
|
||||||
fd_delete(t->srv_fd);
|
fd_delete(t->srv_fd);
|
||||||
if (t->srv)
|
if (t->srv) {
|
||||||
t->srv->cur_sess--;
|
t->srv->cur_sess--;
|
||||||
|
t->srv->failed_resp++;
|
||||||
|
}
|
||||||
|
t->proxy->failed_resp++;
|
||||||
|
|
||||||
t->srv_state = SV_STCLOSE;
|
t->srv_state = SV_STCLOSE;
|
||||||
t->logs.status = 502;
|
t->logs.status = 502;
|
||||||
client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
|
client_return(t, t->proxy->errmsg.len502, t->proxy->errmsg.msg502);
|
||||||
@ -6020,8 +6079,11 @@ int process_srv(struct session *t) {
|
|||||||
tv_eternity(&t->srexpire);
|
tv_eternity(&t->srexpire);
|
||||||
tv_eternity(&t->swexpire);
|
tv_eternity(&t->swexpire);
|
||||||
fd_delete(t->srv_fd);
|
fd_delete(t->srv_fd);
|
||||||
if (t->srv)
|
if (t->srv) {
|
||||||
t->srv->cur_sess--;
|
t->srv->cur_sess--;
|
||||||
|
t->srv->failed_resp++;
|
||||||
|
}
|
||||||
|
t->proxy->failed_resp++;
|
||||||
t->srv_state = SV_STCLOSE;
|
t->srv_state = SV_STCLOSE;
|
||||||
t->logs.status = 504;
|
t->logs.status = 504;
|
||||||
client_return(t, t->proxy->errmsg.len504, t->proxy->errmsg.msg504);
|
client_return(t, t->proxy->errmsg.len504, t->proxy->errmsg.msg504);
|
||||||
@ -6122,8 +6184,11 @@ int process_srv(struct session *t) {
|
|||||||
tv_eternity(&t->srexpire);
|
tv_eternity(&t->srexpire);
|
||||||
tv_eternity(&t->swexpire);
|
tv_eternity(&t->swexpire);
|
||||||
fd_delete(t->srv_fd);
|
fd_delete(t->srv_fd);
|
||||||
if (t->srv)
|
if (t->srv) {
|
||||||
t->srv->cur_sess--;
|
t->srv->cur_sess--;
|
||||||
|
t->srv->failed_resp++;
|
||||||
|
}
|
||||||
|
t->proxy->failed_resp++;
|
||||||
t->srv_state = SV_STCLOSE;
|
t->srv_state = SV_STCLOSE;
|
||||||
if (!(t->flags & SN_ERR_MASK))
|
if (!(t->flags & SN_ERR_MASK))
|
||||||
t->flags |= SN_ERR_SRVCL;
|
t->flags |= SN_ERR_SRVCL;
|
||||||
@ -6235,8 +6300,11 @@ int process_srv(struct session *t) {
|
|||||||
//FD_CLR(t->srv_fd, StaticWriteEvent);
|
//FD_CLR(t->srv_fd, StaticWriteEvent);
|
||||||
tv_eternity(&t->swexpire);
|
tv_eternity(&t->swexpire);
|
||||||
fd_delete(t->srv_fd);
|
fd_delete(t->srv_fd);
|
||||||
if (t->srv)
|
if (t->srv) {
|
||||||
t->srv->cur_sess--;
|
t->srv->cur_sess--;
|
||||||
|
t->srv->failed_resp++;
|
||||||
|
}
|
||||||
|
t->proxy->failed_resp++;
|
||||||
//close(t->srv_fd);
|
//close(t->srv_fd);
|
||||||
t->srv_state = SV_STCLOSE;
|
t->srv_state = SV_STCLOSE;
|
||||||
if (!(t->flags & SN_ERR_MASK))
|
if (!(t->flags & SN_ERR_MASK))
|
||||||
@ -6313,8 +6381,11 @@ int process_srv(struct session *t) {
|
|||||||
//FD_CLR(t->srv_fd, StaticReadEvent);
|
//FD_CLR(t->srv_fd, StaticReadEvent);
|
||||||
tv_eternity(&t->srexpire);
|
tv_eternity(&t->srexpire);
|
||||||
fd_delete(t->srv_fd);
|
fd_delete(t->srv_fd);
|
||||||
if (t->srv)
|
if (t->srv) {
|
||||||
t->srv->cur_sess--;
|
t->srv->cur_sess--;
|
||||||
|
t->srv->failed_resp++;
|
||||||
|
}
|
||||||
|
t->proxy->failed_resp++;
|
||||||
//close(t->srv_fd);
|
//close(t->srv_fd);
|
||||||
t->srv_state = SV_STCLOSE;
|
t->srv_state = SV_STCLOSE;
|
||||||
if (!(t->flags & SN_ERR_MASK))
|
if (!(t->flags & SN_ERR_MASK))
|
||||||
|
Loading…
Reference in New Issue
Block a user