"dev" <dev-boun...@openvswitch.org> wrote on 08/06/2016 08:38:27 AM:

> From: Ryan Moats/Omaha/IBM@IBMUS
> To: Hui Kang <hkang.sun...@gmail.com>
> Cc: dev@openvswitch.org
> Date: 08/06/2016 08:38 AM
> Subject: Re: [ovs-dev] [PATCH, v5] Scanning only changed entries in the
ovnsb
> Sent by: "dev" <dev-boun...@openvswitch.org>
>
>
>
>
> "dev" <dev-boun...@openvswitch.org> wrote on 07/27/2016 08:11:11 PM:
>
> > From: Hui Kang <hkang.sun...@gmail.com>
> > To: dev@openvswitch.org
> > Date: 07/27/2016 08:11 PM
> > Subject: [ovs-dev] [PATCH, v5] Scanning only changed entries in the
ovnsb
> > Sent by: "dev" <dev-boun...@openvswitch.org>
> >
> > - Improve performance by scanning only changed port binding entries
> > when determining whether to mark the logical switch port up or
> > down
> >
> > ---
> > v4->v5:
> > - rebase
> >
> > v3->v4:
> > - Add an initialization function to scan all entries in Port_binding
> table
> >   when ovn-northd restarts or fails over
> >
> > Signed-off-by: Hui Kang <ka...@us.ibm.com>
> > ---
>
>
> While git am doesn't apply this patch cleanly, patch -p1 appears to
> and all the functional tests pass.
>
> There are a couple of places I would change things, shown in line
> below...
>
> >  ovn/northd/ovn-northd.c | 100 +++++++++++++++++++++++++++++++
> > +----------------
> >  1 file changed, 68 insertions(+), 32 deletions(-)
> >
> > diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
> > index 716f123..32c14a2 100644
> > --- a/ovn/northd/ovn-northd.c
> > +++ b/ovn/northd/ovn-northd.c
> > @@ -53,6 +53,11 @@ struct northd_context {
> >      struct ovsdb_idl_txn *ovnsb_txn;
> >  };
> >
> > +struct lport_hash_node {
> > +    struct hmap_node node;
> > +    const struct nbrec_logical_switch_port *nbsp;
> > +};
> > +
> >  static const char *ovnnb_db;
> >  static const char *ovnsb_db;
> >
> > @@ -3206,20 +3211,51 @@ ovnnb_db_run(struct northd_context *ctx,
> > struct ovsdb_idl_loop *sb_loop)
> >      }
> >  }
> >
> > +static void
> > +sb_chassis_update_nbsec(const struct sbrec_port_binding *sb,
> > +                        struct hmap *lports_hmap)
> > +
>
> Style: the blank line can be removed
>
> > +{
> > +    struct lport_hash_node *hash_node;
> > +    const struct nbrec_logical_switch_port *nbsp;
> > +
> > +    nbsp = NULL;
> > +    HMAP_FOR_EACH_WITH_HASH(hash_node, node,
> > +                            hash_string(sb->logical_port, 0),
> > +                            lports_hmap) {
> > +        if (!strcmp(sb->logical_port, hash_node->nbsp->name)) {
> > +            nbsp = hash_node->nbsp;
> > +            break;
> > +        }
> > +    }
> > +
> > +    if (!nbsp) {
> > +        /* The logical port doesn't exist for this port binding.  This
> can
> > +         * happen under normal circumstances when ovn-northd hasn't
> gotten
> > +         * around to pruning the Port_Binding yet. */
> > +        return;
> > +    }
> > +
> > +    if (sb->chassis && (!nbsp->up || !*nbsp->up)) {
> > +        bool up = true;
> > +        nbrec_logical_switch_port_set_up(nbsp, &up, 1);
> > +    } else if (!sb->chassis && (!nbsp->up || *nbsp->up)) {
> > +        bool up = false;
> > +        nbrec_logical_switch_port_set_up(nbsp, &up, 1);
> > +    }
> > +}
> > +
> >  /* Handle changes to the 'chassis' column of the 'Port_Binding' table.
> When
> >   * this column is not empty, it means we need to set the
> > corresponding logical
> >   * port as 'up' in the northbound DB. */
> >  static void
> > -update_logical_port_status(struct northd_context *ctx)
> > +update_logical_port_status(struct northd_context *ctx, bool is_init)
> >  {
> >      struct hmap lports_hmap;
> >      const struct sbrec_port_binding *sb;
> >      const struct nbrec_logical_switch_port *nbsp;
> >
> > -    struct lport_hash_node {
> > -        struct hmap_node node;
> > -        const struct nbrec_logical_switch_port *nbsp;
> > -    } *hash_node;
> > +    struct lport_hash_node *hash_node;
> >
> >      hmap_init(&lports_hmap);
> >
> > @@ -3229,30 +3265,13 @@ update_logical_port_status(struct
northd_context
> *ctx)
> >          hmap_insert(&lports_hmap, &hash_node->node,
> > hash_string(nbsp->name, 0));
> >      }
> >
> > -    SBREC_PORT_BINDING_FOR_EACH(sb, ctx->ovnsb_idl) {
> > -        nbsp = NULL;
> > -        HMAP_FOR_EACH_WITH_HASH(hash_node, node,
> > -                                hash_string(sb->logical_port, 0),
> > -                                &lports_hmap) {
> > -            if (!strcmp(sb->logical_port, hash_node->nbsp->name)) {
> > -                nbsp = hash_node->nbsp;
> > -                break;
> > -            }
> > -        }
> > -
> > -        if (!nbsp) {
> > -            /* The logical port doesn't exist for this port
> > binding.  This can
> > -             * happen under normal circumstances when ovn-northd
> > hasn't gotten
> > -             * around to pruning the Port_Binding yet. */
> > -            continue;
> > +    if (is_init) {
> > +        SBREC_PORT_BINDING_FOR_EACH(sb, ctx->ovnsb_idl) {
> > +            sb_chassis_update_nbsec(sb, &lports_hmap);
> >          }
> > -
> > -        if (sb->chassis && (!nbsp->up || !*nbsp->up)) {
> > -            bool up = true;
> > -            nbrec_logical_switch_port_set_up(nbsp, &up, 1);
> > -        } else if (!sb->chassis && (!nbsp->up || *nbsp->up)) {
> > -            bool up = false;
> > -            nbrec_logical_switch_port_set_up(nbsp, &up, 1);
> > +    } else {
> > +        SBREC_PORT_BINDING_FOR_EACH_TRACKED(sb, ctx->ovnsb_idl) {
> > +            sb_chassis_update_nbsec(sb, &lports_hmap);
> >          }
> >      }
> >
> > @@ -3354,13 +3373,14 @@ update_northbound_cfg(struct northd_context
*ctx,
> >
> >  /* Handle a fairly small set of changes in the southbound database. */
> >  static void
> > -ovnsb_db_run(struct northd_context *ctx, struct ovsdb_idl_loop
*sb_loop)
> > +ovnsb_db_run(struct northd_context *ctx, struct ovsdb_idl_loop
*sb_loop,
> > +             bool is_init)
> >  {
> >      if (!ctx->ovnnb_txn || !ovsdb_idl_has_ever_connected(ctx->
> ovnsb_idl)) {
> >          return;
> >      }
> >
> > -    update_logical_port_status(ctx);
> > +    update_logical_port_status(ctx, is_init);
> >      update_northbound_cfg(ctx, sb_loop);
> >  }
> >
> > @@ -3463,6 +3483,19 @@ add_column_noalert(struct ovsdb_idl *idl,
> >      ovsdb_idl_omit_alert(idl, column);
> >  }
> >
> > +static void
> > +ovnsb_db_run_init(struct ovsdb_idl_loop *ovnsb_idl_loop)
> > +{
> > +    struct northd_context ctx = {
> > +        .ovnnb_idl = NULL,
> > +        .ovnnb_txn = NULL,
> > +        .ovnsb_idl = ovnsb_idl_loop->idl,
> > +        .ovnsb_txn = ovsdb_idl_loop_run(ovnsb_idl_loop),
> > +    };
> > +
> > +    ovnsb_db_run(&ctx, ovnsb_idl_loop, true);
> > +}
> > +
> >  int
> >  main(int argc, char *argv[])
> >  {
> > @@ -3537,7 +3570,6 @@ main(int argc, char *argv[])
> >      add_column_noalert(ovnsb_idl_loop.idl,
> &sbrec_port_binding_col_type);
> >      add_column_noalert(ovnsb_idl_loop.idl,
> &sbrec_port_binding_col_options);
> >      add_column_noalert(ovnsb_idl_loop.idl,
&sbrec_port_binding_col_mac);
> > -    ovsdb_idl_add_column(ovnsb_idl_loop.idl,
> > &sbrec_port_binding_col_chassis);
> >      ovsdb_idl_add_table(ovnsb_idl_loop.idl,
&sbrec_table_dhcp_options);
> >      add_column_noalert(ovnsb_idl_loop.idl,
> &sbrec_dhcp_options_col_code);
> >      add_column_noalert(ovnsb_idl_loop.idl,
> &sbrec_dhcp_options_col_type);
> > @@ -3550,6 +3582,9 @@ main(int argc, char *argv[])
> >      ovsdb_idl_add_table(ovnsb_idl_loop.idl, &sbrec_table_chassis);
> >      ovsdb_idl_add_column(ovnsb_idl_loop.idl,
&sbrec_chassis_col_nb_cfg);
> >
> > +    ovnsb_db_run_init(&ovnsb_idl_loop);
> > +    ovsdb_idl_track_add_column(ovnsb_idl_loop.idl,
> > &sbrec_port_binding_col_chassis);
>
> The above order looks a little odd to me, I would have expected them
> to be reversed...
>
> > +
> >      /* Main loop. */
> >      exiting = false;
> >      while (!exiting) {
> > @@ -3561,7 +3596,7 @@ main(int argc, char *argv[])
> >          };
> >
> >          ovnnb_db_run(&ctx, &ovnsb_idl_loop);
> > -        ovnsb_db_run(&ctx, &ovnsb_idl_loop);
> > +        ovnsb_db_run(&ctx, &ovnsb_idl_loop, false);
> >          if (ctx.ovnsb_txn) {
> >              check_and_add_supported_dhcp_opts_to_sb_db(&ctx);
> >          }
> > @@ -3573,6 +3608,7 @@ main(int argc, char *argv[])
> >          }
> >          ovsdb_idl_loop_commit_and_wait(&ovnnb_idl_loop);
> >          ovsdb_idl_loop_commit_and_wait(&ovnsb_idl_loop);
> > +        ovsdb_idl_track_clear(ctx.ovnsb_idl);
> >
> >          poll_block();
> >          if (should_service_stop()) {
> > --
>
> Before I give it an ack, I'm curious - what kind of improvement
> does this patch add?

Thanks for your comments; I will modify it later. The purpose of
this patch is to avoid unnecessary CPU cycles spent on scanning
all entries in sb_port_binding (SBREC_PORT_BINDING_FOR_EACH).

Therefore I change this to SBREC_PORT_BINDING_FOR_EACH_TRACKED.

- Hui

> _______________________________________________
> 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