diff mbox series

[ovs-dev,5/5] controller: Handle postponed ports release.

Message ID 20240423115333.2796843-6-xsimonar@redhat.com
State Accepted
Delegated to: Numan Siddique
Headers show
Series Fix I+P versus recompute differences. | 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

Xavier Simonart April 23, 2024, 11:53 a.m. UTC
Reported-at: https://mail.openvswitch.org/pipermail/ovs-dev/2023-May/405107.html
Suggested-by: Priyankar Jain <priyankar.jain@nutanix.com>

Signed-off-by: Xavier Simonart <xsimonar@redhat.com>
---
 controller/binding.c | 12 +++++++++-
 tests/ovn.at         | 57 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+), 1 deletion(-)

Comments

Numan Siddique May 30, 2024, 3:31 p.m. UTC | #1
On Tue, Apr 23, 2024 at 7:54 AM Xavier Simonart <xsimonar@redhat.com> wrote:
>
> Reported-at: https://mail.openvswitch.org/pipermail/ovs-dev/2023-May/405107.html
> Suggested-by: Priyankar Jain <priyankar.jain@nutanix.com>
>
> Signed-off-by: Xavier Simonart <xsimonar@redhat.com>
> ---
>  controller/binding.c | 12 +++++++++-
>  tests/ovn.at         | 57 ++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 68 insertions(+), 1 deletion(-)
>
> diff --git a/controller/binding.c b/controller/binding.c
> index 0bef5dc42..c37066cbe 100644
> --- a/controller/binding.c
> +++ b/controller/binding.c
> @@ -1317,6 +1317,14 @@ lport_maybe_postpone(const char *port_name, long long int now,
>      return true;
>  }
>
> +static bool
> +is_postponed_port(const char *port_name)
> +{
> +    struct claimed_port *cp =
> +        (struct claimed_port *) sset_find(&_postponed_ports, port_name);
> +    return !!cp;
> +}

This is wrong.  '_postponed_ports' is an sset and not shash and
sset_find returns 'struct sset_node'.

You can use sset_contains i.,e
--------------------
static bool
is_postponed_port(const char *port_name)
{
return sset_contains(&_postponed_ports, port_name);
}
--------------------


With the above addressed:

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

Numan


> +
>  /* Returns false if lport is not claimed due to 'sb_readonly'.
>   * Returns true otherwise.
>   */
> @@ -1491,7 +1499,8 @@ is_binding_lport_this_chassis(struct binding_lport *b_lport,
>  {
>      return (b_lport && b_lport->pb && chassis &&
>              (b_lport->pb->chassis == chassis
> -             || is_additional_chassis(b_lport->pb, chassis)));
> +             || is_additional_chassis(b_lport->pb, chassis)
> +             || is_postponed_port(b_lport->pb->logical_port)));
>  }
>
>  /* Returns 'true' if the 'lbinding' has binding lports of type LP_CONTAINER,
> @@ -1593,6 +1602,7 @@ consider_vif_lport_(const struct sbrec_port_binding *pb,
>          }
>
>          if (!lbinding_set || !can_bind) {
> +            remove_related_lport(pb, b_ctx_out);
>              return release_lport(pb, b_ctx_in->chassis_rec,
>                                   !b_ctx_in->ovnsb_idl_txn,
>                                   b_ctx_out->tracked_dp_bindings,
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 74c5bccc0..b0aba2207 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -37838,3 +37838,60 @@ OVN_CLEANUP([hv1])
>
>  AT_CLEANUP
>  ])
> +
> +OVN_FOR_EACH_NORTHD([
> +AT_SETUP([Deleting vif while controller fight for port claim])
> +ovn_start
> +
> +ovn-nbctl ls-add ls0
> +ovn-nbctl lsp-add ls0 lsp0
> +ovn-nbctl lsp-add ls0 lsp1
> +
> +net_add n1
> +for i in 1 2; do
> +    sim_add hv$i
> +    as hv$i
> +    ovs-vsctl add-br br-phys
> +    ovn_attach n1 br-phys 192.168.0.$i
> +done
> +
> +check ovn-nbctl --wait=hv sync
> +hv1_uuid=$(ovn-sbctl --bare --columns _uuid list chassis hv1)
> +hv2_uuid=$(ovn-sbctl --bare --columns _uuid list chassis hv2)
> +
> +as hv1 ovs-vsctl -- add-port br-int vif1 -- set Interface vif1 external-ids:iface-id=lsp1
> +as hv1 ovs-vsctl -- add-port br-int vif -- set Interface vif external-ids:iface-id=lsp0
> +wait_for_ports_up
> +
> +# Delete vif => store flows w/ only vif1, and no vif
> +as hv1 ovs-vsctl -- del-port br-int vif
> +check ovn-nbctl --wait=hv sync
> +DUMP_FLOWS([hv1], [oflows1])
> +sleep_controller hv1
> +as hv2 ovs-vsctl -- add-port br-int vif -- set Interface vif external-ids:iface-id=lsp0
> +as hv1 ovs-vsctl -- add-port br-int vif -- set Interface vif external-ids:iface-id=lsp0
> +
> +OVS_WAIT_UNTIL([
> +    chassis=$(ovn-sbctl --bare --columns chassis list port_binding lsp0)
> +    test "$chassis" = $hv2_uuid
> +])
> +
> +sleep_sb
> +wake_up_controller hv1
> +sleep_controller hv2
> +
> +as hv1 ovs-vsctl -- del-port br-int vif
> +wake_up_sb
> +wake_up_controller hv2
> +
> +as hv2 ovs-vsctl -- del-port br-int vif
> +check ovn-nbctl --wait=hv sync
> +
> +DUMP_FLOWS([hv1], [oflows2])
> +
> +check diff oflows1 oflows2
> +OVN_CLEANUP([hv1],[hv2])
> +
> +AT_CLEANUP
> +])
> +
> --
> 2.31.1
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Numan Siddique June 12, 2024, 2:23 p.m. UTC | #2
On Thu, May 30, 2024 at 11:31 AM Numan Siddique <numans@ovn.org> wrote:
>
> On Tue, Apr 23, 2024 at 7:54 AM Xavier Simonart <xsimonar@redhat.com> wrote:
> >
> > Reported-at: https://mail.openvswitch.org/pipermail/ovs-dev/2023-May/405107.html
> > Suggested-by: Priyankar Jain <priyankar.jain@nutanix.com>
> >
> > Signed-off-by: Xavier Simonart <xsimonar@redhat.com>
> > ---
> >  controller/binding.c | 12 +++++++++-
> >  tests/ovn.at         | 57 ++++++++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 68 insertions(+), 1 deletion(-)
> >
> > diff --git a/controller/binding.c b/controller/binding.c
> > index 0bef5dc42..c37066cbe 100644
> > --- a/controller/binding.c
> > +++ b/controller/binding.c
> > @@ -1317,6 +1317,14 @@ lport_maybe_postpone(const char *port_name, long long int now,
> >      return true;
> >  }
> >
> > +static bool
> > +is_postponed_port(const char *port_name)
> > +{
> > +    struct claimed_port *cp =
> > +        (struct claimed_port *) sset_find(&_postponed_ports, port_name);
> > +    return !!cp;
> > +}
>
> This is wrong.  '_postponed_ports' is an sset and not shash and
> sset_find returns 'struct sset_node'.
>
> You can use sset_contains i.,e
> --------------------
> static bool
> is_postponed_port(const char *port_name)
> {
> return sset_contains(&_postponed_ports, port_name);
> }
> --------------------
>
>
> With the above addressed:
>
> Acked-by: Numan Siddique <numans@ovn.org>

I applied this patch series to main with the above changes.

Numan

>
> Numan
>
>
> > +
> >  /* Returns false if lport is not claimed due to 'sb_readonly'.
> >   * Returns true otherwise.
> >   */
> > @@ -1491,7 +1499,8 @@ is_binding_lport_this_chassis(struct binding_lport *b_lport,
> >  {
> >      return (b_lport && b_lport->pb && chassis &&
> >              (b_lport->pb->chassis == chassis
> > -             || is_additional_chassis(b_lport->pb, chassis)));
> > +             || is_additional_chassis(b_lport->pb, chassis)
> > +             || is_postponed_port(b_lport->pb->logical_port)));
> >  }
> >
> >  /* Returns 'true' if the 'lbinding' has binding lports of type LP_CONTAINER,
> > @@ -1593,6 +1602,7 @@ consider_vif_lport_(const struct sbrec_port_binding *pb,
> >          }
> >
> >          if (!lbinding_set || !can_bind) {
> > +            remove_related_lport(pb, b_ctx_out);
> >              return release_lport(pb, b_ctx_in->chassis_rec,
> >                                   !b_ctx_in->ovnsb_idl_txn,
> >                                   b_ctx_out->tracked_dp_bindings,
> > diff --git a/tests/ovn.at b/tests/ovn.at
> > index 74c5bccc0..b0aba2207 100644
> > --- a/tests/ovn.at
> > +++ b/tests/ovn.at
> > @@ -37838,3 +37838,60 @@ OVN_CLEANUP([hv1])
> >
> >  AT_CLEANUP
> >  ])
> > +
> > +OVN_FOR_EACH_NORTHD([
> > +AT_SETUP([Deleting vif while controller fight for port claim])
> > +ovn_start
> > +
> > +ovn-nbctl ls-add ls0
> > +ovn-nbctl lsp-add ls0 lsp0
> > +ovn-nbctl lsp-add ls0 lsp1
> > +
> > +net_add n1
> > +for i in 1 2; do
> > +    sim_add hv$i
> > +    as hv$i
> > +    ovs-vsctl add-br br-phys
> > +    ovn_attach n1 br-phys 192.168.0.$i
> > +done
> > +
> > +check ovn-nbctl --wait=hv sync
> > +hv1_uuid=$(ovn-sbctl --bare --columns _uuid list chassis hv1)
> > +hv2_uuid=$(ovn-sbctl --bare --columns _uuid list chassis hv2)
> > +
> > +as hv1 ovs-vsctl -- add-port br-int vif1 -- set Interface vif1 external-ids:iface-id=lsp1
> > +as hv1 ovs-vsctl -- add-port br-int vif -- set Interface vif external-ids:iface-id=lsp0
> > +wait_for_ports_up
> > +
> > +# Delete vif => store flows w/ only vif1, and no vif
> > +as hv1 ovs-vsctl -- del-port br-int vif
> > +check ovn-nbctl --wait=hv sync
> > +DUMP_FLOWS([hv1], [oflows1])
> > +sleep_controller hv1
> > +as hv2 ovs-vsctl -- add-port br-int vif -- set Interface vif external-ids:iface-id=lsp0
> > +as hv1 ovs-vsctl -- add-port br-int vif -- set Interface vif external-ids:iface-id=lsp0
> > +
> > +OVS_WAIT_UNTIL([
> > +    chassis=$(ovn-sbctl --bare --columns chassis list port_binding lsp0)
> > +    test "$chassis" = $hv2_uuid
> > +])
> > +
> > +sleep_sb
> > +wake_up_controller hv1
> > +sleep_controller hv2
> > +
> > +as hv1 ovs-vsctl -- del-port br-int vif
> > +wake_up_sb
> > +wake_up_controller hv2
> > +
> > +as hv2 ovs-vsctl -- del-port br-int vif
> > +check ovn-nbctl --wait=hv sync
> > +
> > +DUMP_FLOWS([hv1], [oflows2])
> > +
> > +check diff oflows1 oflows2
> > +OVN_CLEANUP([hv1],[hv2])
> > +
> > +AT_CLEANUP
> > +])
> > +
> > --
> > 2.31.1
> >
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> >
diff mbox series

Patch

diff --git a/controller/binding.c b/controller/binding.c
index 0bef5dc42..c37066cbe 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -1317,6 +1317,14 @@  lport_maybe_postpone(const char *port_name, long long int now,
     return true;
 }
 
+static bool
+is_postponed_port(const char *port_name)
+{
+    struct claimed_port *cp =
+        (struct claimed_port *) sset_find(&_postponed_ports, port_name);
+    return !!cp;
+}
+
 /* Returns false if lport is not claimed due to 'sb_readonly'.
  * Returns true otherwise.
  */
@@ -1491,7 +1499,8 @@  is_binding_lport_this_chassis(struct binding_lport *b_lport,
 {
     return (b_lport && b_lport->pb && chassis &&
             (b_lport->pb->chassis == chassis
-             || is_additional_chassis(b_lport->pb, chassis)));
+             || is_additional_chassis(b_lport->pb, chassis)
+             || is_postponed_port(b_lport->pb->logical_port)));
 }
 
 /* Returns 'true' if the 'lbinding' has binding lports of type LP_CONTAINER,
@@ -1593,6 +1602,7 @@  consider_vif_lport_(const struct sbrec_port_binding *pb,
         }
 
         if (!lbinding_set || !can_bind) {
+            remove_related_lport(pb, b_ctx_out);
             return release_lport(pb, b_ctx_in->chassis_rec,
                                  !b_ctx_in->ovnsb_idl_txn,
                                  b_ctx_out->tracked_dp_bindings,
diff --git a/tests/ovn.at b/tests/ovn.at
index 74c5bccc0..b0aba2207 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -37838,3 +37838,60 @@  OVN_CLEANUP([hv1])
 
 AT_CLEANUP
 ])
+
+OVN_FOR_EACH_NORTHD([
+AT_SETUP([Deleting vif while controller fight for port claim])
+ovn_start
+
+ovn-nbctl ls-add ls0
+ovn-nbctl lsp-add ls0 lsp0
+ovn-nbctl lsp-add ls0 lsp1
+
+net_add n1
+for i in 1 2; do
+    sim_add hv$i
+    as hv$i
+    ovs-vsctl add-br br-phys
+    ovn_attach n1 br-phys 192.168.0.$i
+done
+
+check ovn-nbctl --wait=hv sync
+hv1_uuid=$(ovn-sbctl --bare --columns _uuid list chassis hv1)
+hv2_uuid=$(ovn-sbctl --bare --columns _uuid list chassis hv2)
+
+as hv1 ovs-vsctl -- add-port br-int vif1 -- set Interface vif1 external-ids:iface-id=lsp1
+as hv1 ovs-vsctl -- add-port br-int vif -- set Interface vif external-ids:iface-id=lsp0
+wait_for_ports_up
+
+# Delete vif => store flows w/ only vif1, and no vif
+as hv1 ovs-vsctl -- del-port br-int vif
+check ovn-nbctl --wait=hv sync
+DUMP_FLOWS([hv1], [oflows1])
+sleep_controller hv1
+as hv2 ovs-vsctl -- add-port br-int vif -- set Interface vif external-ids:iface-id=lsp0
+as hv1 ovs-vsctl -- add-port br-int vif -- set Interface vif external-ids:iface-id=lsp0
+
+OVS_WAIT_UNTIL([
+    chassis=$(ovn-sbctl --bare --columns chassis list port_binding lsp0)
+    test "$chassis" = $hv2_uuid
+])
+
+sleep_sb
+wake_up_controller hv1
+sleep_controller hv2
+
+as hv1 ovs-vsctl -- del-port br-int vif
+wake_up_sb
+wake_up_controller hv2
+
+as hv2 ovs-vsctl -- del-port br-int vif
+check ovn-nbctl --wait=hv sync
+
+DUMP_FLOWS([hv1], [oflows2])
+
+check diff oflows1 oflows2
+OVN_CLEANUP([hv1],[hv2])
+
+AT_CLEANUP
+])
+