diff mbox series

[ovs-dev] ovn-nbctl: Fix lrp-set-gateway-chassis.

Message ID 20211111003913.492906-1-hzhou@ovn.org
State Accepted
Headers show
Series [ovs-dev] ovn-nbctl: Fix lrp-set-gateway-chassis. | 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

Han Zhou Nov. 11, 2021, 12:39 a.m. UTC
Currently this command assumes that if the gateway_chassis record with
expected name exists it is set to the logical port, so once the record
is found it not set to the lrp again. However, this assumption is not
always true.

An example is that when combined with a lrp-del and then lrp-add
commands before lrp-set-gateway-chassis in the same transaction, the
gateway_chassis record will be found but it is not set to the lrp. This
is causing the gateway-chassis setting flapping in ovn-kubernetes'
cluster router logical ports.

This patch makes sure the gateway_chassis record (existed or newly
created) is set to the lrp's gateway-chassis column.

Signed-off-by: Han Zhou <hzhou@ovn.org>
---
 ovs                   |  2 +-
 tests/ovn-nbctl.at    |  6 ++++++
 utilities/ovn-nbctl.c | 19 ++++++++-----------
 3 files changed, 15 insertions(+), 12 deletions(-)

Comments

Numan Siddique Nov. 11, 2021, 7:19 p.m. UTC | #1
On Wed, Nov 10, 2021 at 7:39 PM Han Zhou <hzhou@ovn.org> wrote:
>
> Currently this command assumes that if the gateway_chassis record with
> expected name exists it is set to the logical port, so once the record
> is found it not set to the lrp again. However, this assumption is not
> always true.
>
> An example is that when combined with a lrp-del and then lrp-add
> commands before lrp-set-gateway-chassis in the same transaction, the
> gateway_chassis record will be found but it is not set to the lrp. This
> is causing the gateway-chassis setting flapping in ovn-kubernetes'
> cluster router logical ports.
>
> This patch makes sure the gateway_chassis record (existed or newly
> created) is set to the lrp's gateway-chassis column.
>
> Signed-off-by: Han Zhou <hzhou@ovn.org>

Acked-by: Numan Siddique <numans@ovn.org>

Numan

> ---
>  ovs                   |  2 +-
>  tests/ovn-nbctl.at    |  6 ++++++
>  utilities/ovn-nbctl.c | 19 ++++++++-----------
>  3 files changed, 15 insertions(+), 12 deletions(-)
>
> diff --git a/ovs b/ovs
> index 1bdda7b6d..429b114c5 160000
> --- a/ovs
> +++ b/ovs
> @@ -1 +1 @@
> -Subproject commit 1bdda7b6d53c92e877b457157676aff326414c53
> +Subproject commit 429b114c5aadee24ccfb16ad7d824f45cdcea75a
> diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
> index a8946fef8..3846ba727 100644
> --- a/tests/ovn-nbctl.at
> +++ b/tests/ovn-nbctl.at
> @@ -1389,6 +1389,12 @@ AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 10])
>  AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
>  lrp0-chassis1    10
>  ])
> +
> +AT_CHECK([ovn-nbctl lrp-del lrp0 -- lrp-add lr0 lrp0 00:00:00:01:02:03 192.168.1.1/24 -- lrp-set-gateway-chassis lrp0 chassis1 10])
> +AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
> +lrp0-chassis1    10
> +])
> +
>  AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 20])
>
>  AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
> diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
> index 2a68ccd16..72049ffd8 100644
> --- a/utilities/ovn-nbctl.c
> +++ b/utilities/ovn-nbctl.c
> @@ -5100,24 +5100,21 @@ nbctl_lrp_set_gateway_chassis(struct ctl_context *ctx)
>      }
>
>      gc_name = xasprintf("%s-%s", lrp_name, chassis_name);
> -    const struct nbrec_gateway_chassis *existing_gc;
> -    error = gc_by_name_or_uuid(ctx, gc_name, false, &existing_gc);
> +    const struct nbrec_gateway_chassis *gc;
> +    error = gc_by_name_or_uuid(ctx, gc_name, false, &gc);
>      if (error) {
>          ctx->error = error;
>          free(gc_name);
>          return;
>      }
> -    if (existing_gc) {
> -        nbrec_gateway_chassis_set_priority(existing_gc, priority);
> -        free(gc_name);
> -        return;
> +
> +    if (!gc) {
> +        /* Create the logical gateway chassis. */
> +        gc = nbrec_gateway_chassis_insert(ctx->txn);
> +        nbrec_gateway_chassis_set_name(gc, gc_name);
> +        nbrec_gateway_chassis_set_chassis_name(gc, chassis_name);
>      }
>
> -    /* Create the logical gateway chassis. */
> -    struct nbrec_gateway_chassis *gc
> -        = nbrec_gateway_chassis_insert(ctx->txn);
> -    nbrec_gateway_chassis_set_name(gc, gc_name);
> -    nbrec_gateway_chassis_set_chassis_name(gc, chassis_name);
>      nbrec_gateway_chassis_set_priority(gc, priority);
>
>      /* Insert the logical gateway chassis into the logical router port. */
> --
> 2.30.2
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Mark Michelson Nov. 11, 2021, 7:52 p.m. UTC | #2
Hello Han,

The patch looks good to me, but it updates the OVS submodule commit, and 
I don't think this was done on purpose. With that corrected,

Acked-by: Mark Michelson <mmichels@redhat.com>

On 11/10/21 19:39, Han Zhou wrote:
> Currently this command assumes that if the gateway_chassis record with
> expected name exists it is set to the logical port, so once the record
> is found it not set to the lrp again. However, this assumption is not
> always true.
> 
> An example is that when combined with a lrp-del and then lrp-add
> commands before lrp-set-gateway-chassis in the same transaction, the
> gateway_chassis record will be found but it is not set to the lrp. This
> is causing the gateway-chassis setting flapping in ovn-kubernetes'
> cluster router logical ports.
> 
> This patch makes sure the gateway_chassis record (existed or newly
> created) is set to the lrp's gateway-chassis column.
> 
> Signed-off-by: Han Zhou <hzhou@ovn.org>
> ---
>   ovs                   |  2 +-
>   tests/ovn-nbctl.at    |  6 ++++++
>   utilities/ovn-nbctl.c | 19 ++++++++-----------
>   3 files changed, 15 insertions(+), 12 deletions(-)
> 
> diff --git a/ovs b/ovs
> index 1bdda7b6d..429b114c5 160000
> --- a/ovs
> +++ b/ovs
> @@ -1 +1 @@
> -Subproject commit 1bdda7b6d53c92e877b457157676aff326414c53
> +Subproject commit 429b114c5aadee24ccfb16ad7d824f45cdcea75a
> diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
> index a8946fef8..3846ba727 100644
> --- a/tests/ovn-nbctl.at
> +++ b/tests/ovn-nbctl.at
> @@ -1389,6 +1389,12 @@ AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 10])
>   AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
>   lrp0-chassis1    10
>   ])
> +
> +AT_CHECK([ovn-nbctl lrp-del lrp0 -- lrp-add lr0 lrp0 00:00:00:01:02:03 192.168.1.1/24 -- lrp-set-gateway-chassis lrp0 chassis1 10])
> +AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
> +lrp0-chassis1    10
> +])
> +
>   AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 20])
>   
>   AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
> diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
> index 2a68ccd16..72049ffd8 100644
> --- a/utilities/ovn-nbctl.c
> +++ b/utilities/ovn-nbctl.c
> @@ -5100,24 +5100,21 @@ nbctl_lrp_set_gateway_chassis(struct ctl_context *ctx)
>       }
>   
>       gc_name = xasprintf("%s-%s", lrp_name, chassis_name);
> -    const struct nbrec_gateway_chassis *existing_gc;
> -    error = gc_by_name_or_uuid(ctx, gc_name, false, &existing_gc);
> +    const struct nbrec_gateway_chassis *gc;
> +    error = gc_by_name_or_uuid(ctx, gc_name, false, &gc);
>       if (error) {
>           ctx->error = error;
>           free(gc_name);
>           return;
>       }
> -    if (existing_gc) {
> -        nbrec_gateway_chassis_set_priority(existing_gc, priority);
> -        free(gc_name);
> -        return;
> +
> +    if (!gc) {
> +        /* Create the logical gateway chassis. */
> +        gc = nbrec_gateway_chassis_insert(ctx->txn);
> +        nbrec_gateway_chassis_set_name(gc, gc_name);
> +        nbrec_gateway_chassis_set_chassis_name(gc, chassis_name);
>       }
>   
> -    /* Create the logical gateway chassis. */
> -    struct nbrec_gateway_chassis *gc
> -        = nbrec_gateway_chassis_insert(ctx->txn);
> -    nbrec_gateway_chassis_set_name(gc, gc_name);
> -    nbrec_gateway_chassis_set_chassis_name(gc, chassis_name);
>       nbrec_gateway_chassis_set_priority(gc, priority);
>   
>       /* Insert the logical gateway chassis into the logical router port. */
>
Han Zhou Nov. 11, 2021, 11:02 p.m. UTC | #3
On Thu, Nov 11, 2021 at 11:53 AM Mark Michelson <mmichels@redhat.com> wrote:
>
> Hello Han,
>
> The patch looks good to me, but it updates the OVS submodule commit, and
> I don't think this was done on purpose. With that corrected,
>
> Acked-by: Mark Michelson <mmichels@redhat.com>

Sorry, my mistake. With the ovs submodule commit removed, I applied it to
main and backported up to 21.03 branch.
Thanks Numan and Mark for the reviews!

Han
>
> On 11/10/21 19:39, Han Zhou wrote:
> > Currently this command assumes that if the gateway_chassis record with
> > expected name exists it is set to the logical port, so once the record
> > is found it not set to the lrp again. However, this assumption is not
> > always true.
> >
> > An example is that when combined with a lrp-del and then lrp-add
> > commands before lrp-set-gateway-chassis in the same transaction, the
> > gateway_chassis record will be found but it is not set to the lrp. This
> > is causing the gateway-chassis setting flapping in ovn-kubernetes'
> > cluster router logical ports.
> >
> > This patch makes sure the gateway_chassis record (existed or newly
> > created) is set to the lrp's gateway-chassis column.
> >
> > Signed-off-by: Han Zhou <hzhou@ovn.org>
> > ---
> >   ovs                   |  2 +-
> >   tests/ovn-nbctl.at    |  6 ++++++
> >   utilities/ovn-nbctl.c | 19 ++++++++-----------
> >   3 files changed, 15 insertions(+), 12 deletions(-)
> >
> > diff --git a/ovs b/ovs
> > index 1bdda7b6d..429b114c5 160000
> > --- a/ovs
> > +++ b/ovs
> > @@ -1 +1 @@
> > -Subproject commit 1bdda7b6d53c92e877b457157676aff326414c53
> > +Subproject commit 429b114c5aadee24ccfb16ad7d824f45cdcea75a
> > diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
> > index a8946fef8..3846ba727 100644
> > --- a/tests/ovn-nbctl.at
> > +++ b/tests/ovn-nbctl.at
> > @@ -1389,6 +1389,12 @@ AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0
chassis1 10])
> >   AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
> >   lrp0-chassis1    10
> >   ])
> > +
> > +AT_CHECK([ovn-nbctl lrp-del lrp0 -- lrp-add lr0 lrp0 00:00:00:01:02:03
192.168.1.1/24 -- lrp-set-gateway-chassis lrp0 chassis1 10])
> > +AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
> > +lrp0-chassis1    10
> > +])
> > +
> >   AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 20])
> >
> >   AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
> > diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
> > index 2a68ccd16..72049ffd8 100644
> > --- a/utilities/ovn-nbctl.c
> > +++ b/utilities/ovn-nbctl.c
> > @@ -5100,24 +5100,21 @@ nbctl_lrp_set_gateway_chassis(struct
ctl_context *ctx)
> >       }
> >
> >       gc_name = xasprintf("%s-%s", lrp_name, chassis_name);
> > -    const struct nbrec_gateway_chassis *existing_gc;
> > -    error = gc_by_name_or_uuid(ctx, gc_name, false, &existing_gc);
> > +    const struct nbrec_gateway_chassis *gc;
> > +    error = gc_by_name_or_uuid(ctx, gc_name, false, &gc);
> >       if (error) {
> >           ctx->error = error;
> >           free(gc_name);
> >           return;
> >       }
> > -    if (existing_gc) {
> > -        nbrec_gateway_chassis_set_priority(existing_gc, priority);
> > -        free(gc_name);
> > -        return;
> > +
> > +    if (!gc) {
> > +        /* Create the logical gateway chassis. */
> > +        gc = nbrec_gateway_chassis_insert(ctx->txn);
> > +        nbrec_gateway_chassis_set_name(gc, gc_name);
> > +        nbrec_gateway_chassis_set_chassis_name(gc, chassis_name);
> >       }
> >
> > -    /* Create the logical gateway chassis. */
> > -    struct nbrec_gateway_chassis *gc
> > -        = nbrec_gateway_chassis_insert(ctx->txn);
> > -    nbrec_gateway_chassis_set_name(gc, gc_name);
> > -    nbrec_gateway_chassis_set_chassis_name(gc, chassis_name);
> >       nbrec_gateway_chassis_set_priority(gc, priority);
> >
> >       /* Insert the logical gateway chassis into the logical router
port. */
> >
>
diff mbox series

Patch

diff --git a/ovs b/ovs
index 1bdda7b6d..429b114c5 160000
--- a/ovs
+++ b/ovs
@@ -1 +1 @@ 
-Subproject commit 1bdda7b6d53c92e877b457157676aff326414c53
+Subproject commit 429b114c5aadee24ccfb16ad7d824f45cdcea75a
diff --git a/tests/ovn-nbctl.at b/tests/ovn-nbctl.at
index a8946fef8..3846ba727 100644
--- a/tests/ovn-nbctl.at
+++ b/tests/ovn-nbctl.at
@@ -1389,6 +1389,12 @@  AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 10])
 AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
 lrp0-chassis1    10
 ])
+
+AT_CHECK([ovn-nbctl lrp-del lrp0 -- lrp-add lr0 lrp0 00:00:00:01:02:03 192.168.1.1/24 -- lrp-set-gateway-chassis lrp0 chassis1 10])
+AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
+lrp0-chassis1    10
+])
+
 AT_CHECK([ovn-nbctl lrp-set-gateway-chassis lrp0 chassis1 20])
 
 AT_CHECK([ovn-nbctl lrp-get-gateway-chassis lrp0], [0], [dnl
diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
index 2a68ccd16..72049ffd8 100644
--- a/utilities/ovn-nbctl.c
+++ b/utilities/ovn-nbctl.c
@@ -5100,24 +5100,21 @@  nbctl_lrp_set_gateway_chassis(struct ctl_context *ctx)
     }
 
     gc_name = xasprintf("%s-%s", lrp_name, chassis_name);
-    const struct nbrec_gateway_chassis *existing_gc;
-    error = gc_by_name_or_uuid(ctx, gc_name, false, &existing_gc);
+    const struct nbrec_gateway_chassis *gc;
+    error = gc_by_name_or_uuid(ctx, gc_name, false, &gc);
     if (error) {
         ctx->error = error;
         free(gc_name);
         return;
     }
-    if (existing_gc) {
-        nbrec_gateway_chassis_set_priority(existing_gc, priority);
-        free(gc_name);
-        return;
+
+    if (!gc) {
+        /* Create the logical gateway chassis. */
+        gc = nbrec_gateway_chassis_insert(ctx->txn);
+        nbrec_gateway_chassis_set_name(gc, gc_name);
+        nbrec_gateway_chassis_set_chassis_name(gc, chassis_name);
     }
 
-    /* Create the logical gateway chassis. */
-    struct nbrec_gateway_chassis *gc
-        = nbrec_gateway_chassis_insert(ctx->txn);
-    nbrec_gateway_chassis_set_name(gc, gc_name);
-    nbrec_gateway_chassis_set_chassis_name(gc, chassis_name);
     nbrec_gateway_chassis_set_priority(gc, priority);
 
     /* Insert the logical gateway chassis into the logical router port. */