On Tue, Nov 29, 2016 at 4:10 AM, Liran Schour <lir...@il.ibm.com> wrote:

> Ben Pfaff <b...@ovn.org> wrote on 29/11/2016 12:51:51 AM:
>
> > I hope that this version is ready to go in.  Liran, are you happy with
> > this version?
> >
>
> I did some short evaluation and got the following results:
> Simulate 50 hosts, each host serves 20 logical ports, each logical network
> is spread over 6 of the 50 hosts.


Thanks for testing Liran

Can a few questions be asked so the differences are understood.
There is expectation that not monitoring logical ports will make a
difference, but
this large is not expected.

1) This topology seems to only use logical switches in a flat topology for
each tenant;
    is that correct ?
2)  What is the distribution of logical switches per HV ?
3) What is the total number of logical switches we end up with ?



>
>
> Darrell patch:
> --------------
> Host 1 # flows 1504
> Host 2 # flows 1626
> Host 3 # flows 1443
> ...
> Logical flows = 8016
> Elapsed time 207,990ms
> total of 1002 (in 208ms per port)
> Ports created and bound in 5,648,773,788,428 cycles
> 1% south 69,936,025,644
> 1% north 77,863,484,163
> 97% clients 5,500,974,278,621
>
> Conditional monitor V16 patch:
> ------------------------------
> Host 1 # flows 1358
> Host 2 # flows 1482
> Host 3 # flows 1296
> ...
> Logical flows = 8016
> Elapsed time 207,998ms
> total of 1002 (in 208ms per port)
> Ports created and bound in 1,216,848,309,516 cycles




4) This is only the CPU time to initially create and bind logical ports to
each HV ?
     How exactly is this time measured ?

5) This total cycles is in the trillions
The previous tests from V10 and V15 below seem consistent and in the 2 digit
billions, which is at least 30 times less than now.
Is this same test as before using the 50 hosts configuration  ?

Evaluation on simulated environment of 50 hosts and 1000 logical ports shows

the following results (cycles #):

LN spread over # hosts|    master    | patch        | change

-------------------------------------------------------------

            1         | 24597200127  | 24339235374  |  1.0%

            6         | 23788521572  | 19145229352 <(914)%20522-9352>  |
19.5%

           12         | 23886405758  | 17913143176  | 25.0%

           18         | 25812686279  | 23675094540  |  8.2%

           24         | 28414671499  | 24770202308  | 12.8%

           30         | 31487218890  | 28397543436  |  9.8%

           36         | 36116993930  | 34105388739  |  5.5%

           42         | 37898342465  | 38647139083  | -1.9%

           48         | 41637996229  | 41846616306  | -0.5%

           50         | 41679995357  | 43455565977  | -4.2%


and from V15

Evaluation on simulated environment of 50 hosts and 1000 logical ports shows
the following results (cycles #):

LN spread over # hosts|    master    | patch        | change
-------------------------------------------------------------
            1         | 24597200127  | 24339235374  |  1.0%
            6         | 23788521572  | 19145229352 <(914)%20522-9352>  |
19.5%
           12         | 23886405758  | 17913143176  | 25.0%
           18         | 25812686279  | 23675094540  |  8.2%
           24         | 28414671499  | 24770202308  | 12.8%
           30         | 31487218890  | 28397543436  |  9.8%
           36         | 36116993930  | 34105388739  |  5.5%
           42         | 37898342465  | 38647139083  | -1.9%
           48         | 41637996229  | 41846616306  | -0.5%
           50         | 41679995357  | 43455565977  | -4.2%




>
> 2% south 30,653,838,360



>
> 3% north 42,543,336,355


6) Is this ovsdb NB database server CPU cycles ?; (it is hard to see why
the cycles
would differ here, although the numbers are small compared to the HV)




>
> 93% clients 1,143,651,134,801
>
> You can see that this patch significantly degrades the overhead of
> computation comparing to my origin patch (rebased version).
>
> An obvious difference is that Darrell's patch has conditions only on the
> Logical_Flow table and the origin patch did that on Port_Binding,
> Logical_Flow, Multicast_Group and MAC_Binding tables.




>
>
> I can resubmit my rebased patch again and Darell can base his changes on
> top of it or just investigate the problem.
>
> The code is here: https://github.com/liranschour/ovsBranch:
> monitor_cond_ovn_v16
>
> Thanks,
> - Liran
>
> > On Sun, Nov 27, 2016 at 01:08:59PM -0800, Darrell Ball wrote:
> > > This patch adds datapaths of interest support where only datapaths of
> > > local interest are monitored by the ovn-controller ovsdb client.  The
> > > idea is to do a flood fill in ovn-controller of datapath associations
> > > calculated by northd. A new column is added to the SB database
> > > datapath_binding table - related_datapaths to facilitate this so all
> > > datapaths associations are known quickly in ovn-controller.  This
> > > allows monitoring to adapt quickly with a single new monitor setting
> > > for all datapaths of interest locally.
> > >
> > > To reduce risk and minimize latency on network churn, only logical
> > > flows are conditionally monitored for now.  This should provide
> > > the bulk of the benefit.  This will be re-evaluated later to
> > > possibly add additional conditional monitoring such as for
> > > logical ports.
> > >
> > > Liran Schour contributed enhancements to the conditional
> > > monitoring granularity in ovs and also submitted patches
> > > for ovn usage of conditional monitoring which aided this patch
> > > though sharing of concepts through code review work.
> > >
> > > Ben Pfaff suggested that northd could be used to pre-populate
> > > related datapaths for ovn-controller to use.  That idea is
> > > used as part of this patch.
> > >
> > > CC: Ben Pfaff <b...@ovn.org>
> > > CC: Liran Schour <lir...@il.ibm.com>
> > > Signed-off-by: Darrell Ball <dlu...@gmail.com>
> > > ---
> > >
> > > v7->v8: Start wth logical flow conditional monitoring off.
> > >         Remove deprecated code.
> > >         Recover SB DB version number change.
> > >         Change test to be more definitive.
> > >
> > > v6->v7: Rebase
> > >
> > > v5->v6: Rebase; fix stale handling.
> > >
> > > v4->v5: Correct cleanup of monitors.
> > >         Fix warning.
> > >
> > > v3->v4: Refactor after incremental processing backout.
> > >         Limit filtering to logical flows to limit risk.
> > >
> > > v2->v3: Line length violation fixups :/
> > >
> > > v1->v2: Added logical port removal monitoring handling, factoring
> > >         in recent changes for incremental processing.  Added some
> > >         comments in the code regarding initial conditions for
> > >         database conditional monitoring.
> > >
> > >  ovn/controller/binding.c        | 10 +++--
> > >  ovn/controller/lflow.c          |  5 +++
> > >  ovn/controller/ovn-controller.c | 92 ++++++++++++++++++++++++++++
> > +++++++++++++
> > >  ovn/controller/ovn-controller.h |  3 ++
> > >  ovn/controller/patch.c          |  6 ++-
> > >  ovn/northd/ovn-northd.c         | 76 ++++++++++++++++++++++++++++++
> ++++
> > >  ovn/ovn-sb.ovsschema            | 11 +++--
> > >  ovn/ovn-sb.xml                  |  9 ++++
> > >  tests/ovn.at                    |  8 ++++
> > >  9 files changed, 211 insertions(+), 9 deletions(-)
> > >
> > > diff --git a/ovn/controller/binding.c b/ovn/controller/binding.c
> > > index d7b175e..2aff69a 100644
> > > --- a/ovn/controller/binding.c
> > > +++ b/ovn/controller/binding.c
> > > @@ -106,7 +106,8 @@ get_local_iface_ids(const struct ovsrec_bridge
> *br_int,
> > >
> > >  static void
> > >  add_local_datapath(struct hmap *local_datapaths,
> > > -        const struct sbrec_port_binding *binding_rec)
> > > +        const struct sbrec_port_binding *binding_rec,
> > > +        const struct controller_ctx *ctx)
> > >  {
> > >      if (get_local_datapath(local_datapaths,
> > >                             binding_rec->datapath->tunnel_key)) {
> > > @@ -118,6 +119,7 @@ add_local_datapath(struct hmap *local_datapaths,
> > >      memcpy(&ld->uuid, &binding_rec->header_.uuid, sizeof ld->uuid);
> > >      hmap_insert(local_datapaths, &ld->hmap_node,
> > >                  binding_rec->datapath->tunnel_key);
> > > +    do_datapath_flood_fill(ctx, binding_rec->datapath);
> > >  }
> > >
> > >  static void
> > > @@ -295,7 +297,7 @@ consider_local_datapath(struct controller_ctx *ctx,
> > >              /* Add child logical port to the set of all local ports.
> */
> > >              sset_add(all_lports, binding_rec->logical_port);
> > >          }
> > > -        add_local_datapath(local_datapaths, binding_rec);
> > > +        add_local_datapath(local_datapaths, binding_rec, ctx);
> > >          if (iface_rec && qos_map && ctx->ovs_idl_txn) {
> > >              get_qos_params(binding_rec, qos_map);
> > >          }
> > > @@ -330,7 +332,7 @@ consider_local_datapath(struct controller_ctx *ctx,
> > >          }
> > >
> > >          sset_add(all_lports, binding_rec->logical_port);
> > > -        add_local_datapath(local_datapaths, binding_rec);
> > > +        add_local_datapath(local_datapaths, binding_rec, ctx);
> > >          if (binding_rec->chassis == chassis_rec) {
> > >              return;
> > >          }
> > > @@ -344,7 +346,7 @@ consider_local_datapath(struct controller_ctx *ctx,
> > >          const char *chassis = smap_get(&binding_rec->options,
> > >                                         "l3gateway-chassis");
> > >          if (!strcmp(chassis, chassis_rec->name) &&
> ctx->ovnsb_idl_txn) {
> > > -            add_local_datapath(local_datapaths, binding_rec);
> > > +            add_local_datapath(local_datapaths, binding_rec, ctx);
> > >          }
> > >      } else if (chassis_rec && binding_rec->chassis == chassis_rec) {
> > >          if (ctx->ovnsb_idl_txn) {
> > > diff --git a/ovn/controller/lflow.c b/ovn/controller/lflow.c
> > > index 4e67365..765eae4 100644
> > > --- a/ovn/controller/lflow.c
> > > +++ b/ovn/controller/lflow.c
> > > @@ -167,6 +167,11 @@ consider_logical_flow(const struct lport_index
> *lports,
> > >      if (!ldp) {
> > >          return;
> > >      }
> > > +
> > > +    VLOG_DBG("consider logical flow: tunnel_key %lu "
> > > +             "\"match\" \"%s\", \"actions\" \"%s\"",
> > > +             ldp->tunnel_key, lflow->match, lflow->actions);
> > > +
> > >      if (is_switch(ldp)) {
> > >          /* For a logical switch datapath, local_datapaths tells us if
> there
> > >           * are any local ports for this datapath.  If not, we can skip
> > > diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-
> > controller.c
> > > index 52eb491..b3ae037 100644
> > > --- a/ovn/controller/ovn-controller.c
> > > +++ b/ovn/controller/ovn-controller.c
> > > @@ -69,6 +69,14 @@ OVS_NO_RETURN static void usage(void);
> > >
> > >  static char *ovs_remote;
> > >
> > > +struct dp_of_interest_node {
> > > +    struct hmap_node hmap_node;
> > > +    const struct sbrec_datapath_binding *sb_db;
> > > +    bool stale;
> > > +};
> > > +
> > > +static struct hmap dps_of_interest = HMAP_INITIALIZER(&dps_of_inter
> est);
> > > +
> > >  struct local_datapath *
> > >  get_local_datapath(const struct hmap *local_datapaths, uint32_t
> tunnel_key)
> > >  {
> > > @@ -128,6 +136,69 @@ get_bridge(struct ovsdb_idl *ovs_idl, const
> > char *br_name)
> > >      return NULL;
> > >  }
> > >
> > > +static bool
> > > +add_datapath_of_interest(const struct controller_ctx *ctx,
> > > +                         const struct sbrec_datapath_binding *dp)
> > > +{
> > > +    struct dp_of_interest_node *node;
> > > +    HMAP_FOR_EACH_WITH_HASH (node, hmap_node,
> uuid_hash(&dp->header_.uuid),
> > > +                             &dps_of_interest) {
> > > +        if (uuid_equals(&node->sb_db->header_.uuid,
> &dp->header_.uuid)) {
> > > +            node->stale = false;
> > > +            return false;
> > > +        }
> > > +    }
> > > +
> > > +    sbrec_logical_flow_add_clause_logical_datapath(ctx->ovnsb_idl,
> > > +                                                   OVSDB_F_EQ,
> > > +                                                   &dp->header_.uuid);
> > > +    node = xzalloc(sizeof *node);
> > > +    hmap_insert(&dps_of_interest, &node->hmap_node,
> > > +                uuid_hash(&dp->header_.uuid));
> > > +    node->sb_db = dp;
> > > +    return true;
> > > +}
> > > +
> > > +void
> > > +do_datapath_flood_fill(const struct controller_ctx *ctx,
> > > +                       const struct sbrec_datapath_binding *dp_start)
> > > +{
> > > +    struct interest_dps_list_elem {
> > > +        struct ovs_list list_node;
> > > +        const struct sbrec_datapath_binding * dp;
> > > +    };
> > > +
> > > +    struct ovs_list interest_datapaths;
> > > +    ovs_list_init(&interest_datapaths);
> > > +
> > > +    struct interest_dps_list_elem *dp_list_elem =
> > > +        xzalloc(sizeof *dp_list_elem);
> > > +    dp_list_elem->dp = dp_start;
> > > +    ovs_list_push_back(&interest_datapaths,
> &dp_list_elem->list_node);
> > > +
> > > +    while (!ovs_list_is_empty(&interest_datapaths)) {
> > > +
> > > +        struct ovs_list *list_node_ptr =
> > > +            ovs_list_pop_front(&interest_datapaths);
> > > +        dp_list_elem = CONTAINER_OF(list_node_ptr,
> > > +            struct interest_dps_list_elem, list_node);
> > > +
> > > +   size_t num_related_datapaths = dp_list_elem->dp->n_related_da
> tapaths;
> > > +   struct sbrec_datapath_binding **related_datapaths =
> > > +        dp_list_elem->dp->related_datapaths;
> > > +        if (!add_datapath_of_interest(ctx, dp_list_elem->dp)) {
> > > +            free(dp_list_elem);
> > > +            continue;
> > > +        }
> > > +        free(dp_list_elem);
> > > +        for (int i = 0; i < num_related_datapaths; i++) {
> > > +            dp_list_elem = xzalloc(sizeof *dp_list_elem);
> > > +            dp_list_elem->dp = related_datapaths[i];
> > > +            ovs_list_push_back(&interest_datapaths,
> > &dp_list_elem->list_node);
> > > +        }
> > > +    }
> > > +}
> > > +
> > >  static const struct ovsrec_bridge *
> > >  create_br_int(struct controller_ctx *ctx,
> > >                const struct ovsrec_open_vswitch *cfg,
> > > @@ -465,6 +536,10 @@ main(int argc, char *argv[])
> > >          ovsdb_idl_create(ovnsb_remote, &sbrec_idl_class, true,
> true));
> > >      ovsdb_idl_omit_alert(ovnsb_idl_loop.idl,
> &sbrec_chassis_col_nb_cfg);
> > >
> > > +    /* Start with suppressing all logical flows and then later
> > request those
> > > +     * that are specifically needed. */
> > > +    sbrec_logical_flow_add_clause_false(ovnsb_idl_loop.idl);
> > > +
> > >      /* Track the southbound idl. */
> > >      ovsdb_idl_track_add_all(ovnsb_idl_loop.idl);
> > >
> > > @@ -509,6 +584,12 @@ main(int argc, char *argv[])
> > >          struct hmap patched_datapaths = HMAP_INITIALIZER
> > (&patched_datapaths);
> > >          struct sset all_lports = SSET_INITIALIZER(&all_lports);
> > >
> > > +        struct dp_of_interest_node *dp_cur_node, *dp_next_node;
> > > +        HMAP_FOR_EACH_SAFE (dp_cur_node, dp_next_node, hmap_node,
> > > +                            &dps_of_interest) {
> > > +            dp_cur_node->stale = true;
> > > +        }
> > > +
> > >          const struct ovsrec_bridge *br_int = get_br_int(&ctx);
> > >          const char *chassis_id = get_chassis_id(ctx.ovs_idl);
> > >
> > > @@ -559,6 +640,17 @@ main(int argc, char *argv[])
> > >              }
> > >              mcgroup_index_destroy(&mcgroups);
> > >              lport_index_destroy(&lports);
> > > +
> > > +            HMAP_FOR_EACH_SAFE (dp_cur_node, dp_next_node, hmap_node,
> > > +                                &dps_of_interest) {
> > > +                if(dp_cur_node->stale == true) {
> > > +                    sbrec_logical_flow_remove_cla
> use_logical_datapath(
> > > +                        ctx.ovnsb_idl, OVSDB_F_EQ,
> > > +                        &dp_cur_node->sb_db->header_.uuid);
> > > +                    hmap_remove(&dps_of_interest,
> &dp_cur_node->hmap_node);
> > > +                    free(dp_cur_node);
> > > +                }
> > > +            }
> > >          }
> > >
> > >          sset_destroy(&all_lports);
> > > diff --git a/ovn/controller/ovn-controller.h b/ovn/controller/ovn-
> > controller.h
> > > index 4dcf4e5..a474c45 100644
> > > --- a/ovn/controller/ovn-controller.h
> > > +++ b/ovn/controller/ovn-controller.h
> > > @@ -81,6 +81,9 @@ const struct ovsrec_bridge *get_bridge(struct
> ovsdb_idl *,
> > >  const struct sbrec_chassis *get_chassis(struct ovsdb_idl *,
> > >                                          const char *chassis_id);
> > >
> > > +void do_datapath_flood_fill(const struct controller_ctx *,
> > > +                            const struct sbrec_datapath_binding *);
> > > +
> > >  /* Must be a bit-field ordered from most-preferred (higher number) to
> > >   * least-preferred (lower number). */
> > >  enum chassis_tunnel_type {
> > > diff --git a/ovn/controller/patch.c b/ovn/controller/patch.c
> > > index c9a5dd9..2af4436 100644
> > > --- a/ovn/controller/patch.c
> > > +++ b/ovn/controller/patch.c
> > > @@ -252,7 +252,8 @@ add_bridge_mappings(struct controller_ctx *ctx,
> > >
> > >  static void
> > >  add_patched_datapath(struct hmap *patched_datapaths,
> > > -                     const struct sbrec_port_binding
> > *binding_rec, bool local)
> > > +                     const struct sbrec_port_binding
> > *binding_rec, bool local,
> > > +                     struct controller_ctx *ctx)
> > >  {
> > >      struct patched_datapath *pd = get_patched_datapath(patched_d
> atapaths,
> > >                                         binding_rec->datapath->tunnel_
> key);
> > > @@ -269,6 +270,7 @@ add_patched_datapath(struct hmap
> *patched_datapaths,
> > >      /* stale is set to false. */
> > >      hmap_insert(patched_datapaths, &pd->hmap_node,
> > >                  binding_rec->datapath->tunnel_key);
> > > +    do_datapath_flood_fill(ctx, binding_rec->datapath);
> > >  }
> > >
> > >  static void
> > > @@ -362,7 +364,7 @@ add_logical_patch_ports(struct controller_ctx *ctx,
> > >                                existing_ports);
> > >              free(dst_name);
> > >              free(src_name);
> > > -            add_patched_datapath(patched_datapaths, binding,
> local_port);
> > > +            add_patched_datapath(patched_datapaths, binding,
> > local_port, ctx);
> > >              if (local_port) {
> > >                  if (binding->chassis != chassis_rec &&
> > ctx->ovnsb_idl_txn) {
> > >                      sbrec_port_binding_set_chassis(binding,
> chassis_rec);
> > > diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
> > > index 437da9f..b714799 100644
> > > --- a/ovn/northd/ovn-northd.c
> > > +++ b/ovn/northd/ovn-northd.c
> > > @@ -231,6 +231,42 @@ struct tnlid_node {
> > >      uint32_t tnlid;
> > >  };
> > >
> > > +struct related_datapath_node {
> > > +    struct hmap_node hmap_node;
> > > +    const struct sbrec_datapath_binding *sb_db;
> > > +};
> > > +
> > > +static void
> > > +add_related_datapath(struct hmap *related_datapaths,
> > > +                     const struct sbrec_datapath_binding *sb,
> > > +                     size_t *n_related_datapaths)
> > > +{
> > > +    struct related_datapath_node *node;
> > > +    HMAP_FOR_EACH_WITH_HASH (node, hmap_node,
> > > +                             uuid_hash(&sb->header_.uuid),
> > > +                             related_datapaths) {
> > > +        if (uuid_equals(&sb->header_.uuid,
> &node->sb_db->header_.uuid)) {
> > > +            return;
> > > +        }
> > > +    }
> > > +
> > > +    node = xzalloc(sizeof *node);
> > > +    hmap_insert(related_datapaths, &node->hmap_node,
> > > +                uuid_hash(&sb->header_.uuid));
> > > +    node->sb_db = sb;
> > > +    (*n_related_datapaths)++;
> > > +}
> > > +
> > > +static void
> > > +destroy_related_datapaths(struct hmap *related_datapaths)
> > > +{
> > > +    struct related_datapath_node *node;
> > > +    HMAP_FOR_EACH_POP (node, hmap_node, related_datapaths) {
> > > +        free(node);
> > > +    }
> > > +    hmap_destroy(related_datapaths);
> > > +}
> > > +
> > >  static void
> > >  destroy_tnlids(struct hmap *tnlids)
> > >  {
> > > @@ -376,6 +412,8 @@ struct ovn_datapath {
> > >      size_t n_router_ports;
> > >
> > >      struct hmap port_tnlids;
> > > +    struct hmap related_datapaths;
> > > +    size_t n_related_datapaths;
> > >      uint32_t port_key_hint;
> > >
> > >      bool has_unknown;
> > > @@ -426,6 +464,7 @@ ovn_datapath_create(struct hmap *datapaths,
> > const struct uuid *key,
> > >      od->nbr = nbr;
> > >      hmap_init(&od->port_tnlids);
> > >      hmap_init(&od->ipam);
> > > +    hmap_init(&od->related_datapaths);
> > >      od->port_key_hint = 0;
> > >      hmap_insert(datapaths, &od->key_node, uuid_hash(&od->key));
> > >      return od;
> > > @@ -441,6 +480,7 @@ ovn_datapath_destroy(struct hmap *datapaths,
> > struct ovn_datapath *od)
> > >          hmap_remove(datapaths, &od->key_node);
> > >          destroy_tnlids(&od->port_tnlids);
> > >          destroy_ipam(&od->ipam);
> > > +        destroy_related_datapaths(&od->related_datapaths);
> > >          free(od->router_ports);
> > >          free(od);
> > >      }
> > > @@ -624,6 +664,28 @@ build_datapaths(struct northd_context *ctx,
> > struct hmap *datapaths)
> > >              smap_destroy(&ids);
> > >
> > >              sbrec_datapath_binding_set_tunnel_key(od->sb,
> tunnel_key);
> > > +
> > > +            struct sbrec_datapath_binding **sb_related_datapaths
> > > +                = xmalloc(sizeof(*sb_related_datapaths) *
> > od->n_related_datapaths);
> > > +            int rdi = 0;
> > > +            struct related_datapath_node *related_datapath;
> > > +            HMAP_FOR_EACH (related_datapath, hmap_node,
> > > +                           &od->related_datapaths) {
> > > +                if (rdi >= od->n_related_datapaths) {
> > > +                    static struct vlog_rate_limit rl
> > > +                        = VLOG_RATE_LIMIT_INIT(5, 1);
> > > +                    VLOG_ERR_RL(&rl, "related datapaths accounting
> error"
> > > +                                UUID_FMT, UUID_ARGS(&od->key));
> > > +                    break;
> > > +                }
> > > +                sb_related_datapaths[rdi] = CONST_CAST(
> > > +                    struct sbrec_datapath_binding *,
> > related_datapath->sb_db);
> > > +                rdi++;
> > > +            }
> > > +            sbrec_datapath_binding_set_related_datapaths(od->sb,
> > > +                sb_related_datapaths, od->n_related_datapaths);
> > > +            free(sb_related_datapaths);
> > > +
> > >          }
> > >          destroy_tnlids(&dp_tnlids);
> > >      }
> > > @@ -1359,6 +1421,12 @@ ovn_port_update_sbrec(const struct ovn_port *op,
> > >              sbrec_port_binding_set_type(op->sb, "patch");
> > >          }
> > >
> > > +        if (op->peer && op->peer->od && op->peer->od->sb) {
> > > +            add_related_datapath(&op->od->related_datapaths,
> > > +                                 op->peer->od->sb,
> > > +                                 &op->od->n_related_datapaths);
> > > +        }
> > > +
> > >          const char *peer = op->peer ? op->peer->key : "<error>";
> > >          struct smap new;
> > >          smap_init(&new);
> > > @@ -1411,6 +1479,12 @@ ovn_port_update_sbrec(const struct ovn_port *op,
> > >                  sbrec_port_binding_set_type(op->sb, "patch");
> > >              }
> > >
> > > +            if (op->peer && op->peer->od && op->peer->od->sb) {
> > > +                add_related_datapath(&op->od->related_datapaths,
> > > +                                     op->peer->od->sb,
> > > +                                     &op->od->n_related_datapaths);
> > > +            }
> > > +
> > >              const char *router_port = smap_get_def(&op->nbsp->option
> s,
> > >                                                     "router-port",
> > "<error>");
> > >              struct smap new;
> > > @@ -4825,6 +4899,8 @@ main(int argc, char *argv[])
> > >      add_column_noalert(ovnsb_idl_loop.idl,
> > >                         &sbrec_datapath_binding_col_tunnel_key);
> > >      add_column_noalert(ovnsb_idl_loop.idl,
> > > +                       &sbrec_datapath_binding_col_re
> lated_datapaths);
> > > +    add_column_noalert(ovnsb_idl_loop.idl,
> > >                         &sbrec_datapath_binding_col_external_ids);
> > >
> > >      ovsdb_idl_add_table(ovnsb_idl_loop.idl,
> &sbrec_table_port_binding);
> > > diff --git a/ovn/ovn-sb.ovsschema b/ovn/ovn-sb.ovsschema
> > > index 89342fe..51c222d 100644
> > > --- a/ovn/ovn-sb.ovsschema
> > > +++ b/ovn/ovn-sb.ovsschema
> > > @@ -1,7 +1,7 @@
> > >  {
> > >      "name": "OVN_Southbound",
> > > -    "version": "1.9.0",
> > > -    "cksum": "239060528 9012",
> > > +    "version": "1.10.0",
> > > +    "cksum": "1139190282 9320",
> > >      "tables": {
> > >          "SB_Global": {
> > >              "columns": {
> > > @@ -93,7 +93,12 @@
> > >                                        "maxInteger": 16777215}}},
> > >                  "external_ids": {
> > >                      "type": {"key": "string", "value": "string",
> > > -                             "min": 0, "max": "unlimited"}}},
> > > +                             "min": 0, "max": "unlimited"}},
> > > +                "related_datapaths": {"type": {"key": {"type": "uuid",
> > > +                                      "refTable": "Datapath_Binding",
> > > +                                      "refType": "weak"},
> > > +                                      "min": 0,
> > > +                                      "max": "unlimited"}}},
> > >              "indexes": [["tunnel_key"]],
> > >              "isRoot": true},
> > >          "Port_Binding": {
> > > diff --git a/ovn/ovn-sb.xml b/ovn/ovn-sb.xml
> > > index 65191ed..c20861f 100644
> > > --- a/ovn/ovn-sb.xml
> > > +++ b/ovn/ovn-sb.xml
> > > @@ -1556,6 +1556,15 @@ tcp.flags = RST;
> > >        constructed for each supported encapsulation.
> > >      </column>
> > >
> > > +    <column name="related_datapaths">
> > > +      The related_datapaths column is used to keep track of
> whichdatapaths
> > > +      are connected to each other.  This is leveraged in
> ovn-controller to
> > > +      do a flood fill from each local logical switch to determine the
> full
> > > +      set of datapaths needed on a given ovn-controller.   This set of
> > > +      datapaths can be used to determine which logical ports and
> logical
> > > +      flows an ovn-controller should monitor.
> > > +    </column>
> > > +
> > >      <group title="OVN_Northbound Relationship">
> > >        <p>
> > >          Each row in <ref table="Datapath_Binding"/> is associatedwith
> some
>
> > > diff --git a/tests/ovn.at b/tests/ovn.at
> > > index 69f5277..04bc3da 100644
> > > --- a/tests/ovn.at
> > > +++ b/tests/ovn.at
> > > @@ -4079,6 +4079,7 @@ ovs-vsctl -- add-port br-int hv1-vif1 -- \
> > >      options:tx_pcap=hv1/vif1-tx.pcap \
> > >      options:rxq_pcap=hv1/vif1-rx.pcap \
> > >      ofport-request=1
> > > +ovs-appctl -t ovn-controller vlog/set ANY:
> file:DBG
>
> > >
> > >
> > >  sim_add hv2
> > > @@ -4090,6 +4091,7 @@ ovs-vsctl -- add-port br-int hv2-vif1 -- \
> > >      options:tx_pcap=hv2/vif1-tx.pcap \
> > >      options:rxq_pcap=hv2/vif1-rx.pcap \
> > >      ofport-request=1
> > > +ovs-appctl -t ovn-controller vlog/set ANY:file:DBG
> > >
> > >  # Pre-populate the hypervisors' ARP tables so that we don't lose any
> > >  # packets for ARP resolution (native tunneling doesn't queue packets
> > > @@ -4195,6 +4197,12 @@ as hv2 ovs-ofctl show br-int
> > >  as hv2 ovs-ofctl dump-flows br-int
> > >  echo "----------------------------"
> > >
> > > +# tunnel key 2 represents the gateway router and the associated
> > > +# logical flows should only be on hv2 not hv1 when conditional
> > > +# monitoring of flows is being used.
> > > +AT_CHECK([cat hv2/ovn-controller.log | grep 'tunnel_key 2'], [0],
> > [ignore-nolog])
> > > +AT_CHECK([cat hv1/ovn-controller.log | grep 'tunnel_key 2'], [1],
> > [ignore-nolog])
> > > +
> > >  echo $expected > expected
> > >  OVN_CHECK_PACKETS([hv2/vif1-tx.pcap], [expected])
> > >
> > > --
> > > 1.9.1
> > >
> >
>
>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to