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