On 7 July 2016 at 14:15, Darrell Ball <dlu...@gmail.com> wrote:

> On Thu, Jul 7, 2016 at 1:17 PM, Russell Bryant <russ...@ovn.org> wrote:
>
> >
> >
> > On Wed, Jul 6, 2016 at 8:37 PM, Darrell Ball <dlu...@gmail.com> wrote:
> >
> >> Patched datapaths that are no longer referenced should be removed from
> >> the patched_datapaths map; otherwise incorrect state references for a
> >> patched datapath may be used and also datapaths that are absent will be
> >> interpreted as present.
> >>
> >> Signed-off-by: Darrell Ball <dlu...@gmail.com>
> >>
> >
> > What failure was observed to find this issue?
> >
>
> This is caught by code reading as I would like to rely on the correctness
> of this
> internal datastructure in future.
>
>
>
> > Could we add a test case that would have caught it?
> >
>
> I tested this with instrumented code and a contrived test.
> Since this relates to internal datastructure management, I don't intend to
> add a test case
> for this.
>
> When testcases are added for OVN NAT code, which relies on this
> datastructure internal fields, I might add a delta
> on top of those if those tests are lacking. If I also add a feature that
> depends on this datastructure, I will a
> test for it as I normally do...
>

Fwiw, there are a couple of unit tests that currently add gateway routers
(but don't test deleting them)
e.g: https://github.com/openvswitch/ovs/blob/master/tests/ovn.at#L2940


>
>
> >
> >
> >> ---
> >>  ovn/controller/ovn-controller.h |  3 ++-
> >>  ovn/controller/patch.c          | 23 ++++++++++++++++++++---
> >>  2 files changed, 22 insertions(+), 4 deletions(-)
> >>
> >> diff --git a/ovn/controller/ovn-controller.h
> >> b/ovn/controller/ovn-controller.h
> >> index 6a021a0..8816940 100644
> >> --- a/ovn/controller/ovn-controller.h
> >> +++ b/ovn/controller/ovn-controller.h
> >> @@ -51,8 +51,9 @@ struct local_datapath *get_local_datapath(const struct
> >> hmap *,
> >>   * with at least one logical patch port binding. */
> >>  struct patched_datapath {
> >>      struct hmap_node hmap_node;
> >> -    bool local; /* 'True' if the datapath is for gateway router. */
> >>      const struct sbrec_port_binding *port_binding;
> >> +    bool local; /* 'True' if the datapath is for gateway router. */
> >> +    bool stale;
> >>  };
> >>
> >>  struct patched_datapath *get_patched_datapath(const struct hmap *,
> >> diff --git a/ovn/controller/patch.c b/ovn/controller/patch.c
> >> index 589529e..a701db2 100644
> >> --- a/ovn/controller/patch.c
> >> +++ b/ovn/controller/patch.c
> >> @@ -252,12 +252,14 @@ static void
> >>  add_patched_datapath(struct hmap *patched_datapaths,
> >>                       const struct sbrec_port_binding *binding_rec, bool
> >> local)
> >>  {
> >> -    if (get_patched_datapath(patched_datapaths,
> >> -                             binding_rec->datapath->tunnel_key)) {
> >> +    struct patched_datapath * pd;
> >> +    if (pd = get_patched_datapath(patched_datapaths,
> >> +                                  binding_rec->datapath->tunnel_key)) {
> >>
> >
> > Can you move the assignment outside the if condition?
> >
> > CodingStyle.md says "Avoid assignments inside "if" and "while"
> conditions."
> >
>
>
> alright
>
>
>
> >
> >
> >> +        pd->stale = false;
> >>          return;
> >>      }
> >>
> >> -    struct patched_datapath *pd = xzalloc(sizeof *pd);
> >> +    pd = xzalloc(sizeof *pd);
> >>      pd->local = local;
> >>      pd->port_binding = binding_rec;
> >>      hmap_insert(patched_datapaths, &pd->hmap_node,
> >> @@ -300,6 +302,13 @@ add_logical_patch_ports(struct controller_ctx *ctx,
> >>      }
> >>
> >>      const struct sbrec_port_binding *binding;
> >> +
> >> +    /* Mark all patched datapaths as stale for later cleanup check */
> >> +    struct patched_datapath *pd;
> >> +    HMAP_FOR_EACH (pd, hmap_node, patched_datapaths) {
> >> +        pd->stale = true;
> >> +    }
> >> +
> >>      SBREC_PORT_BINDING_FOR_EACH (binding, ctx->ovnsb_idl) {
> >>          bool local_port = false;
> >>          if (!strcmp(binding->type, "gateway")) {
> >> @@ -332,6 +341,14 @@ add_logical_patch_ports(struct controller_ctx *ctx,
> >>              }
> >>          }
> >>      }
> >> +    /* Clean up stale patched datapaths. */
> >> +    struct patched_datapath *pd_cur_node, *pd_next_node;
> >> +    HMAP_FOR_EACH_SAFE (pd_cur_node, pd_next_node, hmap_node,
> >> patched_datapaths) {
> >> +        if (pd_cur_node->stale == true) {
> >> +            hmap_remove(patched_datapaths, &pd_cur_node->hmap_node);
> >> +            free(pd_cur_node);
> >> +        }
> >> +    }
> >>  }
> >>
> >>  void
> >> --
> >> 1.9.1
> >>
> >> _______________________________________________
> >> dev mailing list
> >> dev@openvswitch.org
> >> http://openvswitch.org/mailman/listinfo/dev
> >>
> >
> >
> >
> > --
> > Russell Bryant
> >
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to