[...]
> > > +    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,
> nit: Change updated to deleted

ack, right. I will fix in v5. Thx.

Regards,
Lorenzo

> > > +                         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_get(&nd->ls_datapaths.dps, od->index,
> > > +                   struct ovn_datapath *) = NULL;
> > > +        bitmap_set0(nd->ls_datapaths.dps_index_map.map, od->index);
> > > +        nd->ls_datapaths.dps_index_map.n_elems--;
> > > +
> > > +        const struct sbrec_ip_multicast *ip_mcast =
> > > +            ip_mcast_lookup(ni->sbrec_ip_mcast_by_dp, od->sdp->sb_dp);
> > > +        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;
> > > +    }
> > > +
> > >      if (!hmapx_is_empty(&trk_data->trk_lsps.created)
> > >          || !hmapx_is_empty(&trk_data->trk_lsps.updated)
> > >          || !hmapx_is_empty(&trk_data->trk_lsps.deleted)) {
> > > @@ -18949,8 +19082,8 @@ static void
> > >  ovn_datapaths_destroy(struct ovn_datapaths *datapaths)
> > >  {
> > >      struct ovn_datapath *dp;
> > > -    HMAP_FOR_EACH_SAFE (dp, key_node, &datapaths->datapaths) {
> > > -        ovn_datapath_destroy(&datapaths->datapaths, dp);
> > > +    HMAP_FOR_EACH_POP (dp, key_node, &datapaths->datapaths) {
> > > +        ovn_datapath_destroy(dp);
> > >      }
> > >      hmap_destroy(&datapaths->datapaths);
> > >  
> > > diff --git a/northd/northd.h b/northd/northd.h
> > > index b71b13ca9..aaa2b0dab 100644
> > > --- a/northd/northd.h
> > > +++ b/northd/northd.h
> > > @@ -22,6 +22,7 @@
> > >  #include "lib/sset.h"
> > >  #include "northd/en-port-group.h"
> > >  #include "northd/ipam.h"
> > > +#include "northd/lb.h"
> > >  #include "openvswitch/hmap.h"
> > >  #include "northd/lb.h"
> > >  #include "simap.h"
> > > @@ -101,7 +102,7 @@ struct ovn_datapaths {
> > >  static inline size_t
> > >  ods_size(const struct ovn_datapaths *datapaths)
> > >  {
> > > -    return hmap_count(&datapaths->datapaths);
> > > +    return vector_len(&datapaths->dps);
> > >  }
> > >  
> > >  struct ovn_datapath *
> > > @@ -116,6 +117,13 @@ enum redirected_routing_protcol_flag_type {
> > >      REDIRECT_BFD = (1 << 1),
> > >  };
> > >  
> > > +struct tracked_dps {
> > > +    /* Tracked created or updated datapaths. */
> > > +    struct hmapx crupdated;
> > > +    /* Tracked deleted datapaths. */
> > > +    struct hmapx deleted;
> > > +};
> > > +
> > >  struct tracked_ovn_ports {
> > >      /* tracked created ports.
> > >       * hmapx node data is 'struct ovn_port *' */
> > > @@ -147,6 +155,7 @@ enum northd_tracked_data_type {
> > >      NORTHD_TRACKED_LR_NATS  = (1 << 2),
> > >      NORTHD_TRACKED_LS_LBS   = (1 << 3),
> > >      NORTHD_TRACKED_LS_ACLS  = (1 << 4),
> > > +    NORTHD_TRACKED_SWITCHES = (1 << 5),
> > >  };
> > >  
> > >  /* Track what's changed in the northd engine node.
> > > @@ -155,6 +164,7 @@ enum northd_tracked_data_type {
> > >  struct northd_tracked_data {
> > >      /* Indicates the type of data tracked.  One or all of 
> > > NORTHD_TRACKED_*. */
> > >      enum northd_tracked_data_type type;
> > > +    struct tracked_dps trk_switches;
> > >      struct tracked_ovn_ports trk_lsps;
> > >      struct tracked_lbs trk_lbs;
> > >  
> > > @@ -998,6 +1008,13 @@ northd_has_ls_acls_in_tracked_data(struct 
> > > northd_tracked_data *trk_nd_changes)
> > >      return trk_nd_changes->type & NORTHD_TRACKED_LS_ACLS;
> > >  }
> > >  
> > > +static inline bool
> > > +northd_has_lswitches_in_tracked_data(
> > > +        struct northd_tracked_data *trk_nd_changes)
> > > +{
> > > +    return trk_nd_changes->type & NORTHD_TRACKED_SWITCHES;
> > > +}
> > > +
> > >  /* Returns 'true' if the IPv4 'addr' is on the same subnet with one of 
> > > the
> > >   * IPs configured on the router port.
> > >   */
> > > diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
> > > index 11bbb211d..9e0e80418 100644
> > > --- a/tests/ovn-northd.at
> > > +++ b/tests/ovn-northd.at
> > > @@ -14544,6 +14544,67 @@ AT_CHECK([grep "lr_in_dnat" lr1flows | 
> > > ovn_strip_lflows | grep "30.0.0.1"], [0],
> > >  AT_CLEANUP
> > >  ])
> > >  
> > > +OVN_FOR_EACH_NORTHD_NO_HV([
> > > +AT_SETUP([Logical switch incremental processing])
> > > +
> > > +ovn_start
> > > +
> > > +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats
> > > +check ovn-nbctl --wait=sb ls-add sw0
> > > +check_engine_stats northd norecompute compute
> > > +check_engine_stats ls_stateful recompute nocompute
> > > +check_engine_stats lflow recompute nocompute
> > > +
> > > +# For the below engine nodes, en_northd is input.  So check
> > > +# their engine status.
> > > +check_engine_stats lr_stateful norecompute compute
> > > +check_engine_stats route_policies norecompute compute
> > > +check_engine_stats routes norecompute compute
> > > +check_engine_stats bfd_sync norecompute compute
> > > +check_engine_stats sync_to_sb_lb norecompute compute
> > > +check_engine_stats sync_to_sb_pb norecompute compute
> > > +
> > > +CHECK_NO_CHANGE_AFTER_RECOMPUTE((1))
> > > +
> > > +# Update the logical switch.
> > > +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats
> > > +check ovn-nbctl --wait=sb set logical_switch sw0 other_config:foo=bar
> > > +
> > > +check_engine_stats northd recompute nocompute
> > > +check_engine_stats ls_stateful recompute nocompute
> > > +check_engine_stats lflow recompute nocompute
> > > +
> > > +# For the below engine nodes, en_northd is input.  So check
> > > +# their engine status.
> > > +check_engine_stats lr_stateful recompute nocompute
> > > +check_engine_stats route_policies recompute nocompute
> > > +check_engine_stats routes recompute nocompute
> > > +check_engine_stats bfd_sync recompute nocompute
> > > +check_engine_stats sync_to_sb_lb recompute nocompute
> > > +check_engine_stats sync_to_sb_pb recompute nocompute
> > > +
> > > +# Create a logical port
> > > +check ovn-nbctl --wait=sb lsp-add sw0 lsp0
> > > +
> > > +# Delete the logical switch
> > > +check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats
> > > +check ovn-nbctl --wait=sb ls-del sw0
> > > +check_engine_stats northd norecompute compute
> > > +check_engine_stats ls_stateful recompute nocompute
> > > +check_engine_stats lflow recompute nocompute
> > > +
> > > +# For the below engine nodes, en_northd is input.  So check
> > > +# their engine status.
> > > +check_engine_stats lr_stateful norecompute compute
> > > +check_engine_stats route_policies norecompute compute
> > > +check_engine_stats routes norecompute compute
> > > +check_engine_stats bfd_sync norecompute compute
> > > +check_engine_stats sync_to_sb_lb norecompute compute
> > > +check_engine_stats sync_to_sb_pb norecompute compute
> > > +
> > > +AT_CLEANUP
> > > +])
> > > +
> > >  AT_SETUP([RBAC -- Recover builtin role and permissions])
> > >  ovn_start
> > >  
> > > -- 
> > > 2.50.1
> > > 
> > > _______________________________________________
> > > dev mailing list
> > > d...@openvswitch.org
> > > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> > > 
> > One small nit, otherwise patch looks good to me.
> > 
> > Acked-by: Mairtin O'Loingsigh <moloi...@redhat.com>
> > 
> > _______________________________________________
> > dev mailing list
> > d...@openvswitch.org
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> > 
> Sorry, I did not include nit in previous mail 
> 
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to