> On Jul 25, 2016, at 12:28 PM, Ryan Moats <rmo...@us.ibm.com> wrote: > > While commit ab39371d68842b7e4000cc5d8718e6fc04e92795 > (ovn-controller: Handle physical changes correctly) addressed > unit test failures, it did so at the cost of performance: [1] > notes that ovn-controller cpu usage is now pegged at 100%. > > Root cause of this is that while the storage for tunnels is > persisted, their creation is not (which the above changed > incorrectly assumed was the case). This patch persists > tunneled data across invocations of physical_run. A side > effect is that renaming of localfvif_map_changed variable > to physical_map_changed and extending its scope to include > tunnel changes. >
I tested this fix by using a Vagrant file that stamps out vms as compute nodes. To deploy ovn, call the script “/vagrant/scripts/setup-ovn-cluster.sh” and that would render ovn-controller in compute nodes to peg the cpu at 100% before the changes. More info on _easily_ deploying this cluster is available here: https://github.com/flavio-fernandes/just-ovn-nodes/blob/master/README.md > [1] http://openvswitch.org/pipermail/dev/2016-July/076058.html > > Signed-off-by: Ryan Moats <rmo...@us.ibm.com> Acked-by: Flavio Fernandes <fla...@flaviof.com> Tested-by: Flavio Fernandes <fla...@flaviof.com> > --- > ovn/controller/physical.c | 59 +++++++++++++++++++++++++++++------------------ > 1 file changed, 37 insertions(+), 22 deletions(-) > > diff --git a/ovn/controller/physical.c b/ovn/controller/physical.c > index a104e33..e788fe5 100644 > --- a/ovn/controller/physical.c > +++ b/ovn/controller/physical.c > @@ -605,8 +605,13 @@ physical_run(struct controller_ctx *ctx, enum > mf_field_id mff_ovn_geneve, > uuid_generate(hc_uuid); > } > > + /* This bool tracks physical mapping changes. */ > + bool physical_map_changed = false; > + > struct simap new_localvif_to_ofport = > SIMAP_INITIALIZER(&new_localvif_to_ofport); > + struct simap new_tunnel_to_ofport = > + SIMAP_INITIALIZER(&new_tunnel_to_ofport); > for (int i = 0; i < br_int->n_ports; i++) { > const struct ovsrec_port *port_rec = br_int->ports[i]; > if (!strcmp(port_rec->name, br_int->name)) { > @@ -668,18 +673,23 @@ physical_run(struct controller_ctx *ctx, enum > mf_field_id mff_ovn_geneve, > continue; > } > > - struct chassis_tunnel *tun = xmalloc(sizeof *tun); > - hmap_insert(&tunnels, &tun->hmap_node, > - hash_string(chassis_id, 0)); > - tun->chassis_id = chassis_id; > - tun->ofport = u16_to_ofp(ofport); > - tun->type = tunnel_type; > - full_binding_processing = true; > - binding_reset_processing(); > - > - /* Reprocess logical flow table immediately. */ > - lflow_reset_processing(); > - poll_immediate_wake(); > + simap_put(&new_tunnel_to_ofport, chassis_id, ofport); > + struct chassis_tunnel *tun; > + if ((tun = chassis_tunnel_find(chassis_id))) { > + /* If the tunnel's ofport has changed, update. */ > + if (tun->ofport != u16_to_ofp(ofport)) { > + tun->ofport = u16_to_ofp(ofport); > + physical_map_changed = true; > + } > + } else { > + tun = xmalloc(sizeof *tun); > + hmap_insert(&tunnels, &tun->hmap_node, > + hash_string(chassis_id, 0)); > + tun->chassis_id = chassis_id; > + tun->ofport = u16_to_ofp(ofport); > + tun->type = tunnel_type; > + physical_map_changed = true; > + } > break; > } else { > const char *iface_id = smap_get(&iface_rec->external_ids, > @@ -691,29 +701,38 @@ physical_run(struct controller_ctx *ctx, enum > mf_field_id mff_ovn_geneve, > } > } > > + /* Remove tunnels that are no longer here. */ > + struct chassis_tunnel *tun, *tun_next; > + HMAP_FOR_EACH_SAFE (tun, tun_next, hmap_node, &tunnels) { > + if (!simap_find(&new_tunnel_to_ofport, tun->chassis_id)) { > + hmap_remove(&tunnels, &tun->hmap_node); > + physical_map_changed = true; > + free(tun); > + } > + } > + > /* Capture changed or removed openflow ports. */ > - bool localvif_map_changed = false; > struct simap_node *vif_name, *vif_name_next; > SIMAP_FOR_EACH_SAFE (vif_name, vif_name_next, &localvif_to_ofport) { > int newport; > if ((newport = simap_get(&new_localvif_to_ofport, vif_name->name))) { > if (newport != simap_get(&localvif_to_ofport, vif_name->name)) { > simap_put(&localvif_to_ofport, vif_name->name, newport); > - localvif_map_changed = true; > + physical_map_changed = true; > } > } else { > simap_find_and_delete(&localvif_to_ofport, vif_name->name); > - localvif_map_changed = true; > + physical_map_changed = true; > } > } > SIMAP_FOR_EACH (vif_name, &new_localvif_to_ofport) { > if (!simap_get(&localvif_to_ofport, vif_name->name)) { > simap_put(&localvif_to_ofport, vif_name->name, > simap_get(&new_localvif_to_ofport, vif_name->name)); > - localvif_map_changed = true; > + physical_map_changed = true; > } > } > - if (localvif_map_changed) { > + if (physical_map_changed) { > full_binding_processing = true; > > /* Reprocess logical flow table immediately. */ > @@ -769,7 +788,6 @@ physical_run(struct controller_ctx *ctx, enum mf_field_id > mff_ovn_geneve, > * ports. We set MFF_LOG_DATAPATH, MFF_LOG_INPORT, and > * MFF_LOG_OUTPORT from the tunnel key data, then resubmit to table > * 33 to handle packets to the local hypervisor. */ > - struct chassis_tunnel *tun; > HMAP_FOR_EACH (tun, hmap_node, &tunnels) { > struct match match = MATCH_CATCHALL_INITIALIZER; > match_set_in_port(&match, tun->ofport); > @@ -858,10 +876,7 @@ physical_run(struct controller_ctx *ctx, enum > mf_field_id mff_ovn_geneve, > ofctrl_add_flow(OFTABLE_DROP_LOOPBACK, 0, &match, &ofpacts, hc_uuid); > > ofpbuf_uninit(&ofpacts); > - HMAP_FOR_EACH_POP (tun, hmap_node, &tunnels) { > - free(tun); > - } > - hmap_clear(&tunnels); > > simap_destroy(&new_localvif_to_ofport); > + simap_destroy(&new_tunnel_to_ofport); > } _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev