On 2013/8/8 18:50, Mark Brooks wrote:
The issue I am seeing is that using the dev version of HAProxy
1.5-dev19 git commit id 00f0084752eab236af80e61291d672e835790cff

I have a source IP stick table and im trying to drop specific entries
from it but its resulting in the whole table being dropped each time.

My table looks like this -

0x24a8294: key=192.168.136.10 use=0 exp=1761492 server_id=3
0x24a8344: key=192.168.136.11 use=0 exp=1761506 server_id=2
0x24a83f4: key=192.168.136.12 use=0 exp=1761520 server_id=3
0x24a84a4: key=192.168.136.13 use=0 exp=1761534 server_id=2
0x24a8554: key=192.168.136.14 use=0 exp=1761548 server_id=3
0x24a8604: key=192.168.136.15 use=0 exp=1761563 server_id=2
0x24a86b4: key=192.168.136.16 use=0 exp=1761580 server_id=3
0x24a8764: key=192.168.136.17 use=0 exp=1761592 server_id=2
0x24a8814: key=192.168.136.18 use=0 exp=1761607 server_id=3
0x24a88c4: key=192.168.136.19 use=0 exp=1761622 server_id=2
0x24a8974: key=192.168.136.20 use=0 exp=1761636 server_id=3
0x24a8a24: key=192.168.136.21 use=0 exp=1761649 server_id=2

im running the command -

socat unix-connect:/var/run/haproxy.stat stdio <<< 'clear table
VIP_Name-2 data.server_id eq 2'

Id assume that the entries with server_id = 2 would be removed but its
removing everything each time.


My Configuration file is below -

listen VIP_Name-2
bind 192.168.138.2:80 transparent
mode http
balance leastconn
stick-table type ip size 10240k expire 30m
stick on src
server backup 127.0.0.1:9081 backup  non-stick
option httpclose
option forwardfor
option redispatch
option abortonclose
maxconn 40000
log global
option httplog
server RIP_Name 192.168.66.50  weight 100  check port 80  inter 2000
rise 2  fall 3 minconn 0  maxconn 0  on-marked-down shutdown-sessions
server RIP_Name-1 192.168.66.51  weight 100  check port 80  inter 2000
  rise 2  fall 3 minconn 0  maxconn 0  on-marked-down shutdown-sessions

Thanks

Mark



Hi Mark,

I have got the same problem with you. It may be a bug which can also reproduce while showing an specified data type with such command as below:
        show table <table-name> data.server_id <id>

stats_table_request() in dumpstat.c are called to delete stick entries. The main codes are as follow:

 if (show && !skip_entry &&
!stats_dump_table_entry_to_buffer(&trash, si, si->applet.ctx.table.proxy,
                       si->applet.ctx.table.entry))
     return 0;

 si->applet.ctx.table.entry->ref_cnt--;

 eb = ebmb_next(&si->applet.ctx.table.entry->key);
 if (eb) {
     struct stksess *old = si->applet.ctx.table.entry;
     si->applet.ctx.table.entry = ebmb_entry(eb, struct stksess, key);
     if (show)
         stksess_kill_if_expired(&si->applet.ctx.table.proxy->table, old);
     else
         stksess_kill(&si->applet.ctx.table.proxy->table, old);
     si->applet.ctx.table.entry->ref_cnt++;
     break;
 }

It seems that skip_entry should be checked also while calling stksess_kill() since the entry is marked as skipped to be deleted.

I have tried to fix this problem but a pity that I cannot fix it completely by now. :-(

--
Best Regards,
Godbach

Reply via email to