mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-12 18:16:58 +02:00
MEDIUM: stats: remove the stats_sock struct from the global struct
Now the stats socket is allocated when the 'stats socket' line is parsed, and assigned using the standard str2listener(). This has two effects : - more than one stats socket can now be declared - stats socket now support protocols other than UNIX The next step is to remove the duplicate bind config parsing.
This commit is contained in:
parent
4fbb2285e2
commit
c53d42256d
@ -112,7 +112,6 @@ struct global {
|
|||||||
int level; /* access level (ACCESS_LVL_*) */
|
int level; /* access level (ACCESS_LVL_*) */
|
||||||
} ux;
|
} ux;
|
||||||
} unix_bind;
|
} unix_bind;
|
||||||
struct listener stats_sock; /* unix socket listener for statistics */
|
|
||||||
struct proxy *stats_fe; /* the frontend holding the stats settings */
|
struct proxy *stats_fe; /* the frontend holding the stats settings */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -168,6 +168,7 @@ static struct proxy *alloc_stats_fe(const char *name, const char *file, int line
|
|||||||
fe->timeout.client = MS_TO_TICKS(10000); /* default timeout of 10 seconds */
|
fe->timeout.client = MS_TO_TICKS(10000); /* default timeout of 10 seconds */
|
||||||
fe->conf.file = strdup(file);
|
fe->conf.file = strdup(file);
|
||||||
fe->conf.line = line;
|
fe->conf.line = line;
|
||||||
|
fe->accept = stats_accept;
|
||||||
return fe;
|
return fe;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,28 +183,16 @@ static int stats_parse_global(char **args, int section_type, struct proxy *curpx
|
|||||||
char **err)
|
char **err)
|
||||||
{
|
{
|
||||||
struct bind_conf *bind_conf;
|
struct bind_conf *bind_conf;
|
||||||
|
struct listener *l;
|
||||||
|
|
||||||
if (!strcmp(args[1], "socket")) {
|
if (!strcmp(args[1], "socket")) {
|
||||||
struct sockaddr_un *su;
|
|
||||||
int cur_arg;
|
int cur_arg;
|
||||||
|
|
||||||
if (*args[2] == 0) {
|
if (*args[2] == 0) {
|
||||||
memprintf(err, "'%s %s' in global section expects a path to a UNIX socket", args[0], args[1]);
|
memprintf(err, "'%s %s' in global section expects an address or a path to a UNIX socket", args[0], args[1]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (global.stats_sock.state != LI_NEW) {
|
|
||||||
memprintf(err, "'%s %s' already specified in global section", args[0], args[1]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
su = str2sun(args[2]);
|
|
||||||
if (!su) {
|
|
||||||
memprintf(err, "'%s %s' : path would require truncation", args[0], args[1]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
memcpy(&global.stats_sock.addr, su, sizeof(struct sockaddr_un)); // guaranteed to fit
|
|
||||||
|
|
||||||
if (!global.stats_fe) {
|
if (!global.stats_fe) {
|
||||||
if ((global.stats_fe = alloc_stats_fe("GLOBAL", file, line)) == NULL) {
|
if ((global.stats_fe = alloc_stats_fe("GLOBAL", file, line)) == NULL) {
|
||||||
memprintf(err, "'%s %s' : out of memory trying to allocate a frontend", args[0], args[1]);
|
memprintf(err, "'%s %s' : out of memory trying to allocate a frontend", args[0], args[1]);
|
||||||
@ -214,19 +203,11 @@ static int stats_parse_global(char **args, int section_type, struct proxy *curpx
|
|||||||
bind_conf = bind_conf_alloc(&global.stats_fe->conf.bind, file, line, args[2]);
|
bind_conf = bind_conf_alloc(&global.stats_fe->conf.bind, file, line, args[2]);
|
||||||
bind_conf->level = ACCESS_LVL_OPER; /* default access level */
|
bind_conf->level = ACCESS_LVL_OPER; /* default access level */
|
||||||
|
|
||||||
global.stats_sock.state = LI_INIT;
|
if (!str2listener(args[2], global.stats_fe, bind_conf, file, line, err)) {
|
||||||
global.stats_sock.options = LI_O_UNLIMITED;
|
memprintf(err, "parsing [%s:%d] : '%s %s' : %s\n",
|
||||||
global.stats_sock.accept = session_accept;
|
file, line, args[0], args[1], err && *err ? *err : "error");
|
||||||
global.stats_fe->accept = stats_accept;
|
return -1;
|
||||||
global.stats_sock.handler = process_session;
|
}
|
||||||
global.stats_sock.analysers = 0;
|
|
||||||
global.stats_sock.nice = -64; /* we want to boost priority for local stats */
|
|
||||||
global.stats_sock.frontend = global.stats_fe;
|
|
||||||
global.stats_sock.maxconn = global.stats_fe->maxconn;
|
|
||||||
global.stats_sock.timeout = &global.stats_fe->timeout.client;
|
|
||||||
global.stats_sock.bind_conf = bind_conf;
|
|
||||||
LIST_ADDQ(&global.stats_fe->conf.listeners, &global.stats_sock.by_fe);
|
|
||||||
LIST_ADDQ(&bind_conf->listeners, &global.stats_sock.by_bind);
|
|
||||||
|
|
||||||
cur_arg = 3;
|
cur_arg = 3;
|
||||||
while (*args[cur_arg]) {
|
while (*args[cur_arg]) {
|
||||||
@ -283,9 +264,16 @@ static int stats_parse_global(char **args, int section_type, struct proxy *curpx
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
global.stats_sock.data = &raw_sock;
|
list_for_each_entry(l, &bind_conf->listeners, by_bind) {
|
||||||
uxst_add_listener(&global.stats_sock);
|
l->maxconn = global.stats_fe->maxconn;
|
||||||
global.maxsock++;
|
l->backlog = global.stats_fe->backlog;
|
||||||
|
l->timeout = &global.stats_fe->timeout.client;
|
||||||
|
l->accept = session_accept;
|
||||||
|
l->handler = process_session;
|
||||||
|
l->options |= LI_O_UNLIMITED; /* don't make the peers subject to global limits */
|
||||||
|
l->nice = -64; /* we want to boost priority for local stats */
|
||||||
|
global.maxsock += l->maxconn;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (!strcmp(args[1], "timeout")) {
|
else if (!strcmp(args[1], "timeout")) {
|
||||||
unsigned timeout;
|
unsigned timeout;
|
||||||
|
Loading…
Reference in New Issue
Block a user