On Mon, Aug 30, 2021 at 12:01 PM Vladislav Odintsov <[email protected]>
wrote:
>
> Small optimization in routes advertizement code.
> Instead of iterating over all routes and checking for
> needed transit_switch and availability_zone, use
> ovsdb_index built with appropriate fields.
>
> Signed-off-by: Vladislav Odintsov <[email protected]>
> ---
>  ic/ovn-ic.c | 22 ++++++++++++++--------
>  1 file changed, 14 insertions(+), 8 deletions(-)
>
> diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c
> index fc608af82..f5e31bd80 100644
> --- a/ic/ovn-ic.c
> +++ b/ic/ovn-ic.c
> @@ -68,6 +68,7 @@ struct ic_context {
>      struct ovsdb_idl_index *sbrec_port_binding_by_name;
>      struct ovsdb_idl_index *icsbrec_port_binding_by_ts;
>      struct ovsdb_idl_index *icsbrec_route_by_ts;
> +    struct ovsdb_idl_index *icsbrec_route_by_ts_az;
>  };
>
>  struct ic_state {
> @@ -1292,15 +1293,13 @@ advertise_route(struct ic_context *ctx,
>  {
>      ovs_assert(ctx->ovnisb_txn);
>      const struct icsbrec_route *isb_route;
> -    ICSBREC_ROUTE_FOR_EACH (isb_route, ctx->ovnisb_idl) {
> -        if (strcmp(isb_route->transit_switch, ts_name)) {
> -            continue;
> -        }
> -
> -        if (isb_route->availability_zone != az) {
> -            continue;
> -        }
> +    const struct icsbrec_route *isb_route_key =
> +        icsbrec_route_index_init_row(ctx->icsbrec_route_by_ts_az);
> +    icsbrec_route_index_set_transit_switch(isb_route_key, ts_name);
> +    icsbrec_route_index_set_availability_zone(isb_route_key, az);
>
> +    ICSBREC_ROUTE_FOR_EACH_EQUAL (isb_route, isb_route_key,
> +                                  ctx->icsbrec_route_by_ts_az) {
>          struct in6_addr prefix, nexthop;
>          unsigned int plen;
>
> @@ -1329,6 +1328,7 @@ advertise_route(struct ic_context *ctx,
>              free(route_adv);
>          }
>      }
> +    icsbrec_route_index_destroy_row(isb_route_key);
>
>      /* Create the missing routes in IC-SB */
>      struct ic_route_info *route_adv, *next;
> @@ -1732,6 +1732,11 @@ main(int argc, char *argv[])
>          = ovsdb_idl_index_create1(ovnisb_idl_loop.idl,
>                                    &icsbrec_route_col_transit_switch);
>
> +    struct ovsdb_idl_index *icsbrec_route_by_ts_az
> +        = ovsdb_idl_index_create2(ovnisb_idl_loop.idl,
> +                                  &icsbrec_route_col_transit_switch,
> +                                  &icsbrec_route_col_availability_zone);
> +
>      /* Main loop. */
>      exiting = false;
>      state.had_lock = false;
> @@ -1773,6 +1778,7 @@ main(int argc, char *argv[])
>                  .sbrec_chassis_by_name = sbrec_chassis_by_name,
>                  .icsbrec_port_binding_by_ts = icsbrec_port_binding_by_ts,
>                  .icsbrec_route_by_ts = icsbrec_route_by_ts,
> +                .icsbrec_route_by_ts_az = icsbrec_route_by_ts_az,
>              };
>
>              if (!state.had_lock &&
ovsdb_idl_has_lock(ovnsb_idl_loop.idl)) {
> --
> 2.30.0
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Thanks for the improvement! I applied the patch.

Han
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to