[ovs-dev] [PATCH v2] ovn: Delete stale MAC_Binding records
Ryan Moats
rmoats at us.ibm.com
Thu Aug 25 15:22:53 UTC 2016
"dev" <dev-bounces at openvswitch.org> wrote on 08/16/2016 02:27:30 PM:
> From: Chandra Sekhar Vejendla/San Jose/IBM at IBMUS
> To: dev at openvswitch.org
> Date: 08/16/2016 02:33 PM
> Subject: [ovs-dev] [PATCH v2] ovn: Delete stale MAC_Binding records
> Sent by: "dev" <dev-bounces at openvswitch.org>
>
> Entries in MAC_Binding table are not deleted when the logical_ports
> referred to in MAC_Bindings are deleted. The patch fixes this by
> deleting the MAC_Binding entry when the logical_port is not found.
>
> Signed-off-by: Chandra Sekhar Vejendla <csvejend at us.ibm.com>
> ---
> ovn/controller/lflow.c | 25 +++++++++++++++++--------
> tests/ovn.at | 25 +++++++++++++++++++++++++
> 2 files changed, 42 insertions(+), 8 deletions(-)
>
> diff --git a/ovn/controller/lflow.c b/ovn/controller/lflow.c
> index 341ca08..fbd36dc 100644
> --- a/ovn/controller/lflow.c
> +++ b/ovn/controller/lflow.c
> @@ -510,13 +510,11 @@ put_load(const uint8_t *data, size_t len,
> }
>
> static void
> -consider_neighbor_flow(const struct lport_index *lports,
> +consider_neighbor_flow(const struct sbrec_port_binding *pb,
> const struct sbrec_mac_binding *b,
> struct ofpbuf *ofpacts_p,
> struct match *match_p)
> {
> - const struct sbrec_port_binding *pb
> - = lport_lookup_by_name(lports, b->logical_port);
> if (!pb) {
> return;
> }
> @@ -571,10 +569,19 @@ add_neighbor_flows(struct controller_ctx *ctx,
> match_init_catchall(&match);
> ofpbuf_init(&ofpacts, 0);
>
> - const struct sbrec_mac_binding *b;
> + const struct sbrec_port_binding *pb;
> + const struct sbrec_mac_binding *b, *n;
> if (full_neighbor_flow_processing) {
> - SBREC_MAC_BINDING_FOR_EACH (b, ctx->ovnsb_idl) {
> - consider_neighbor_flow(lports, b, &ofpacts, &match);
> + SBREC_MAC_BINDING_FOR_EACH_SAFE (b, n, ctx->ovnsb_idl) {
> + /* Remove mac binding record if the port binding for the
logical
> + * port in mac binding record is not found. */
> + pb = lport_lookup_by_name(lports, b->logical_port);
> + if (!pb && ctx->ovnsb_idl_txn) {
> + ofctrl_remove_flows(&b->header_.uuid);
> + sbrec_mac_binding_delete(b);
> + continue;
> + }
> + consider_neighbor_flow(pb, b, &ofpacts, &match);
> }
> full_neighbor_flow_processing = false;
> } else {
> @@ -585,11 +592,13 @@ add_neighbor_flows(struct controller_ctx *ctx,
> if (!sbrec_mac_binding_is_new(b)) {
> ofctrl_remove_flows(&b->header_.uuid);
> }
> - consider_neighbor_flow(lports, b, &ofpacts, &match);
> + pb = lport_lookup_by_name(lports, b->logical_port);
> + if (pb) {
> + consider_neighbor_flow(pb, b, &ofpacts, &match);
> + }
> }
> }
> }
> -
> ofpbuf_uninit(&ofpacts);
> }
>
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 216bb07..dbb205c 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -4965,3 +4965,28 @@ cat packets
> OVN_CLEANUP([hv1])
>
> AT_CLEANUP
> +
> +AT_SETUP([ovn -- delete mac bindings])
> +AT_KEYWORDS([ovn])
> +ovn_start
> +net_add n1
> +sim_add hv1
> +as hv1
> +ovs-vsctl -- add-br br-phys
> +ovn_attach n1 br-phys 192.168.0.1
> +# Create logical switch ls0
> +ovn-nbctl ls-add ls0
> +# Create port lp0 in ls0
> +ovn-nbctl lsp-add ls0 lp0
> +ovn-nbctl lsp-set-addresses lp0 "f0:00:00:00:00:01 192.168.0.1"
> +dp_uuid=`ovn-sbctl find datapath | grep uuid | cut -f2 -d ":" | cut
> -f2 -d " "`
> +ovn-sbctl create MAC_Binding ip=10.0.0.1 datapath=$dp_uuid
> logical_port=lp0 mac="mac"
> +ovn-sbctl find MAC_Binding
> +#Delete port lp0
> +ovn-nbctl lsp-del lp0
> +ovn-sbctl find MAC_Binding
> +AT_CHECK([ovn-sbctl find MAC_Binding], [0], [])
> +
> +OVN_CLEANUP([hv1])
> +
> +AT_CLEANUP
> --
I think this should be abandoned in favor of
http://patchwork.ozlabs.org/patch/662152/ as trying to fix this
in ovn-controller rather than in ovn-northd will lead to race
conditions.
More information about the dev
mailing list