struct arg_list args; /* sample arg list that need to be resolved */
struct ebpt_node by_name; /* proxies are stored sorted by name here */
struct list lf_checks; /* list of logformats found in the proxy section that needs to be checked during postparse */
- struct eb_root log_steps; /* tree of log origins where log should be generated during request handling */
+ struct log_steps log_steps; /* bitfield of log origins where log should be generated during request handling */
const char *file_prev; /* file of the previous instance found with the same name, or NULL */
int line_prev; /* line of the previous instance found with the same name, or 0 */
unsigned int refcount; /* refcount on this proxy (only used for default proxy for now) */
*/
int log_orig_proxy(enum log_orig_id orig, struct proxy *px)
{
- if (eb_is_empty(&px->conf.log_steps)) {
- /* empty tree means all log steps are enabled, thus
+ if (px->conf.log_steps.steps_1 == 0) {
+ /* logstep bitmasks to 0 means all log steps are enabled, thus
* all log origins are considered
*/
return 1;
/* selectively check if the current log origin is referenced in
* proxy log-steps
*/
- return !!eb32_lookup(&px->conf.log_steps, orig);
+ return (px->conf.log_steps.steps_1 & (1ULL << orig));
}
/*
goto end;
}
cur_step->key = cur_id;
- eb32_insert(&curpx->conf.log_steps, cur_step);
+ BUG_ON(cur_id > 64); // for now we don't support more than 64 log origins
+ curpx->conf.log_steps.steps_1 |= (1ULL << cur_id);
next:
if (str[cur_sep])
str += cur_sep + 1;
struct acl *acl, *aclb;
struct logger *log, *logb;
struct lf_expr *lf, *lfb;
- struct eb32_node *node;
/* note that the node's key points to p->id */
ebpt_delete(&px->conf.by_name);
chunk_destroy(&px->log_tag);
- node = eb32_first(&px->conf.log_steps);
- while (node) {
- struct eb32_node *prev_node = node;
-
- /* log steps directly use the node key as id, they are not encapsulated */
- node = eb32_next(node);
- eb32_delete(prev_node);
- free(prev_node);
- }
-
free_email_alert(px);
stats_uri_auth_drop(px->uri_auth);
px->uri_auth = NULL;
p->conf.used_listener_id = EB_ROOT;
p->conf.used_server_id = EB_ROOT;
p->used_server_addr = EB_ROOT_UNIQUE;
- p->conf.log_steps = EB_ROOT_UNIQUE;
/* Timeouts are defined as -1 */
proxy_reset_timeouts(p);
{
struct logger *tmplogger;
char *tmpmsg = NULL;
- struct eb32_node *node = NULL;
/* set default values from the specified default proxy */
curproxy->email_alert.level = defproxy->email_alert.level;
curproxy->email_alert.flags = defproxy->email_alert.flags;
- /* defproxy is const pointer, so we need to typecast log_steps to
- * drop the const in order to use EB tree API, please note however
- * that the operations performed below should theoretically be read-only
- */
if (curproxy->cap & PR_CAP_FE) // don't inherit on backends
- node = eb32_first((struct eb_root *)&defproxy->conf.log_steps);
- while (node) {
- struct eb32_node *new_node;
-
- new_node = malloc(sizeof(*new_node));
- if (!new_node) {
- memprintf(errmsg, "proxy '%s': out of memory for log_steps option", curproxy->id);
- return 1;
- }
-
- new_node->key = node->key;
- eb32_insert(&curproxy->conf.log_steps, new_node);
- node = eb32_next(node);
- }
+ curproxy->conf.log_steps = defproxy->conf.log_steps;
return 0;
}