Hello!

Last night I was beating my head against the wall over this piece of config:

acl toggle_delay str(delay),map(opt@/etc/haproxy/maps/toggles.map,on) -m str on

acl toggle_guard str(guard),map(opt@/etc/haproxy/maps/toggles.map,off) -m str on

acl toggle_ipinfo str(ipinfo),map(opt@/etc/haproxy/maps/toggles.map,on) -m str 
on

The map:

delay on
guard off
ipinfo on

I expected that I could enable guard via runtime CLI, but it wasn't working, 
e.g. as a test I did:

http-request deny if toggle_guard

Yet the request wasn't being denied when setting guard to on.

Then I did some show maps and noticed this:

# id (file) description
137 (/etc/haproxy/maps/toggles.map) pattern loaded from file 
'opt@/etc/haproxy/maps/toggles.map' used by map at file 
'/etc/haproxy/haproxy.cfg' line 605. curr_ver=0 next_ver=0 entry_cnt=3
138 (/etc/haproxy/maps/toggles.map) pattern loaded from file 
'opt@/etc/haproxy/maps/toggles.map' used by map at file 
'/etc/haproxy/haproxy.cfg' line 606. curr_ver=0 next_ver=0 entry_cnt=3
139 (/etc/haproxy/maps/toggles.map) pattern loaded from file 
'opt@/etc/haproxy/maps/toggles.map' used by map at file 
'/etc/haproxy/haproxy.cfg' line 607. curr_ver=0 next_ver=0 entry_cnt=3

So it looks like haproxy creates three separate instances of this map, and 
doing a 'set map /etc/haproxy/maps/toggles.map ...' only updates the first 
entry! I would have expected haproxy to create just one instance of the map, 
and to reference that same instance in subsequent calls. I can not find 
anything in the docs about this at all.

I don't know where I got the idea to use toggles like this, but I swear they 
did more than one ACL each using map() for the lookup, but I can't find this 
anywhere either. Every example uses just one toggle + ACL entry, or uses a 
"use_backend ..." call to dynamically route traffic.

Thought I'd email in to see if I'm doing something wrong, or if there is 
perhaps a better way to do this. I can't seem to find anyone doing something 
like this anywhere else!

If I want to support multiple toggles like this with just one map entry per 
file, is the only way to do this via multiple maps, or changing the logic of my 
scripts to do a "show map" first, get the IDs, then loop through and "set map 
..." on each ID? Which I guess wouldn't be too hard to do.

Thanks,
Brendon


Reply via email to