diff mbox series

[ovs-dev,v2] controller: Add config option per LB to enable/disable CT flush

Message ID 20230317071422.214842-1-amusil@redhat.com
State Changes Requested
Headers show
Series [ovs-dev,v2] controller: Add config option per LB to enable/disable CT flush | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/github-robot-_ovn-kubernetes success github build: passed

Commit Message

Ales Musil March 17, 2023, 7:14 a.m. UTC
The CT flush was enabled by default for every LB, add
config option called "ct_flush" that allows
users to enable/disable the CT flush. The CT flush option
is set to "false" by default.

Reported-at: https://bugzilla.redhat.com/2178962
Signed-off-by: Ales Musil <amusil@redhat.com>
---
v2: Make the feature opt-in.
    Store the flag in 'struct ovn_controller_lb'.
---
 NEWS                        |  2 ++
 controller/ovn-controller.c |  6 ++++--
 lib/lb.c                    |  3 +++
 lib/lb.h                    |  1 +
 ovn-nb.xml                  |  6 ++++++
 tests/ovn.at                | 28 +++++++++++++++++++++++++---
 tests/system-ovn.at         | 36 ++++++++++++++++++++++++++++++------
 7 files changed, 71 insertions(+), 11 deletions(-)

Comments

Dumitru Ceara March 17, 2023, 9:33 a.m. UTC | #1
On 3/17/23 08:14, Ales Musil wrote:
> The CT flush was enabled by default for every LB, add
> config option called "ct_flush" that allows
> users to enable/disable the CT flush. The CT flush option
> is set to "false" by default.
> 
> Reported-at: https://bugzilla.redhat.com/2178962
> Signed-off-by: Ales Musil <amusil@redhat.com>
> ---

Hi Ales,

> v2: Make the feature opt-in.

I agree with this (as mentioned on v1).

>     Store the flag in 'struct ovn_controller_lb'.
> ---
>  NEWS                        |  2 ++
>  controller/ovn-controller.c |  6 ++++--
>  lib/lb.c                    |  3 +++
>  lib/lb.h                    |  1 +
>  ovn-nb.xml                  |  6 ++++++
>  tests/ovn.at                | 28 +++++++++++++++++++++++++---
>  tests/system-ovn.at         | 36 ++++++++++++++++++++++++++++++------
>  7 files changed, 71 insertions(+), 11 deletions(-)
> 

Overall the change looks good to me.  I only have some minor comments
below.  The most important is the missing NEWS default value change
notification.

> diff --git a/NEWS b/NEWS
> index 637adcff3..085b1603a 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -2,6 +2,8 @@ Post v23.03.0
>  -------------
>    - Enhance LSP.options:arp_proxy to support IPv6, configurable MAC
>      addresses and CIDRs.
> +  - Add an option for LBs called "ct_flush" that allows CMS to specify
> +    if ovn-controller should flush related CT entries for removed LB backends.
>  

We really need to mention that this is opt-in now.  So maybe something
like "By default, this option is set to false, i.e., CT entries are not
flushed when load balancer backends are removed.".  Does this sound OK?

>  OVN v23.03.0 - 03 Mar 2023
>  --------------------------
> diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
> index 7dcbfd252..64f4d6a2a 100644
> --- a/controller/ovn-controller.c
> +++ b/controller/ovn-controller.c
> @@ -2697,7 +2697,8 @@ static void
>  lb_data_removed_five_tuples_add(struct ed_type_lb_data *lb_data,
>                                  const struct ovn_controller_lb *lb)
>  {
> -    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT)) {
> +    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT) ||
> +        !lb->ct_flush) {
>          return;
>      }
>  
> @@ -2716,7 +2717,8 @@ static void
>  lb_data_removed_five_tuples_remove(struct ed_type_lb_data *lb_data,
>                                     const struct ovn_controller_lb *lb)
>  {
> -    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT)) {
> +    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT) ||
> +        !lb->ct_flush) {
>          return;
>      }
>  
> diff --git a/lib/lb.c b/lib/lb.c
> index e941434c4..252ad3748 100644
> --- a/lib/lb.c
> +++ b/lib/lb.c
> @@ -798,6 +798,9 @@ ovn_controller_lb_create(const struct sbrec_load_balancer *sbrec_lb,
>      lb->hairpin_orig_tuple = smap_get_bool(&sbrec_lb->options,
>                                             "hairpin_orig_tuple",
>                                             false);
> +

Nit: I'd remove this newline.

> +    lb->ct_flush = smap_get_bool(&sbrec_lb->options, "ct_flush", false);
> +

Nit: I'd remove this newline too.

>      ovn_lb_get_hairpin_snat_ip(&sbrec_lb->header_.uuid, &sbrec_lb->options,
>                                 &lb->hairpin_snat_ips);
>      return lb;
> diff --git a/lib/lb.h b/lib/lb.h
> index 7a67b7426..22254815d 100644
> --- a/lib/lb.h
> +++ b/lib/lb.h
> @@ -193,6 +193,7 @@ struct ovn_controller_lb {
>                                                * as source for hairpinned
>                                                * traffic.
>                                                */
> +    bool ct_flush;
>  };
>  

With this I get:

$ pahole lib/lb.o
[...]
struct ovn_controller_lb {
        struct hmap_node           hmap_node;            /*     0    16 */
        const struct sbrec_load_balancer  * slb;         /*    16     8 */
        uint8_t                    proto;                /*    24     1 */

        /* XXX 7 bytes hole, try to pack */

        struct ovn_lb_vip *        vips;                 /*    32     8 */
        size_t                     n_vips;               /*    40     8 */
        _Bool                      hairpin_orig_tuple;   /*    48     1 */

        /* XXX 7 bytes hole, try to pack */

        struct lport_addresses     hairpin_snat_ips;     /*    56    56 */
        /* --- cacheline 1 boundary (64 bytes) was 48 bytes ago --- */
        _Bool                      ct_flush;             /*   112     1 */

        /* size: 120, cachelines: 2, members: 8 */
        /* sum members: 99, holes: 2, sum holes: 14 */
        /* padding: 7 */
        /* last cacheline: 56 bytes */
};

Nit: I'd move 'ct_flush' just after 'hairpin_orig_tuple'.  Although,
there's more packing we could do here but that's not a problem of
this patch.

Also, please add a comment for 'ct_flush'.

>  struct ovn_controller_lb *ovn_controller_lb_create(
> diff --git a/ovn-nb.xml b/ovn-nb.xml
> index 73f707aa0..aec8a2284 100644
> --- a/ovn-nb.xml
> +++ b/ovn-nb.xml
> @@ -2041,6 +2041,12 @@ or
>          the affinity timeslot. Max supported affinity_timeout is 65535
>          seconds.
>        </column>
> +
> +      <column name="options" key="ct_flush" type='{"type": "boolean"}'>
> +        The value indicates whether ovn-controller should flush CT entries
> +        that are related to this LB when the backends are removed. Being set
> +        to <code>false</code> by default.

Nit: This doesn't sound like a sentence to me.  I think I'd rephrase to:
"This option is set to <code>false</code> by default.".

> +      </column>
>      </group>
>    </table>
>  
> diff --git a/tests/ovn.at b/tests/ovn.at
> index fa786112c..c1f6edda7 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -34997,7 +34997,8 @@ check ovs-vsctl add-port br-int p1 -- set interface p1 external_ids:iface-id=lsp
>  wait_for_ports_up
>  ovn-nbctl --wait=hv sync
>  
> -check ovn-nbctl lb-add lb1 "192.168.0.10" "192.168.10.10,192.168.10.20"
> +check ovn-nbctl lb-add lb1 "192.168.0.10" "192.168.10.10,192.168.10.20" \
> +-- set load_balancer lb1 options:ct_flush="true"

Nit: I'd indent this 4 spaces to the right.

>  check ovn-nbctl ls-lb-add sw lb1
>  
>  # Remove a single backend
> @@ -35020,7 +35021,8 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.0.10:0, backend=192.168.
>  AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.0.10:0, backend=192.168.10.30:0, protocol=0" hv1/ovn-controller.log], [0])
>  
>  # Check flush for LB with port and protocol
> -check ovn-nbctl lb-add lb1 "192.168.30.10:80" "192.168.40.10:8080,192.168.40.20:8090" udp
> +check ovn-nbctl lb-add lb1 "192.168.30.10:80" "192.168.40.10:8080,192.168.40.20:8090" udp \
> +-- set load_balancer lb1 options:ct_flush="true"

Nit: here too.

>  check ovn-nbctl ls-lb-add sw lb1
>  check ovn-nbctl lb-del lb1
>  check ovn-nbctl --wait=hv sync
> @@ -35029,7 +35031,8 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.30.10:80, backend=192.16
>  AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.30.10:80, backend=192.168.40.20:8090, protocol=17" hv1/ovn-controller.log], [0])
>  
>  # Check recompute when LB is no longer local
> -check ovn-nbctl lb-add lb1 "192.168.50.10:80" "192.168.60.10:8080"
> +check ovn-nbctl lb-add lb1 "192.168.50.10:80" "192.168.60.10:8080" \
> +-- set load_balancer lb1 options:ct_flush="true"

Ditto.

>  check ovn-nbctl ls-lb-add sw lb1
>  check ovs-vsctl remove interface p1 external_ids iface-id
>  check ovn-appctl inc-engine/recompute
> @@ -35039,6 +35042,25 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.50.10:80, backend=192.16
>  
>  AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple" hv1/ovn-controller.log)" = "6"], [0])
>  
> +# Check if CT flush is disabled by default
> +check ovn-nbctl lb-del lb1
> +check ovn-nbctl lb-add lb1 "192.168.70.10:80" "192.168.80.10:8080,192.168.90.10:8080"
> +check ovn-nbctl ls-lb-add sw lb1
> +check ovs-vsctl set interface p1 external_ids:iface-id=lsp1
> +check ovn-nbctl --wait=hv sync
> +
> +#AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple" hv1/ovn-controller.log)" = "6"], [0])

Hmm, shouldn't this be un-commented?

> +
> +# Remove one backend
> +check ovn-nbctl --wait=hv set load_balancer lb1 vips='"192.168.70.10:80"="192.168.80.10:8080"'
> +
> +#AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.70.10:80, backend=192.168.90.10:8080, protocol=6" hv1/ovn-controller.log], [1])
> +#AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple" hv1/ovn-controller.log)" = "6"], [0])

These too?

> +
> +check ovn-nbctl --wait=hv lb-del lb1
> +AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.70.10:80, backend=192.168.80.10:8080, protocol=6" hv1/ovn-controller.log], [1])
> +AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple" hv1/ovn-controller.log)" = "6"], [0])
> +
>  OVN_CLEANUP([hv1])
>  AT_CLEANUP
>  ])
> diff --git a/tests/system-ovn.at b/tests/system-ovn.at
> index ad1188078..d6fe968fc 100644
> --- a/tests/system-ovn.at
> +++ b/tests/system-ovn.at
> @@ -9993,11 +9993,13 @@ check ovn-nbctl lsp-add bar bar3 \
>  -- lsp-set-addresses bar3 "f0:00:0f:01:02:05 172.16.1.4"
>  
>  # Config OVN load-balancer with a VIP.
> -check ovn-nbctl lb-add lb1 30.0.0.1 "172.16.1.2,172.16.1.3,172.16.1.4"
> +check ovn-nbctl lb-add lb1 30.0.0.1 "172.16.1.2,172.16.1.3,172.16.1.4" \
> +-- set load_balancer lb1 options:ct_flush="true"

Nit: indent.

>  check ovn-nbctl ls-lb-add foo lb1
>  
>  # Create another load-balancer with another VIP.
>  lb2_uuid=`ovn-nbctl create load_balancer name=lb2 vips:30.0.0.3="172.16.1.2,172.16.1.3,172.16.1.4"`
> +check ovn-nbctl set load_balancer lb2 options:ct_flush="true"
>  check ovn-nbctl ls-lb-add foo lb2
>  
>  # Config OVN load-balancer with another VIP (this time with ports).
> @@ -10013,16 +10015,18 @@ OVS_START_L7([bar1], [http])
>  OVS_START_L7([bar2], [http])
>  OVS_START_L7([bar3], [http])
>  
> -OVS_WAIT_FOR_OUTPUT([
> -    for i in `seq 1 20`; do
> -        ip netns exec foo1 wget 30.0.0.1 -t 5 -T 1 --retry-connrefused -v -o wget$i.log;
> -    done
> -    ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [dnl
> +m4_define([LB1_CT_ENTRIES], [dnl
>  tcp,orig=(src=192.168.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.1.2,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
>  tcp,orig=(src=192.168.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.1.3,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
>  tcp,orig=(src=192.168.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.1.4,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
>  ])
>  
> +OVS_WAIT_FOR_OUTPUT([
> +    for i in `seq 1 20`; do
> +        ip netns exec foo1 wget 30.0.0.1 -t 5 -T 1 --retry-connrefused -v -o wget$i.log;
> +    done
> +    ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
> +
>  OVS_WAIT_FOR_OUTPUT([
>      for i in `seq 1 20`; do
>          ip netns exec foo1 wget 30.0.0.2:8000 -t 5 -T 1 --retry-connrefused -v -o wget$i.log;
> @@ -10096,6 +10100,26 @@ check ovn-nbctl lb-del lb2
>  
>  OVS_WAIT_UNTIL([test "$(ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.3) | wc -l)" = "0"])
>  
> +# Check that LB has CT flush disabled by default
> +check ovn-nbctl lb-add lb1 30.0.0.1 "172.16.1.2,172.16.1.3,172.16.1.4"
> +check ovn-nbctl ls-lb-add foo lb1
> +
> +OVS_WAIT_FOR_OUTPUT([
> +    for i in `seq 1 20`; do
> +        ip netns exec foo1 wget 30.0.0.1 -t 5 -T 1 --retry-connrefused -v -o wget$i.log;
> +    done
> +    ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
> +
> +# Remove one backend
> +check ovn-nbctl --wait=hv set load_balancer lb1 vips='"30.0.0.1"="172.16.1.2,172.16.1.3"'
> +
> +AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
> +
> +# Remove whole LB
> +check ovn-nbctl --wait=hv lb-del lb1
> +
> +AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
> +
>  OVS_APP_EXIT_AND_WAIT([ovn-controller])
>  
>  as ovn-sb

Thanks,
Dumitru
Ales Musil March 17, 2023, 9:50 a.m. UTC | #2
On Fri, Mar 17, 2023 at 10:33 AM Dumitru Ceara <dceara@redhat.com> wrote:

> On 3/17/23 08:14, Ales Musil wrote:
> > The CT flush was enabled by default for every LB, add
> > config option called "ct_flush" that allows
> > users to enable/disable the CT flush. The CT flush option
> > is set to "false" by default.
> >
> > Reported-at: https://bugzilla.redhat.com/2178962
> > Signed-off-by: Ales Musil <amusil@redhat.com>
> > ---
>
> Hi Ales,
>

Hi Dumitru,

thank you for the review.


> > v2: Make the feature opt-in.
>
> I agree with this (as mentioned on v1).
>
> >     Store the flag in 'struct ovn_controller_lb'.
> > ---
> >  NEWS                        |  2 ++
> >  controller/ovn-controller.c |  6 ++++--
> >  lib/lb.c                    |  3 +++
> >  lib/lb.h                    |  1 +
> >  ovn-nb.xml                  |  6 ++++++
> >  tests/ovn.at                | 28 +++++++++++++++++++++++++---
> >  tests/system-ovn.at         | 36 ++++++++++++++++++++++++++++++------
> >  7 files changed, 71 insertions(+), 11 deletions(-)
> >
>
> Overall the change looks good to me.  I only have some minor comments
> below.  The most important is the missing NEWS default value change
> notification.
>
> > diff --git a/NEWS b/NEWS
> > index 637adcff3..085b1603a 100644
> > --- a/NEWS
> > +++ b/NEWS
> > @@ -2,6 +2,8 @@ Post v23.03.0
> >  -------------
> >    - Enhance LSP.options:arp_proxy to support IPv6, configurable MAC
> >      addresses and CIDRs.
> > +  - Add an option for LBs called "ct_flush" that allows CMS to specify
> > +    if ovn-controller should flush related CT entries for removed LB
> backends.
> >
>
> We really need to mention that this is opt-in now.  So maybe something
> like "By default, this option is set to false, i.e., CT entries are not
> flushed when load balancer backends are removed.".  Does this sound OK?
>

Agreed, added in v3.


>
> >  OVN v23.03.0 - 03 Mar 2023
> >  --------------------------
> > diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
> > index 7dcbfd252..64f4d6a2a 100644
> > --- a/controller/ovn-controller.c
> > +++ b/controller/ovn-controller.c
> > @@ -2697,7 +2697,8 @@ static void
> >  lb_data_removed_five_tuples_add(struct ed_type_lb_data *lb_data,
> >                                  const struct ovn_controller_lb *lb)
> >  {
> > -    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT)) {
> > +    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT) ||
> > +        !lb->ct_flush) {
> >          return;
> >      }
> >
> > @@ -2716,7 +2717,8 @@ static void
> >  lb_data_removed_five_tuples_remove(struct ed_type_lb_data *lb_data,
> >                                     const struct ovn_controller_lb *lb)
> >  {
> > -    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT)) {
> > +    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT) ||
> > +        !lb->ct_flush) {
> >          return;
> >      }
> >
> > diff --git a/lib/lb.c b/lib/lb.c
> > index e941434c4..252ad3748 100644
> > --- a/lib/lb.c
> > +++ b/lib/lb.c
> > @@ -798,6 +798,9 @@ ovn_controller_lb_create(const struct
> sbrec_load_balancer *sbrec_lb,
> >      lb->hairpin_orig_tuple = smap_get_bool(&sbrec_lb->options,
> >                                             "hairpin_orig_tuple",
> >                                             false);
> > +
>
> Nit: I'd remove this newline.
>
> > +    lb->ct_flush = smap_get_bool(&sbrec_lb->options, "ct_flush", false);
> > +
>
> Nit: I'd remove this newline too.
>
> >      ovn_lb_get_hairpin_snat_ip(&sbrec_lb->header_.uuid,
> &sbrec_lb->options,
> >                                 &lb->hairpin_snat_ips);
> >      return lb;
> > diff --git a/lib/lb.h b/lib/lb.h
> > index 7a67b7426..22254815d 100644
> > --- a/lib/lb.h
> > +++ b/lib/lb.h
> > @@ -193,6 +193,7 @@ struct ovn_controller_lb {
> >                                                * as source for hairpinned
> >                                                * traffic.
> >                                                */
> > +    bool ct_flush;
> >  };
> >
>
> With this I get:
>
> $ pahole lib/lb.o
> [...]
> struct ovn_controller_lb {
>         struct hmap_node           hmap_node;            /*     0    16 */
>         const struct sbrec_load_balancer  * slb;         /*    16     8 */
>         uint8_t                    proto;                /*    24     1 */
>
>         /* XXX 7 bytes hole, try to pack */
>
>         struct ovn_lb_vip *        vips;                 /*    32     8 */
>         size_t                     n_vips;               /*    40     8 */
>         _Bool                      hairpin_orig_tuple;   /*    48     1 */
>
>         /* XXX 7 bytes hole, try to pack */
>
>         struct lport_addresses     hairpin_snat_ips;     /*    56    56 */
>         /* --- cacheline 1 boundary (64 bytes) was 48 bytes ago --- */
>         _Bool                      ct_flush;             /*   112     1 */
>
>         /* size: 120, cachelines: 2, members: 8 */
>         /* sum members: 99, holes: 2, sum holes: 14 */
>         /* padding: 7 */
>         /* last cacheline: 56 bytes */
> };
>
> Nit: I'd move 'ct_flush' just after 'hairpin_orig_tuple'.  Although,
> there's more packing we could do here but that's not a problem of
> this patch.
>

Maybe one day we can revisit most of the structures.
Fixed in v3.


>
> Also, please add a comment for 'ct_flush'.
>
> >  struct ovn_controller_lb *ovn_controller_lb_create(
> > diff --git a/ovn-nb.xml b/ovn-nb.xml
> > index 73f707aa0..aec8a2284 100644
> > --- a/ovn-nb.xml
> > +++ b/ovn-nb.xml
> > @@ -2041,6 +2041,12 @@ or
> >          the affinity timeslot. Max supported affinity_timeout is 65535
> >          seconds.
> >        </column>
> > +
> > +      <column name="options" key="ct_flush" type='{"type": "boolean"}'>
> > +        The value indicates whether ovn-controller should flush CT
> entries
> > +        that are related to this LB when the backends are removed.
> Being set
> > +        to <code>false</code> by default.
>
> Nit: This doesn't sound like a sentence to me.  I think I'd rephrase to:
> "This option is set to <code>false</code> by default.".
>
> > +      </column>
> >      </group>
> >    </table>
> >
> > diff --git a/tests/ovn.at b/tests/ovn.at
> > index fa786112c..c1f6edda7 100644
> > --- a/tests/ovn.at
> > +++ b/tests/ovn.at
> > @@ -34997,7 +34997,8 @@ check ovs-vsctl add-port br-int p1 -- set
> interface p1 external_ids:iface-id=lsp
> >  wait_for_ports_up
> >  ovn-nbctl --wait=hv sync
> >
> > -check ovn-nbctl lb-add lb1 "192.168.0.10" "192.168.10.10,192.168.10.20"
> > +check ovn-nbctl lb-add lb1 "192.168.0.10" "192.168.10.10,192.168.10.20"
> \
> > +-- set load_balancer lb1 options:ct_flush="true"
>
> Nit: I'd indent this 4 spaces to the right.
>
> >  check ovn-nbctl ls-lb-add sw lb1
> >
> >  # Remove a single backend
> > @@ -35020,7 +35021,8 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=
> 192.168.0.10:0, backend=192.168.
> >  AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.0.10:0,
> backend=192.168.10.30:0, protocol=0" hv1/ovn-controller.log], [0])
> >
> >  # Check flush for LB with port and protocol
> > -check ovn-nbctl lb-add lb1 "192.168.30.10:80" "192.168.40.10:8080,
> 192.168.40.20:8090" udp
> > +check ovn-nbctl lb-add lb1 "192.168.30.10:80" "192.168.40.10:8080,
> 192.168.40.20:8090" udp \
> > +-- set load_balancer lb1 options:ct_flush="true"
>
> Nit: here too.
>
> >  check ovn-nbctl ls-lb-add sw lb1
> >  check ovn-nbctl lb-del lb1
> >  check ovn-nbctl --wait=hv sync
> > @@ -35029,7 +35031,8 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=
> 192.168.30.10:80, backend=192.16
> >  AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.30.10:80,
> backend=192.168.40.20:8090, protocol=17" hv1/ovn-controller.log], [0])
> >
> >  # Check recompute when LB is no longer local
> > -check ovn-nbctl lb-add lb1 "192.168.50.10:80" "192.168.60.10:8080"
> > +check ovn-nbctl lb-add lb1 "192.168.50.10:80" "192.168.60.10:8080" \
> > +-- set load_balancer lb1 options:ct_flush="true"
>
> Ditto.
>
> >  check ovn-nbctl ls-lb-add sw lb1
> >  check ovs-vsctl remove interface p1 external_ids iface-id
> >  check ovn-appctl inc-engine/recompute
> > @@ -35039,6 +35042,25 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=
> 192.168.50.10:80, backend=192.16
> >
> >  AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple"
> hv1/ovn-controller.log)" = "6"], [0])
> >
> > +# Check if CT flush is disabled by default
> > +check ovn-nbctl lb-del lb1
> > +check ovn-nbctl lb-add lb1 "192.168.70.10:80" "192.168.80.10:8080,
> 192.168.90.10:8080"
> > +check ovn-nbctl ls-lb-add sw lb1
> > +check ovs-vsctl set interface p1 external_ids:iface-id=lsp1
> > +check ovn-nbctl --wait=hv sync
> > +
> > +#AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple"
> hv1/ovn-controller.log)" = "6"], [0])
>
> Hmm, shouldn't this be un-commented?
>
> > +
> > +# Remove one backend
> > +check ovn-nbctl --wait=hv set load_balancer lb1 vips='"192.168.70.10:80
> "="192.168.80.10:8080"'
> > +
> > +#AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.70.10:80,
> backend=192.168.90.10:8080, protocol=6" hv1/ovn-controller.log], [1])
> > +#AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple"
> hv1/ovn-controller.log)" = "6"], [0])
>
> These too?
>
> > +
> > +check ovn-nbctl --wait=hv lb-del lb1
> > +AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.70.10:80,
> backend=192.168.80.10:8080, protocol=6" hv1/ovn-controller.log], [1])
> > +AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple"
> hv1/ovn-controller.log)" = "6"], [0])
> > +
> >  OVN_CLEANUP([hv1])
> >  AT_CLEANUP
> >  ])
> > diff --git a/tests/system-ovn.at b/tests/system-ovn.at
> > index ad1188078..d6fe968fc 100644
> > --- a/tests/system-ovn.at
> > +++ b/tests/system-ovn.at
> > @@ -9993,11 +9993,13 @@ check ovn-nbctl lsp-add bar bar3 \
> >  -- lsp-set-addresses bar3 "f0:00:0f:01:02:05 172.16.1.4"
> >
> >  # Config OVN load-balancer with a VIP.
> > -check ovn-nbctl lb-add lb1 30.0.0.1 "172.16.1.2,172.16.1.3,172.16.1.4"
> > +check ovn-nbctl lb-add lb1 30.0.0.1 "172.16.1.2,172.16.1.3,172.16.1.4" \
> > +-- set load_balancer lb1 options:ct_flush="true"
>
> Nit: indent.
>
> >  check ovn-nbctl ls-lb-add foo lb1
> >
> >  # Create another load-balancer with another VIP.
> >  lb2_uuid=`ovn-nbctl create load_balancer name=lb2
> vips:30.0.0.3="172.16.1.2,172.16.1.3,172.16.1.4"`
> > +check ovn-nbctl set load_balancer lb2 options:ct_flush="true"
> >  check ovn-nbctl ls-lb-add foo lb2
> >
> >  # Config OVN load-balancer with another VIP (this time with ports).
> > @@ -10013,16 +10015,18 @@ OVS_START_L7([bar1], [http])
> >  OVS_START_L7([bar2], [http])
> >  OVS_START_L7([bar3], [http])
> >
> > -OVS_WAIT_FOR_OUTPUT([
> > -    for i in `seq 1 20`; do
> > -        ip netns exec foo1 wget 30.0.0.1 -t 5 -T 1 --retry-connrefused
> -v -o wget$i.log;
> > -    done
> > -    ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e
> 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [dnl
> > +m4_define([LB1_CT_ENTRIES], [dnl
> >
> tcp,orig=(src=192.168.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.1.2,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
> >
> tcp,orig=(src=192.168.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.1.3,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
> >
> tcp,orig=(src=192.168.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.1.4,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
> >  ])
> >
> > +OVS_WAIT_FOR_OUTPUT([
> > +    for i in `seq 1 20`; do
> > +        ip netns exec foo1 wget 30.0.0.1 -t 5 -T 1 --retry-connrefused
> -v -o wget$i.log;
> > +    done
> > +    ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e
> 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
> > +
> >  OVS_WAIT_FOR_OUTPUT([
> >      for i in `seq 1 20`; do
> >          ip netns exec foo1 wget 30.0.0.2:8000 -t 5 -T 1
> --retry-connrefused -v -o wget$i.log;
> > @@ -10096,6 +10100,26 @@ check ovn-nbctl lb-del lb2
> >
> >  OVS_WAIT_UNTIL([test "$(ovs-appctl dpctl/dump-conntrack |
> FORMAT_CT(30.0.0.3) | wc -l)" = "0"])
> >
> > +# Check that LB has CT flush disabled by default
> > +check ovn-nbctl lb-add lb1 30.0.0.1 "172.16.1.2,172.16.1.3,172.16.1.4"
> > +check ovn-nbctl ls-lb-add foo lb1
> > +
> > +OVS_WAIT_FOR_OUTPUT([
> > +    for i in `seq 1 20`; do
> > +        ip netns exec foo1 wget 30.0.0.1 -t 5 -T 1 --retry-connrefused
> -v -o wget$i.log;
> > +    done
> > +    ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e
> 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
> > +
> > +# Remove one backend
> > +check ovn-nbctl --wait=hv set load_balancer lb1
> vips='"30.0.0.1"="172.16.1.2,172.16.1.3"'
> > +
> > +AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed
> -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
> > +
> > +# Remove whole LB
> > +check ovn-nbctl --wait=hv lb-del lb1
> > +
> > +AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed
> -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
> > +
> >  OVS_APP_EXIT_AND_WAIT([ovn-controller])
> >
> >  as ovn-sb
>
> Thanks,
> Dumitru
>
>
Everything should be addressed in v3.

Thanks,
Ales.
diff mbox series

Patch

diff --git a/NEWS b/NEWS
index 637adcff3..085b1603a 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,8 @@  Post v23.03.0
 -------------
   - Enhance LSP.options:arp_proxy to support IPv6, configurable MAC
     addresses and CIDRs.
+  - Add an option for LBs called "ct_flush" that allows CMS to specify
+    if ovn-controller should flush related CT entries for removed LB backends.
 
 OVN v23.03.0 - 03 Mar 2023
 --------------------------
diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index 7dcbfd252..64f4d6a2a 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -2697,7 +2697,8 @@  static void
 lb_data_removed_five_tuples_add(struct ed_type_lb_data *lb_data,
                                 const struct ovn_controller_lb *lb)
 {
-    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT)) {
+    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT) ||
+        !lb->ct_flush) {
         return;
     }
 
@@ -2716,7 +2717,8 @@  static void
 lb_data_removed_five_tuples_remove(struct ed_type_lb_data *lb_data,
                                    const struct ovn_controller_lb *lb)
 {
-    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT)) {
+    if (!ovs_feature_is_supported(OVS_CT_TUPLE_FLUSH_SUPPORT) ||
+        !lb->ct_flush) {
         return;
     }
 
diff --git a/lib/lb.c b/lib/lb.c
index e941434c4..252ad3748 100644
--- a/lib/lb.c
+++ b/lib/lb.c
@@ -798,6 +798,9 @@  ovn_controller_lb_create(const struct sbrec_load_balancer *sbrec_lb,
     lb->hairpin_orig_tuple = smap_get_bool(&sbrec_lb->options,
                                            "hairpin_orig_tuple",
                                            false);
+
+    lb->ct_flush = smap_get_bool(&sbrec_lb->options, "ct_flush", false);
+
     ovn_lb_get_hairpin_snat_ip(&sbrec_lb->header_.uuid, &sbrec_lb->options,
                                &lb->hairpin_snat_ips);
     return lb;
diff --git a/lib/lb.h b/lib/lb.h
index 7a67b7426..22254815d 100644
--- a/lib/lb.h
+++ b/lib/lb.h
@@ -193,6 +193,7 @@  struct ovn_controller_lb {
                                               * as source for hairpinned
                                               * traffic.
                                               */
+    bool ct_flush;
 };
 
 struct ovn_controller_lb *ovn_controller_lb_create(
diff --git a/ovn-nb.xml b/ovn-nb.xml
index 73f707aa0..aec8a2284 100644
--- a/ovn-nb.xml
+++ b/ovn-nb.xml
@@ -2041,6 +2041,12 @@  or
         the affinity timeslot. Max supported affinity_timeout is 65535
         seconds.
       </column>
+
+      <column name="options" key="ct_flush" type='{"type": "boolean"}'>
+        The value indicates whether ovn-controller should flush CT entries
+        that are related to this LB when the backends are removed. Being set
+        to <code>false</code> by default.
+      </column>
     </group>
   </table>
 
diff --git a/tests/ovn.at b/tests/ovn.at
index fa786112c..c1f6edda7 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -34997,7 +34997,8 @@  check ovs-vsctl add-port br-int p1 -- set interface p1 external_ids:iface-id=lsp
 wait_for_ports_up
 ovn-nbctl --wait=hv sync
 
-check ovn-nbctl lb-add lb1 "192.168.0.10" "192.168.10.10,192.168.10.20"
+check ovn-nbctl lb-add lb1 "192.168.0.10" "192.168.10.10,192.168.10.20" \
+-- set load_balancer lb1 options:ct_flush="true"
 check ovn-nbctl ls-lb-add sw lb1
 
 # Remove a single backend
@@ -35020,7 +35021,8 @@  AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.0.10:0, backend=192.168.
 AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.0.10:0, backend=192.168.10.30:0, protocol=0" hv1/ovn-controller.log], [0])
 
 # Check flush for LB with port and protocol
-check ovn-nbctl lb-add lb1 "192.168.30.10:80" "192.168.40.10:8080,192.168.40.20:8090" udp
+check ovn-nbctl lb-add lb1 "192.168.30.10:80" "192.168.40.10:8080,192.168.40.20:8090" udp \
+-- set load_balancer lb1 options:ct_flush="true"
 check ovn-nbctl ls-lb-add sw lb1
 check ovn-nbctl lb-del lb1
 check ovn-nbctl --wait=hv sync
@@ -35029,7 +35031,8 @@  AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.30.10:80, backend=192.16
 AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.30.10:80, backend=192.168.40.20:8090, protocol=17" hv1/ovn-controller.log], [0])
 
 # Check recompute when LB is no longer local
-check ovn-nbctl lb-add lb1 "192.168.50.10:80" "192.168.60.10:8080"
+check ovn-nbctl lb-add lb1 "192.168.50.10:80" "192.168.60.10:8080" \
+-- set load_balancer lb1 options:ct_flush="true"
 check ovn-nbctl ls-lb-add sw lb1
 check ovs-vsctl remove interface p1 external_ids iface-id
 check ovn-appctl inc-engine/recompute
@@ -35039,6 +35042,25 @@  AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.50.10:80, backend=192.16
 
 AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple" hv1/ovn-controller.log)" = "6"], [0])
 
+# Check if CT flush is disabled by default
+check ovn-nbctl lb-del lb1
+check ovn-nbctl lb-add lb1 "192.168.70.10:80" "192.168.80.10:8080,192.168.90.10:8080"
+check ovn-nbctl ls-lb-add sw lb1
+check ovs-vsctl set interface p1 external_ids:iface-id=lsp1
+check ovn-nbctl --wait=hv sync
+
+#AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple" hv1/ovn-controller.log)" = "6"], [0])
+
+# Remove one backend
+check ovn-nbctl --wait=hv set load_balancer lb1 vips='"192.168.70.10:80"="192.168.80.10:8080"'
+
+#AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.70.10:80, backend=192.168.90.10:8080, protocol=6" hv1/ovn-controller.log], [1])
+#AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple" hv1/ovn-controller.log)" = "6"], [0])
+
+check ovn-nbctl --wait=hv lb-del lb1
+AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.70.10:80, backend=192.168.80.10:8080, protocol=6" hv1/ovn-controller.log], [1])
+AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple" hv1/ovn-controller.log)" = "6"], [0])
+
 OVN_CLEANUP([hv1])
 AT_CLEANUP
 ])
diff --git a/tests/system-ovn.at b/tests/system-ovn.at
index ad1188078..d6fe968fc 100644
--- a/tests/system-ovn.at
+++ b/tests/system-ovn.at
@@ -9993,11 +9993,13 @@  check ovn-nbctl lsp-add bar bar3 \
 -- lsp-set-addresses bar3 "f0:00:0f:01:02:05 172.16.1.4"
 
 # Config OVN load-balancer with a VIP.
-check ovn-nbctl lb-add lb1 30.0.0.1 "172.16.1.2,172.16.1.3,172.16.1.4"
+check ovn-nbctl lb-add lb1 30.0.0.1 "172.16.1.2,172.16.1.3,172.16.1.4" \
+-- set load_balancer lb1 options:ct_flush="true"
 check ovn-nbctl ls-lb-add foo lb1
 
 # Create another load-balancer with another VIP.
 lb2_uuid=`ovn-nbctl create load_balancer name=lb2 vips:30.0.0.3="172.16.1.2,172.16.1.3,172.16.1.4"`
+check ovn-nbctl set load_balancer lb2 options:ct_flush="true"
 check ovn-nbctl ls-lb-add foo lb2
 
 # Config OVN load-balancer with another VIP (this time with ports).
@@ -10013,16 +10015,18 @@  OVS_START_L7([bar1], [http])
 OVS_START_L7([bar2], [http])
 OVS_START_L7([bar3], [http])
 
-OVS_WAIT_FOR_OUTPUT([
-    for i in `seq 1 20`; do
-        ip netns exec foo1 wget 30.0.0.1 -t 5 -T 1 --retry-connrefused -v -o wget$i.log;
-    done
-    ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [dnl
+m4_define([LB1_CT_ENTRIES], [dnl
 tcp,orig=(src=192.168.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.1.2,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 tcp,orig=(src=192.168.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.1.3,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 tcp,orig=(src=192.168.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(src=172.16.1.4,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 ])
 
+OVS_WAIT_FOR_OUTPUT([
+    for i in `seq 1 20`; do
+        ip netns exec foo1 wget 30.0.0.1 -t 5 -T 1 --retry-connrefused -v -o wget$i.log;
+    done
+    ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
+
 OVS_WAIT_FOR_OUTPUT([
     for i in `seq 1 20`; do
         ip netns exec foo1 wget 30.0.0.2:8000 -t 5 -T 1 --retry-connrefused -v -o wget$i.log;
@@ -10096,6 +10100,26 @@  check ovn-nbctl lb-del lb2
 
 OVS_WAIT_UNTIL([test "$(ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.3) | wc -l)" = "0"])
 
+# Check that LB has CT flush disabled by default
+check ovn-nbctl lb-add lb1 30.0.0.1 "172.16.1.2,172.16.1.3,172.16.1.4"
+check ovn-nbctl ls-lb-add foo lb1
+
+OVS_WAIT_FOR_OUTPUT([
+    for i in `seq 1 20`; do
+        ip netns exec foo1 wget 30.0.0.1 -t 5 -T 1 --retry-connrefused -v -o wget$i.log;
+    done
+    ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
+
+# Remove one backend
+check ovn-nbctl --wait=hv set load_balancer lb1 vips='"30.0.0.1"="172.16.1.2,172.16.1.3"'
+
+AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
+
+# Remove whole LB
+check ovn-nbctl --wait=hv lb-del lb1
+
+AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [LB1_CT_ENTRIES])
+
 OVS_APP_EXIT_AND_WAIT([ovn-controller])
 
 as ovn-sb