On 18 July 2016 at 13:11, Ben Pfaff <b...@ovn.org> wrote:

> On Mon, Jul 18, 2016 at 11:34:54AM -0700, Guru Shetty wrote:
> > On 18 July 2016 at 10:35, Ben Pfaff <b...@ovn.org> wrote:
> >
> > > On Mon, Jul 18, 2016 at 12:00:30AM -0700, Gurucharan Shetty wrote:
> > > > We should not use "peer" while connecting a router to a switch.
> > > > (Doing so, will cause ovn-northd to constantly create and destroy
> > > > port_binding records which causes CPU utilization of ovn-controller
> to
> > > > spike up.)
> > > >
> > > > Fixes: 31114af758c7e6 ("ovn-nbctl: Update logical router port
> commands.")
> > > > Signed-off-by: Gurucharan Shetty <g...@ovn.org>
> > >
> > > I updated the commit message to correctly say:
> >     We should not use "peer" while connecting a router to a switch.
> >     (Doing so, will cause ovn-northd to constantly create and destroy
> >     logical_flow records which causes CPU utilization of ovn-controller
> to
> >     spike up.)
> >
> >
> > > This seems like a bug in ovn-northd.  Did you investigate why it
> > > happens?
> > >
> > I think I know ( I haven't put a debugger to confirm). We create a
> logical
> > flow incorrectly and add it via ovn_lflow_add() with a switch's datapath
> > and a router's pipeline stage (S_ROUTER_IN_ARP_RESOLVE) here (This is
> when
> > we incorrectly set router's peer as a switch):
> >
> https://github.com/openvswitch/ovs/blob/master/ovn/northd/ovn-northd.c#L2614
>
> Oh, good spotting, can we fix it something like this?
>
> diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
> index 7ce509d..97e3271 100644
> --- a/ovn/northd/ovn-northd.c
> +++ b/ovn/northd/ovn-northd.c
> @@ -715,7 +736,10 @@ join_logical_ports(struct northd_context *ctx,
>                  sizeof *op->od->router_ports * (op->od->n_router_ports +
> 1));
>              op->od->router_ports[op->od->n_router_ports++] = op;
>          } else if (op->nbr && op->nbr->peer) {
> -            op->peer = ovn_port_find(ports, op->nbr->peer);
> +            struct ovn_port *peer = ovn_port_find(ports, op->nbr->peer);
> +            if (peer && peer->nbr) {
> +                op->peer = peer;
> +            }
>          }
>      }
>  }
>
Since the original patch in question fixed faulty tests independently, I
had applied it as soon as I got your Ack. The above code snippet is good
underlying fix. So you have my:
Acked-by: Gurucharan Shetty <g...@ovn.org>


>
> > In build_lflows, we go through each record of SB database's logical flows
> > and then do a ovn_lflow_find() which returns a negative if the data was
> > wrongly inserted, so it goes ahead and deleted the record from SB
> database.
> >
> > In the next block, it will insert it back into the SB database. I will
> send
> > one additional fix. But, I think we should also assert in ovn_lflow_add
> if
> > we add a datapath with a different datapath's pipeline - not sure what
> is a
> > nice way to do that.
>
> Here's an idea (it compiles but I didn't test it):
>
Nice. I tested the below and the tests asserted with a wrong configuration.
You have my:
Acked-by: Gurucharan Shetty <g...@ovn.org>

I think the below patch which Ryan Acked is probably still relevant to
apply?
https://patchwork.ozlabs.org/patch/649723/

>
> diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
> index 7ce509d..905f6a7 100644
> --- a/ovn/northd/ovn-northd.c
> +++ b/ovn/northd/ovn-northd.c
> @@ -175,6 +175,20 @@ ovn_stage_to_str(enum ovn_stage stage)
>          default: return "<unknown>";
>      }
>  }
> +
> +/* Returns the type of the datapath to which a flow with the given
> 'stage' may
> + * be added. */
> +static enum ovn_datapath_type
> +ovn_stage_to_datapath_type(enum ovn_stage stage)
> +{
> +    switch (stage) {
> +#define PIPELINE_STAGE(DP_TYPE, PIPELINE, STAGE, TABLE, NAME)       \
> +        case S_##DP_TYPE##_##PIPELINE##_##STAGE: return DP_##DP_TYPE;
> +    PIPELINE_STAGES
> +#undef PIPELINE_STAGE
> +    default: OVS_NOT_REACHED();
> +    }
> +}
>
>  static void
>  usage(void)
> @@ -303,6 +317,13 @@ ovn_datapath_destroy(struct hmap *datapaths, struct
> ovn_datapath *od)
>      }
>  }
>
> +/* Returns 'od''s datapath type. */
> +static enum ovn_datapath_type
> +ovn_datapath_get_type(const struct ovn_datapath *od)
> +{
> +    return od->nbs ? DP_SWITCH : DP_ROUTER;
> +}
> +
>  static struct ovn_datapath *
>  ovn_datapath_find(struct hmap *datapaths, const struct uuid *uuid)
>  {
> @@ -985,6 +1006,8 @@ ovn_lflow_add(struct hmap *lflow_map, struct
> ovn_datapath *od,
>                enum ovn_stage stage, uint16_t priority,
>                const char *match, const char *actions)
>  {
> +    ovs_assert(ovn_stage_to_datapath_type(stage) ==
> ovn_datapath_get_type(od));
> +
>      struct ovn_lflow *lflow = xmalloc(sizeof *lflow);
>      ovn_lflow_init(lflow, od, stage, priority,
>                     xstrdup(match), xstrdup(actions));
>
> Thanks,
>
> Ben.
> _______________________________________________
> 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