"dev" <dev-boun...@openvswitch.org> wrote on 26/07/2016 12:02:37 AM:

> From: Flavio Fernandes <fla...@flaviof.com>
> To: Ryan Moats <rmo...@us.ibm.com>
> Cc: dev@openvswitch.org
> Date: 26/07/2016 12:06 AM
> Subject: Re: [ovs-dev] [ovs-dev,ovn-controller] Physical: persist 
tunnels
> Sent by: "dev" <dev-boun...@openvswitch.org>
> 
> 
> > 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>
> 

Tested this fix with a cluster of 50 hosts.

Acked-by: Liran Schour <lir...@il.ibm.com>
Tested-by: Liran Schour <lir...@il.ibm.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


_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to