diff mbox series

[ovs-dev] ic: use ovsdb_index to iterate over routes

Message ID 20210830190138.97835-1-odivlad@gmail.com
State Accepted
Delegated to: Han Zhou
Headers show
Series [ovs-dev] ic: use ovsdb_index to iterate over routes | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test fail github build: failed
ovsrobot/github-robot-_ovn-kubernetes fail github build: failed

Commit Message

Vladislav Odintsov Aug. 30, 2021, 7:01 p.m. UTC
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 <odivlad@gmail.com>
---
 ic/ovn-ic.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

Comments

Han Zhou Aug. 31, 2021, 6:53 a.m. UTC | #1
On Mon, Aug 30, 2021 at 12:01 PM Vladislav Odintsov <odivlad@gmail.com>
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 <odivlad@gmail.com>
> ---
>  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
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Thanks for the improvement! I applied the patch.

Han
diff mbox series

Patch

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)) {