The various fixes in handling physical and binding changes have addressed the problems that the original attempt to incrementally process the multicast group table ran into. So, re-add incremental processing of the multicast group table.
Notes: - This patch renders the short term changes in [1] taken for multicast group processing unnecessary (and so it conflicts with [1]). - Running through the ovn unit tests 50 times with -j4 didn't show increased test case failures over the baseline code prior to adding this patch. [1] http://patchwork.ozlabs.org/patch/652117/ Signed-off-by: Ryan Moats <rmo...@us.ibm.com> --- ovn/controller/physical.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/ovn/controller/physical.c b/ovn/controller/physical.c index a104e33..b10baed 100644 --- a/ovn/controller/physical.c +++ b/ovn/controller/physical.c @@ -61,11 +61,13 @@ static struct hmap tunnels = HMAP_INITIALIZER(&tunnels); /* UUID to identify OF flows not associated with ovsdb rows. */ static struct uuid *hc_uuid = NULL; static bool full_binding_processing = false; +static bool full_mcgroup_processing = false; void physical_reset_processing(void) { full_binding_processing = true; + full_mcgroup_processing = true; } /* Maps from a chassis to the OpenFlow port number of the tunnel that can be @@ -675,6 +677,7 @@ physical_run(struct controller_ctx *ctx, enum mf_field_id mff_ovn_geneve, tun->ofport = u16_to_ofp(ofport); tun->type = tunnel_type; full_binding_processing = true; + full_mcgroup_processing = true; binding_reset_processing(); /* Reprocess logical flow table immediately. */ @@ -715,6 +718,7 @@ physical_run(struct controller_ctx *ctx, enum mf_field_id mff_ovn_geneve, } if (localvif_map_changed) { full_binding_processing = true; + full_mcgroup_processing = true; /* Reprocess logical flow table immediately. */ lflow_reset_processing(); @@ -751,9 +755,25 @@ physical_run(struct controller_ctx *ctx, enum mf_field_id mff_ovn_geneve, const struct sbrec_multicast_group *mc; struct ofpbuf remote_ofpacts; ofpbuf_init(&remote_ofpacts, 0); - SBREC_MULTICAST_GROUP_FOR_EACH (mc, ctx->ovnsb_idl) { - consider_mc_group(mff_ovn_geneve, ct_zones, - local_datapaths, mc, &ofpacts, &remote_ofpacts); + if (full_mcgroup_processing) { + SBREC_MULTICAST_GROUP_FOR_EACH (mc, ctx->ovnsb_idl) { + consider_mc_group(mff_ovn_geneve, ct_zones, + local_datapaths, mc, &ofpacts, &remote_ofpacts); + } + full_mcgroup_processing = false; + } else { + SBREC_MULTICAST_GROUP_FOR_EACH_TRACKED (mc, ctx->ovnsb_idl) { + if (sbrec_multicast_group_is_deleted(mc)) { + ofctrl_remove_flows(&mc->header_.uuid); + } else { + if (!sbrec_multicast_group_is_new(mc)) { + ofctrl_remove_flows(&mc->header_.uuid); + } + consider_mc_group(mff_ovn_geneve, ct_zones, + local_datapaths, mc, &ofpacts, + &remote_ofpacts); + } + } } ofpbuf_uninit(&remote_ofpacts); -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev