mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 14:21:25 +02:00
MINOR: snapshot: split the error snapshots into common and proto-specific parts
The idea will be to make the error snapshot feature accessible to other protocols than just HTTP. This patch only introduces an "http_snapshot" structure and renames a few fields to make things more explicit. The HTTP part was installed inside a union so that we can easily add more protocols in the future.
This commit is contained in:
parent
5865a8fe69
commit
7480f323ff
@ -205,26 +205,43 @@ enum PR_SRV_STATE_FILE {
|
|||||||
|
|
||||||
struct stream;
|
struct stream;
|
||||||
|
|
||||||
struct error_snapshot {
|
struct http_snapshot {
|
||||||
struct timeval when; /* date of this event, (tv_sec == 0) means "never" */
|
|
||||||
unsigned int len; /* original length of the last invalid request/response */
|
|
||||||
unsigned int pos; /* position of the first invalid character */
|
|
||||||
unsigned int sid; /* ID of the faulty stream */
|
unsigned int sid; /* ID of the faulty stream */
|
||||||
unsigned int ev_id; /* event number (counter incremented for each capture) */
|
|
||||||
unsigned int state; /* message state before the error (when saved) */
|
unsigned int state; /* message state before the error (when saved) */
|
||||||
unsigned int b_flags; /* buffer flags */
|
unsigned int b_flags; /* buffer flags */
|
||||||
unsigned int s_flags; /* stream flags */
|
unsigned int s_flags; /* stream flags */
|
||||||
|
|
||||||
unsigned int t_flags; /* transaction flags */
|
unsigned int t_flags; /* transaction flags */
|
||||||
unsigned int m_flags; /* message flags */
|
unsigned int m_flags; /* message flags */
|
||||||
unsigned int b_out; /* pending output bytes */
|
|
||||||
unsigned int b_wrap; /* position where the buffer is expected to wrap */
|
|
||||||
unsigned long long b_tot; /* total bytes transferred via this buffer */
|
|
||||||
unsigned long long m_clen; /* chunk len for this message */
|
unsigned long long m_clen; /* chunk len for this message */
|
||||||
unsigned long long m_blen; /* body len for this message */
|
unsigned long long m_blen; /* body len for this message */
|
||||||
struct server *srv; /* server associated with the error (or NULL) */
|
};
|
||||||
struct proxy *oe; /* other end = frontend or backend involved */
|
|
||||||
struct sockaddr_storage src; /* client's address */
|
union error_snapshot_ctx {
|
||||||
char *buf; /* copy of the beginning of the message (may be NULL) */
|
struct http_snapshot http;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct error_snapshot {
|
||||||
|
/**** common part ****/
|
||||||
|
struct timeval when; /* date of this event, (tv_sec == 0) means "never" */
|
||||||
|
/* @16 */
|
||||||
|
char *buf; /* copy of the beginning of the message (may be NULL) */
|
||||||
|
unsigned long long buf_ofs; /* relative position of the buffer's input inside its container */
|
||||||
|
/* @32 */
|
||||||
|
unsigned int buf_out; /* pending output bytes _before_ the buffer's input (0..buf->data-1) */
|
||||||
|
unsigned int buf_len; /* original length of the last invalid request/response (0..buf->data-1-buf_out) */
|
||||||
|
unsigned int buf_err; /* buffer-relative position where the error was detected (0..len-1) */
|
||||||
|
unsigned int buf_wrap; /* buffer-relative position where the buffer is expected to wrap (1..buf_size) */
|
||||||
|
/* @48 */
|
||||||
|
struct proxy *oe; /* other end = frontend or backend involved */
|
||||||
|
struct server *srv; /* server associated with the error (or NULL) */
|
||||||
|
/* @64 */
|
||||||
|
unsigned int ev_id; /* event number (counter incremented for each capture) */
|
||||||
|
/* @68: 4 bytes hole here */
|
||||||
|
struct sockaddr_storage src; /* client's address */
|
||||||
|
|
||||||
|
/**** protocol-specific part ****/
|
||||||
|
union error_snapshot_ctx ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct email_alert {
|
struct email_alert {
|
||||||
|
@ -8024,10 +8024,10 @@ void http_capture_bad_message(struct proxy *proxy, struct error_snapshot *es, st
|
|||||||
int len1, len2;
|
int len1, len2;
|
||||||
|
|
||||||
HA_SPIN_LOCK(PROXY_LOCK, &proxy->lock);
|
HA_SPIN_LOCK(PROXY_LOCK, &proxy->lock);
|
||||||
es->len = MIN(ci_data(chn), global.tune.bufsize);
|
es->buf_len = MIN(ci_data(chn), global.tune.bufsize);
|
||||||
len1 = b_wrap(&chn->buf) - ci_head(chn);
|
len1 = b_wrap(&chn->buf) - ci_head(chn);
|
||||||
len1 = MIN(len1, es->len);
|
len1 = MIN(len1, es->buf_len);
|
||||||
len2 = es->len - len1; /* remaining data if buffer wraps */
|
len2 = es->buf_len - len1; /* remaining data if buffer wraps */
|
||||||
|
|
||||||
if (!es->buf)
|
if (!es->buf)
|
||||||
es->buf = malloc(global.tune.bufsize);
|
es->buf = malloc(global.tune.bufsize);
|
||||||
@ -8039,12 +8039,11 @@ void http_capture_bad_message(struct proxy *proxy, struct error_snapshot *es, st
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (msg->err_pos >= 0)
|
if (msg->err_pos >= 0)
|
||||||
es->pos = msg->err_pos;
|
es->buf_err = msg->err_pos;
|
||||||
else
|
else
|
||||||
es->pos = msg->next;
|
es->buf_err = msg->next;
|
||||||
|
|
||||||
es->when = date; // user-visible date
|
es->when = date; // user-visible date
|
||||||
es->sid = s->uniq_id;
|
|
||||||
es->srv = objt_server(s->target);
|
es->srv = objt_server(s->target);
|
||||||
es->oe = other_end;
|
es->oe = other_end;
|
||||||
if (objt_conn(sess->origin))
|
if (objt_conn(sess->origin))
|
||||||
@ -8052,17 +8051,20 @@ void http_capture_bad_message(struct proxy *proxy, struct error_snapshot *es, st
|
|||||||
else
|
else
|
||||||
memset(&es->src, 0, sizeof(es->src));
|
memset(&es->src, 0, sizeof(es->src));
|
||||||
|
|
||||||
es->state = state;
|
|
||||||
es->ev_id = HA_ATOMIC_XADD(&error_snapshot_id, 1);
|
es->ev_id = HA_ATOMIC_XADD(&error_snapshot_id, 1);
|
||||||
es->b_flags = chn->flags;
|
es->buf_wrap = b_wrap(&chn->buf) - ci_head(chn);
|
||||||
es->s_flags = s->flags;
|
es->buf_out = co_data(chn);
|
||||||
es->t_flags = s->txn->flags;
|
es->buf_ofs = chn->total;
|
||||||
es->m_flags = msg->flags;
|
|
||||||
es->b_out = co_data(chn);
|
/* http-specific part now */
|
||||||
es->b_wrap = b_wrap(&chn->buf) - ci_head(chn);
|
es->ctx.http.sid = s->uniq_id;
|
||||||
es->b_tot = chn->total;
|
es->ctx.http.state = state;
|
||||||
es->m_clen = msg->chunk_len;
|
es->ctx.http.b_flags = chn->flags;
|
||||||
es->m_blen = msg->body_len;
|
es->ctx.http.s_flags = s->flags;
|
||||||
|
es->ctx.http.t_flags = s->txn->flags;
|
||||||
|
es->ctx.http.m_flags = msg->flags;
|
||||||
|
es->ctx.http.m_clen = msg->chunk_len;
|
||||||
|
es->ctx.http.m_blen = msg->body_len;
|
||||||
HA_SPIN_UNLOCK(PROXY_LOCK, &proxy->lock);
|
HA_SPIN_UNLOCK(PROXY_LOCK, &proxy->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12772,11 +12774,12 @@ static int cli_io_handler_show_errors(struct appctx *appctx)
|
|||||||
" pending %d bytes, wrapping at %d, error at position %d:\n \n",
|
" pending %d bytes, wrapping at %d, error at position %d:\n \n",
|
||||||
es->srv ? es->srv->id : "<NONE>", es->srv ? es->srv->puid : -1,
|
es->srv ? es->srv->id : "<NONE>", es->srv ? es->srv->puid : -1,
|
||||||
es->ev_id,
|
es->ev_id,
|
||||||
pn, port, es->sid, es->s_flags,
|
pn, port, es->ctx.http.sid, es->ctx.http.s_flags,
|
||||||
h1_msg_state_str(es->state), es->state, es->m_flags, es->t_flags,
|
h1_msg_state_str(es->ctx.http.state), es->ctx.http.state,
|
||||||
es->m_clen, es->m_blen,
|
es->ctx.http.m_flags, es->ctx.http.t_flags,
|
||||||
es->b_flags, es->b_out, es->b_tot,
|
es->ctx.http.m_clen, es->ctx.http.m_blen,
|
||||||
es->len, es->b_wrap, es->pos);
|
es->ctx.http.b_flags, es->buf_out, es->buf_ofs,
|
||||||
|
es->buf_len, es->buf_wrap, es->buf_err);
|
||||||
|
|
||||||
if (ci_putchk(si_ic(si), &trash) == -1) {
|
if (ci_putchk(si_ic(si), &trash) == -1) {
|
||||||
/* Socket buffer full. Let's try again later from the same point */
|
/* Socket buffer full. Let's try again later from the same point */
|
||||||
@ -12799,12 +12802,12 @@ static int cli_io_handler_show_errors(struct appctx *appctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* OK, ptr >= 0, so we have to dump the current line */
|
/* OK, ptr >= 0, so we have to dump the current line */
|
||||||
while (es->buf && appctx->ctx.errors.ptr < es->len && appctx->ctx.errors.ptr < global.tune.bufsize) {
|
while (es->buf && appctx->ctx.errors.ptr < es->buf_len && appctx->ctx.errors.ptr < global.tune.bufsize) {
|
||||||
int newptr;
|
int newptr;
|
||||||
int newline;
|
int newline;
|
||||||
|
|
||||||
newline = appctx->ctx.errors.bol;
|
newline = appctx->ctx.errors.bol;
|
||||||
newptr = dump_text_line(&trash, es->buf, global.tune.bufsize, es->len, &newline, appctx->ctx.errors.ptr);
|
newptr = dump_text_line(&trash, es->buf, global.tune.bufsize, es->buf_len, &newline, appctx->ctx.errors.ptr);
|
||||||
if (newptr == appctx->ctx.errors.ptr)
|
if (newptr == appctx->ctx.errors.ptr)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user