On Fri, 2 Nov 2007, Krzysztof Oledzki wrote:
<CUT>
>> I will see if I find a way to do that test very easily, but I think I
>> have an idea.
>
> Actually, I believe one of my patches, I have developed for some time, can be
> very easily adopted to do this. If you can wait a day or two I can post
> finished version with this additional improvement.
Here it is, much faster than previously announced. ;) Below you can find the stripped version of mentioned patch, with unready parts removed, but extended to do what I hope you had expected. RFC quality so not for commit this time.
This patch:
diff -Nur haproxy-1.3.13-orig/include/proto/proxy.h haproxy-1.3.13-gpf/include/proto/proxy.h
--- haproxy-1.3.13-orig/include/proto/proxy.h 2007-10-18 22:38:22.000000000 +0200 +++ haproxy-1.3.13-gpf/include/proto/proxy.h 2007-11-02 02:14:14.000000000 +0100@@ -33,7 +33,7 @@
#endif /* _PROTO_PROXY_H */
diff -Nur haproxy-1.3.13-orig/src/cfgparse.c haproxy-1.3.13-gpf/src/cfgparse.c
--- haproxy-1.3.13-orig/src/cfgparse.c 2007-11-02 01:12:24.000000000 +0100 +++ haproxy-1.3.13-gpf/src/cfgparse.c 2007-11-02 03:02:15.000000000 +0100 @@ -494,6 +494,38 @@ tv_eternity(&defproxy.appsession_timeout);}
+struct proxy *findproxy(const char *name, int mode) { + + struct proxy *curproxy, *target=NULL; + + for (curproxy = proxy; curproxy; curproxy = curproxy->next) { + if (!(curproxy->cap & PR_CAP_BE) || strcmp(curproxy->id, name)) + continue; + + if (curproxy->mode != mode) { + Alert("Unable to use proxy '%s' with wrong mode, required: %s, has: %s.\n", + name, proxy_mode_str(mode), proxy_mode_str(curproxy->mode)); + Alert("You man want to use 'mode %s'.\n", proxy_mode_str(mode)); + return NULL; + } + + if (!target) { + target = curproxy; + continue; + } + + Alert("Refused to use duplicated proxy '%s' with conflicting capabilities: %X/%X!\n", + name, curproxy->cap, target->cap); + + return NULL; + } + + if (!target) + Alert("Proxy '%s' with backend capability was not found!\n", name); + + return target; +} + /*
if ((curproxy = (struct proxy *)calloc(1, sizeof(struct proxy))) == NULL) { @@ -2553,21 +2584,14 @@
if (curproxy->defbe.name) { struct proxy *target; - for (target = proxy; target != NULL; target = target->next) { - if ((target->cap & PR_CAP_BE) && !strcmp(target->id, curproxy->defbe.name)) - break; - } - if (target == NULL) { - Alert("parsing %s: default proxy '%s' with backend capability in HTTP %s '%s' was not found!\n", - file, curproxy->defbe.name, proxy_type_str(curproxy), curproxy->id); + target = findproxy(curproxy->defbe.name, curproxy->mode); + if (!target) { + Alert("Proxy '%s': unable to find required default_backend: '%s'.\n", + curproxy->id, curproxy->defbe.name); cfgerr++; } else if (target == curproxy) { - Alert("parsing %s : loop detected for default backend %s !\n", file, curproxy->defbe.name); - cfgerr++; - } else if (target->mode != curproxy->mode) { - Alert("parsing %s : default backend '%s' in HTTP %s '%s' is not of same mode (tcp/http) !\n", - file, curproxy->defbe.name, proxy_type_str(curproxy), curproxy->id); - cfgerr++; + Alert("Proxy '%s': loop detected for default_backend: '%s'.\n", + curproxy->id, curproxy->defbe.name); } else { free(curproxy->defbe.name); curproxy->defbe.be = target; @@ -2578,24 +2602,20 @@ if (curproxy->mode == PR_MODE_HTTP && curproxy->req_exp != NULL) { /* map jump target for ACT_SETBE in req_rep chain */ struct hdr_exp *exp; - struct proxy *target; for (exp = curproxy->req_exp; exp != NULL; exp = exp->next) { + struct proxy *target; + if (exp->action != ACT_SETBE) continue; - for (target = proxy; target != NULL; target = target->next) { - if ((target->cap & PR_CAP_BE) && !strcmp(target->id, exp->replace)) - break; - } - if (target == NULL) { - Alert("parsing %s: proxy '%s' with backend capability in HTTP %s '%s' was not found!\n", - file, exp->replace, proxy_type_str(curproxy), curproxy->id); + + target = findproxy(exp->replace, PR_MODE_HTTP); + if (!target) { + Alert("Proxy '%s': unable to find required setbe: '%s'.\n", + curproxy->id, exp->replace); cfgerr++; } else if (target == curproxy) { - Alert("parsing %s : loop detected for backend %s !\n", file, exp->replace); - cfgerr++; - } else if (target->mode != PR_MODE_HTTP) { - Alert("parsing %s : backend '%s' in HTTP %s '%s' is not HTTP (use 'mode http') !\n", - file, exp->replace, proxy_type_str(curproxy), curproxy->id); + Alert("Proxy '%s': loop detected for setbe: '%s'.\n", + curproxy->id, exp->replace); cfgerr++; } else { free((void *)exp->replace);
/* find the target proxy for 'use_backend' rules */ list_for_each_entry(rule, &curproxy->switching_rules, list) { - /* map jump target for ACT_SETBE in req_rep chain */ struct proxy *target; - for (target = proxy; target != NULL; target = target->next) { - if ((target->cap & PR_CAP_BE) && !strcmp(target->id, rule->be.name)) - break; - } + target = findproxy(rule->be.name, curproxy->mode); - if (target == NULL) { - Alert("parsing %s: proxy '%s' with backend capability in HTTP %s '%s' was not found!\n", - file, rule->be.name, proxy_type_str(curproxy), curproxy->id); + if (!target) { + Alert("Proxy '%s': unable to find required use_backend: '%s'.\n", + curproxy->id, rule->be.name); cfgerr++; } else if (target == curproxy) { - Alert("parsing %s : loop detected for backend %s !\n", file, rule->be.name); - cfgerr++; - } else if (target->mode != curproxy->mode) { - Alert("parsing %s : backend '%s' referenced in %s '%s' is of different mode !\n", - file, rule->be.name, proxy_type_str(curproxy), curproxy->id); + Alert("Proxy '%s': loop detected for use_backend: '%s'.\n", + curproxy->id, rule->be.name); cfgerr++; } else { free((void *)rule->be.name); diff -Nur haproxy-1.3.13-orig/src/proxy.c haproxy-1.3.13-gpf/src/proxy.c --- haproxy-1.3.13-orig/src/proxy.c 2007-10-18 22:38:22.000000000 +0200 +++ haproxy-1.3.13-gpf/src/proxy.c 2007-11-02 02:13:59.000000000 +0100 @@ -54,6 +54,22 @@ return "proxy";
+/* + * This function returns a string containing the mode of the proxy in a format + * suitable for error messages. + */ + +const char *proxy_mode_str(int mode) { + + if (mode == PR_MODE_TCP) + return "tcp"; + else if (mode == PR_MODE_HTTP) + return "http"; + else if (mode == PR_MODE_HEALTH) + return "health"; + else + return "unknown"; +}
/*
Best regards,
Krzysztof Olędzki Received on 2007/11/02 03:09
This archive was generated by hypermail 2.2.0 : 2007/11/04 19:21 CET