On Tue, Jul 19, 2016 at 02:18:11PM -0500, Ryan Moats wrote:
> 
> 
> Ben Pfaff <b...@ovn.org> wrote on 07/19/2016 01:39:43 PM:
> 
> > From: Ben Pfaff <b...@ovn.org>
> > To: Ryan Moats/Omaha/IBM@IBMUS
> > Cc: dev@openvswitch.org
> > Date: 07/19/2016 01:41 PM
> > Subject: Re: [ovs-dev, v23, 2/2] ovn-controller: Add incremental
> > processing to lflow_run and physical_run
> >
> > On Tue, Jul 19, 2016 at 08:10:05AM -0500, Ryan Moats wrote:
> > >
> > >
> > > Ben Pfaff <b...@ovn.org> wrote on 07/19/2016 12:57:23 AM:
> > >
> > > > From: Ben Pfaff <b...@ovn.org>
> > > > To: Ryan Moats/Omaha/IBM@IBMUS
> > > > Cc: dev@openvswitch.org
> > > > Date: 07/19/2016 12:57 AM
> > > > Subject: Re: [ovs-dev, v23, 2/2] ovn-controller: Add incremental
> > > > processing to lflow_run and physical_run
> > > >
> > > > On Mon, Jul 18, 2016 at 04:21:17PM -0500, Ryan Moats wrote:
> > > > > This code changes to allow incremental processing of the
> > > > > logical flow and physical binding tables whenver possible.
> > > > >
> > > > > Note: flows created by physical_run for multicast_groups are
> > > > > *NOT* handled incrementally due to to be solved issues
> > > > > with GWs and local routers.
> > > > >
> > > > > Signed-off-by: Ryan Moats <rmo...@us.ibm.com>
> > > >
> > > > With this applied, I get a number of apparently consistent test
> failures
> > > > (literally no passes in 5+ runs) that I don't see, at least not
> > > > consistently, if I revert it:
> > > >
> > > >     OVN end-to-end tests
> > > >
> > > >     2106: ovn -- vtep: 3 HVs, 1 VIFs/HV, 1 GW, 1 LS       FAILED
> > > (ovn.at:1307)
> > > >     2107: ovn -- 3 HVs, 1 VIFs/HV, 1 software GW, 1 LS    FAILED
> > > (ovn.at:1473)
> > > >     2108: ovn -- 3 HVs, 3 LS, 3 lports/LS, 1 LR           FAILED
> > > (ovn.at:1887)
> > > >     2110: ovn -- 2 HVs, 2 LS, 1 lport/LS, 2 peer LRs      FAILED
> > > (ovn.at:2416)
> > > >     2115: ovn -- 2 HVs, 3 LRs connected via LS, static routes FAILED
> > > > (ovn.at:3053)
> > > >
> > > > Do these pass reasonably often for you?  (Maybe my changes to the
> > > > previous patch screwed something up?)
> > > >
> > >
> > > First, not all of the above cases failed for me even with a rebase of
> the
> > > last patch onto what is currently in master - the last two passed for
> me
> > > on either the first and second run, so I'm looking at the first three
> for
> > > the rest of this message.
> > >
> > > Double checking by going back to my original first patch verified that
> all
> > > of the tests in question passed.  Going through and checking each of
> the
> > > changes that you made to the first patch, the following is the diff I
> > > needed
> > > to make things work again:
> > >
> > > diff --git a/ovn/controller/ofctrl.c b/ovn/controller/ofctrl.c
> > > index d10dcc6..e113213 100644
> > > --- a/ovn/controller/ofctrl.c
> > > +++ b/ovn/controller/ofctrl.c
> > > @@ -553,7 +553,10 @@ ofctrl_add_flow(uint8_t table_id, uint16_t
> priority,
> > >      ovn_flow_lookup(&match_flow_table, f, &existing);
> > >      struct ovn_flow *d;
> > >      LIST_FOR_EACH (d, list_node, &existing) {
> > > -        if (uuid_equals(&f->uuid, &d->uuid)) {
> > > +        if (f->table_id == d->table_id && f->priority == d->priority
> > > +            && ofpacts_equal(f->ofpacts, f->ofpacts_len,
> > > +                             d->ofpacts, d->ofpacts_len)
> > > +            && uuid_equals(&f->uuid, &d->uuid)) {
> > >              static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5,
> 1);
> > >              char *s = ovn_flow_to_string(f);
> > >              VLOG_WARN_RL(&rl, "found duplicate flow %s for parent
> > > "UUID_FMT,
> > >
> > > Hopefully that will get you past the test failures and you can push
> > > both it and the rest of the last incremental processing patch.
> >
> > OK...
> >
> > Help me understand why that change is correct.
> >
> > I deleted the table_id and priority checks because ovn_flow_lookup()
> > only returns flows where those are equal anyhow, so they seemed
> > completely redundant.  That leaves the actions comparison.  Why would we
> > report a duplicate only if the actions are the same?  It's actually
> > worse, isn't it, if the actions are different, because then the flows
> > aren't just duplicates, they're inconsistent with each other.
> 
> Actually, you are correct in that I'm doing something I shouldn't, but
> your solution is also doing something it shouldn't.  Yes, my keeping
> rules that are inconsistent is wrong, but discarding rules where
> the action changes (which is what you proposed) doesn't work either.
> 
> How about if we split the difference?  First, verify that the uuid
> is the same, then check the actions.  If they are the same, spawn a
> warning, and if they aren't replace the old actions with the new ones.
> This appears to pass unit tests as well (and I think it's more correct),
> in which case the difference becomes:
> 
> diff --git a/ovn/controller/ofctrl.c b/ovn/controller/ofctrl.c
> index d10dcc6..0b8326e 100644
> --- a/ovn/controller/ofctrl.c
> +++ b/ovn/controller/ofctrl.c
> @@ -554,13 +554,21 @@ ofctrl_add_flow(uint8_t table_id, uint16_t priority,
>      struct ovn_flow *d;
>      LIST_FOR_EACH (d, list_node, &existing) {
>          if (uuid_equals(&f->uuid, &d->uuid)) {
> -            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
> -            char *s = ovn_flow_to_string(f);
> -            VLOG_WARN_RL(&rl, "found duplicate flow %s for parent
> "UUID_FMT,
> -                         s, UUID_ARGS(&f->uuid));
> -            ovn_flow_destroy(f);
> -            free(s);
> -            return;
> +            if (ofpacts_equal(f->ofpacts, f->ofpacts_len,
> +                              d->ofpacts, d->ofpacts_len)) {
> +                static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5,
> 1);
> +                char *s = ovn_flow_to_string(f);
> +                VLOG_WARN_RL(&rl, "found duplicate flow %s for parent
> "UUID_FMT
> +                             s, UUID_ARGS(&f->uuid));
> +                ovn_flow_destroy(f);
> +                free(s);
> +                return;
> +            } else {
> +                /* Update the action. */
> +                free(d->ofpacts);
> +                d->ofpacts = xmemdup(f->ofpacts, f->ofpacts_len);
> +                d->ofpacts_len = f->ofpacts_len;
> +            }
>          }
>      }
> 

I'm OK with updating the actions, but I'd prefer to warn about it anyway
because I still think it's a bug; if the "new" actions happen to work
better than the "old" actions, I think that's just a coincidence.
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to