> On 8/15/25 3:42 PM, Dumitru Ceara wrote:
> > On 8/15/25 11:17 AM, Dumitru Ceara wrote:
> >> On 7/31/25 10:52 PM, Lorenzo Bianconi wrote:
> >>> This patch handles the logical switch creation incrementally
> >>> in the northd engine node.  The dependent engine nodes - ls_stateful,
> >>> lflow and few others still fall back to full recompute, which
> >>> will be handled in separate patches.
> >>>
> >>> Reported-at: https://issues.redhat.com/browse/FDP-754
> >>> Co-authored-by: Numan Siddique <num...@ovn.org>
> >>> Signed-off-by: Numan Siddique <num...@ovn.org>
> >>> Signed-off-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com>
> >>> ---
> >>
> >> Hi Lorenzo,
> >>
> >> Not a full review, just one thing I found while debugging the rebase of
> >> this series on the current main (and with Jacob's series to do LR
> >> creation I-P).
> >>
> >>>  northd/en-lflow.c        |   4 +
> >>>  northd/en-ls-stateful.c  |   4 +
> >>>  northd/en-multicast.c    |   4 +
> >>>  northd/inc-proc-northd.c |   5 +-
> >>>  northd/lb.c              |   2 +-
> >>>  northd/lb.h              |   1 +
> >>>  northd/lflow-mgr.c       |   8 +-
> >>>  northd/northd.c          | 185 +++++++++++++++++++++++++++++++++------
> >>>  northd/northd.h          |  22 ++++-
> >>>  tests/ovn-northd.at      |  61 +++++++++++++
> >>>  10 files changed, 261 insertions(+), 35 deletions(-)
> >>>
> >>
> >> [...]
> >>
> >>> @@ -4910,6 +4985,54 @@ northd_handle_ls_changes(struct ovsdb_idl_txn 
> >>> *ovnsb_idl_txn,
> >>>          }
> >>>      }
> >>>  
> >>> +    HMAPX_FOR_EACH (node, &ni->synced_lses->deleted) {
> >>> +        const struct ovn_synced_logical_switch *synced = node->data;
> >>> +        const struct nbrec_logical_switch *deleted_ls = synced->nb;
> >>> +
> >>> +        struct ovn_datapath *od = ovn_datapath_find_(
> >>> +                                    &nd->ls_datapaths.datapaths,
> >>> +                                    &deleted_ls->header_.uuid);
> >>> +        if (!od) {
> >>> +            static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 
> >>> 1);
> >>> +            VLOG_WARN_RL(&rl, "Internal error: a tracked updated LS 
> >>> doesn't "
> >>> +                         "exist in ls_datapaths: "UUID_FMT,
> >>> +                         UUID_ARGS(&deleted_ls->header_.uuid));
> >>> +            goto fail;
> >>> +        }
> >>> +
> >>> +        if (deleted_ls->copp || deleted_ls->n_dns_records ||
> >>> +            deleted_ls->n_forwarding_groups || deleted_ls->n_qos_rules ||
> >>> +            deleted_ls->n_load_balancer || 
> >>> deleted_ls->n_load_balancer_group) {
> >>> +            goto fail;
> >>> +        }
> >>> +
> >>> +        if (!ls_handle_lsp_changes(ovnsb_idl_txn, deleted_ls,
> >>> +                                   ni, nd, od, &trk_data->trk_lsps)) {
> >>> +            goto fail;
> >>> +        }
> >>> +
> >>> +        hmap_remove(&nd->ls_datapaths.datapaths, &od->key_node);
> >>> +        vector_remove(&nd->ls_datapaths.dps, od->index, NULL);
> >>> +        bitmap_set0(nd->ls_datapaths.dps_index_map.map, od->index);
> >>> +        nd->ls_datapaths.dps_index_map.n_elems--;
> >>> +
> >>
> >> At this point, all remaining datapaths (after od->index) have wrong
> >> indices.  That's because vector removal of an element shifts the
> >> remainder of the vector to the left.
> >>
> >>> +        const struct sbrec_ip_multicast *ip_mcast =
> >>> +            ip_mcast_lookup(ni->sbrec_ip_mcast_by_dp, od->sb);
> >>> +        if (ip_mcast) {
> >>> +            sbrec_ip_multicast_delete(ip_mcast);
> >>> +        }
> >>> +
> >>> +        if (is_ls_acls_changed(deleted_ls)) {
> >>> +            hmapx_add(&trk_data->ls_with_changed_acls, od);
> >>> +        }
> >>> +        hmapx_add(&trk_data->trk_switches.deleted, od);
> >>> +    }
> >>> +
> >>> +    if (!hmapx_is_empty(&trk_data->trk_switches.crupdated) ||
> >>> +        !hmapx_is_empty(&trk_data->trk_switches.deleted)) {
> >>> +        trk_data->type |= NORTHD_TRACKED_SWITCHES;
> >>> +    }
> >>> +
> >>
> >> One potential way of fixing this is to reinitialize _all_ od->index
> >> values here, after we performed all removals.
> >>
> > 
> > Thinking more about it, that won't be enough either.  All dependent
> > nodes (ls_stateful, lr_stateful, lb_data) they all rely on the
> > ovn_datapath index not changing.
> > 
> > I think a simpler and safer solution is to not call vector_remove()
> > above but instead just "clear" the entry in the vector (generating a hole).
> > 
> > All dependent nodes can still rely on indices of other (not removed)
> > datapaths because those don't change.
> > 
> > One thing to take into account is: this might generate very sparse
> > vectors at some point so we should have a heuristic that triggers a
> > recompute once we reach, e.g., 50% empty vectors.
> > 
> > I'm not sure I can get this done, but I'll try to implement this on top
> > of your series in the hope that we can still merge it in 25.09, before
> > branching today.
> > 
> 
> I take it back, I won't be able to provide a well tested implementation
> today.  I think we should defer this to 25.09.

Hi Dumitru,

Thx for the review.
No worries. I will fix it in v5.

Regards,
Lorenzo

> 
> Regards,
> Dumitru
> 
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to