On Thu, May 21, 2020 at 11:14 AM Han Zhou <hz...@ovn.org> wrote: > Hi Numan, I think this patch is not harmful, but not necessary for the I-P > series. And for (2) in the commit message I want to clarify. Please see my > comments below. >
You're right. This patch is not needed. It was earlier needed when the series was not handling run time data changes. My bad that I didn't test without this patch. In v8, I've dropped this patch. Thanks for the review and comments. > > On Wed, May 20, 2020 at 12:40 PM <num...@ovn.org> wrote: > > > > From: Numan Siddique <num...@ovn.org> > > > > If ofctrl_check_and_add_flow(F') is called where flow F' has > match-actions (M, A2) > > and if there already exists a flow F with match-actions (M, A1) in the > desired flow > > table, then > > (1) If F and F' share the same 'sb_uuid', this function doesn't update > the > > existing flow F with new actions A2. > > > > (2) If F and F' don't share the same 'sb_uuid', this function adds F' > > also into the flow table with F and F' having the same hash. While > installing > > the flows only one will be considered. > > > > This patch fixes (1) by updating the F with the new actions A2. > > This is required for the upcoming patch in this series which adds > incremental > > processing for OVS interface in the flow output stage. Since we will be > not be > > clearing the flow output data if these changes are handled incrementally, > some > > of the existing flows will be updated with new actions. One such example > would > > be flows in physical table OFTABLE_LOCAL_OUTPUT (table 33). This patch is > > required to update such flows. Otherwise we will have incomplete actions > installed. > > > I think (1) shouldn't happen normally if we follow the principle of > handling deletions first and handle updates by deleting old entries and > then handle as additions. If it happens, it means something is wrong (e.g. > there are multiple flows generated by same lflow but with same match > condition) and we can't handle it anyway in OVS flows. It should be logged > as warning or error instead of debug. I think the log level is a miss when > I submit the initial I-P patches. > > > We should also address (2) and it should be fixed > > - by logging the duplicate flow F' > > - and discarding F'. > > > > Scenario (2) can happen when > > - either ovn-northd installs 2 logical flows with same match but with > > different actions due to some bug in ovn-northd > > > > - CMS adds 2 ACLs with the same match and priority, but with different > > actions. > > > (2) was on purpose and we can't drop the F'. If there are 2 lflows with > same match condition, we need to have both in the table, so that later if > one of them is deleted, we know which one to delete. In reality, this can > be a misconfig in ACL and then it is corrected by removing one of them. In > this case we want the final action remained to be the correct one. Consider > below steps: > a) 2 ACLs with same match condition are added: ACL1 has action drop, ACL2 > has action allow. > b) flow1 for ACL1 is added with action drop with sb_uuid1, and flow2 for > ACL2 is added with action allow with sb_uuid2 > c) flow1 is installed to OVS with action drop, because we don't know the > real intention of the user so has to choose which ever comes first. > d) ACL1 is deleted by user because the user figured out the problem and > action allow is desired for the ACL, and the flow1 is removed according > sb_uuid1 > e) ofctrl_run figures out the difference of the installed flow1 and desired > flow2, they have same match but different actions, so the OVS flow is > updated with action allow. > Ok. Thanks for the explanation. Numan > > > However this patch doesn't attempt to fix (2). > > > > Acked-by: Mark Michelson <mmich...@redhat.com> > > Signed-off-by: Numan Siddique <num...@ovn.org> > > --- > > controller/ofctrl.c | 34 +++++++++++++++++++++++++++------- > > 1 file changed, 27 insertions(+), 7 deletions(-) > > > > diff --git a/controller/ofctrl.c b/controller/ofctrl.c > > index b8a9c2da8..edc22824f 100644 > > --- a/controller/ofctrl.c > > +++ b/controller/ofctrl.c > > @@ -642,6 +642,19 @@ ofctrl_recv(const struct ofp_header *oh, enum > ofptype type) > > } > > } > > > > +static void > > +ofctrl_swap_flow_actions(struct ovn_flow *a, struct ovn_flow *b) > > +{ > > + struct ofpact *tmp = a->ofpacts; > > + size_t tmp_len = a->ofpacts_len; > > + > > + a->ofpacts = b->ofpacts; > > + a->ofpacts_len = b->ofpacts_len; > > + > > + b->ofpacts = tmp; > > + b->ofpacts_len = tmp_len; > > +} > > + > > /* Flow table interfaces to the rest of ovn-controller. */ > > > > /* Adds a flow to 'desired_flows' with the specified 'match' and > 'actions' to > > @@ -667,14 +680,21 @@ ofctrl_check_and_add_flow(struct > ovn_desired_flow_table *flow_table, > > > > ovn_flow_log(f, "ofctrl_add_flow"); > > > > - if (ovn_flow_lookup(&flow_table->match_flow_table, f, true)) { > > - if (log_duplicate_flow) { > > - static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, > 5); > > - if (!VLOG_DROP_DBG(&rl)) { > > - char *s = ovn_flow_to_string(f); > > - VLOG_DBG("dropping duplicate flow: %s", s); > > - free(s); > > + struct ovn_flow *existing_f = > > + ovn_flow_lookup(&flow_table->match_flow_table, f, true); > > + if (existing_f) { > > + if (ofpacts_equal(f->ofpacts, f->ofpacts_len, > > + existing_f->ofpacts, existing_f->ofpacts_len)) > { > > + if (log_duplicate_flow) { > > + static struct vlog_rate_limit rl = > VLOG_RATE_LIMIT_INIT(5, 5); > > + if (!VLOG_DROP_DBG(&rl)) { > > + char *s = ovn_flow_to_string(f); > > + VLOG_DBG("dropping duplicate flow: %s", s); > > + free(s); > > + } > > } > > + } else { > > + ofctrl_swap_flow_actions(f, existing_f); > > } > > ovn_flow_destroy(f); > > return; > > -- > > 2.26.2 > > > > _______________________________________________ > > dev mailing list > > d...@openvswitch.org > > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev