[MAJOR] make unix sockets work again with stats
The unix protocol handler had not been updated during the last stream_sock changes. This has been done now. There is still a lot of duplicated code between session.c and proto_uxst.c due to the way the session is handled. Session.c relies on the existence of a frontend while it does not exist here. It is easier to see the difference between the stats part (placed in dumpstats.c) and the unix-stream part (in proto_uxst.c). The hijacking function still needs to be dynamically set into the response buffer, and some cleanup is still required, then all those changes should be forward-ported to the HTTP part. Adding support for new keywords should not cause trouble now.
This commit is contained in:
parent
ff8d42ea68
commit
b1356cf4e4
@ -4,7 +4,7 @@
|
||||
statistics output.
|
||||
|
||||
Copyright (C) 2000-2008 Willy Tarreau - w@1wt.eu
|
||||
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation, version 2.1
|
||||
@ -39,7 +39,13 @@
|
||||
#define STATS_TYPE_BE 1
|
||||
#define STATS_TYPE_SV 2
|
||||
|
||||
#define STATS_ST_INIT 0
|
||||
#define STATS_ST_REQ 1
|
||||
#define STATS_ST_REP 2
|
||||
#define STATS_ST_CLOSE 3
|
||||
|
||||
int stats_dump_raw(struct session *s, struct uri_auth *uri);
|
||||
int stats_dump_raw_to_buffer(struct session *s, struct buffer *req);
|
||||
int stats_dump_http(struct session *s, struct uri_auth *uri);
|
||||
int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri);
|
||||
|
||||
|
@ -29,6 +29,7 @@
|
||||
int uxst_event_accept(int fd);
|
||||
void uxst_add_listener(struct listener *listener);
|
||||
void process_uxst_stats(struct task *t, int *next);
|
||||
void uxst_process_session(struct task *t, int *next);
|
||||
|
||||
#endif /* _PROTO_PROTO_UXST_H */
|
||||
|
||||
|
@ -78,7 +78,8 @@ static int stats_parse_global(char **args, int section_type, struct proxy *curpx
|
||||
global.stats_sock.state = LI_INIT;
|
||||
global.stats_sock.options = LI_O_NONE;
|
||||
global.stats_sock.accept = uxst_event_accept;
|
||||
global.stats_sock.handler = process_uxst_stats;
|
||||
global.stats_sock.handler = uxst_process_session;
|
||||
global.stats_sock.analysers = AN_REQ_UNIX_STATS;
|
||||
global.stats_sock.private = NULL;
|
||||
|
||||
cur_arg = 2;
|
||||
@ -122,7 +123,7 @@ static int stats_parse_global(char **args, int section_type, struct proxy *curpx
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uxst_add_listener(&global.stats_sock);
|
||||
global.maxsock++;
|
||||
}
|
||||
@ -287,6 +288,23 @@ int stats_dump_raw(struct session *s, struct uri_auth *uri)
|
||||
}
|
||||
|
||||
|
||||
/* This function is called to send output to the response buffer. It simply
|
||||
* calls stats_dump_raw(), and releases the buffer's hijack bit when the dump
|
||||
* is finished. It always returns 0.
|
||||
*/
|
||||
int stats_dump_raw_to_buffer(struct session *s, struct buffer *req)
|
||||
{
|
||||
if (s->ana_state != STATS_ST_REP)
|
||||
return 0;
|
||||
|
||||
if (stats_dump_raw(s, NULL) != 0) {
|
||||
buffer_stop_hijack(s->rep);
|
||||
s->ana_state = STATS_ST_CLOSE;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Produces statistics data for the session <s>. Expects to be called with
|
||||
* client socket shut down on input. It stops by itself by unsetting the
|
||||
@ -480,7 +498,7 @@ int stats_dump_http(struct session *s, struct uri_auth *uri)
|
||||
global.maxconn,
|
||||
actconn
|
||||
);
|
||||
|
||||
|
||||
if (s->data_ctx.stats.flags & STAT_HIDE_DOWN)
|
||||
chunk_printf(&msg, sizeof(trash),
|
||||
"<li><a href=\"%s%s%s\">Show all servers</a><br>\n",
|
||||
@ -532,7 +550,7 @@ int stats_dump_http(struct session *s, struct uri_auth *uri)
|
||||
"</tr></table>\n"
|
||||
""
|
||||
);
|
||||
|
||||
|
||||
if (buffer_write_chunk(rep, &msg) >= 0)
|
||||
return 0;
|
||||
}
|
||||
@ -811,7 +829,7 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri)
|
||||
sv->failed_secu,
|
||||
sv->failed_conns, sv->failed_resp,
|
||||
sv->retries, sv->redispatches);
|
||||
|
||||
|
||||
/* status */
|
||||
chunk_printf(&msg, sizeof(trash), "<td nowrap>");
|
||||
|
||||
@ -889,7 +907,7 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri)
|
||||
sv->failed_secu,
|
||||
sv->failed_conns, sv->failed_resp,
|
||||
sv->retries, sv->redispatches);
|
||||
|
||||
|
||||
/* status */
|
||||
chunk_printf(&msg, sizeof(trash),
|
||||
srv_hlt_st[sv_state],
|
||||
@ -1043,7 +1061,7 @@ int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri)
|
||||
if (buffer_write_chunk(rep, &msg) >= 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
s->data_ctx.stats.px_st = DATA_ST_PX_END;
|
||||
/* fall through */
|
||||
|
||||
|
1284
src/proto_uxst.c
1284
src/proto_uxst.c
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user