On 8/16/22 08:33, Ales Musil wrote:
> It can happen that northd and SB DB are updated before ovn-controller
> in that case the new MAC binding would be added with timestamp=0.
> In combination with enabled MAC binding aging, the affected rows
> would be deleted over and over until the controller is upgraded.
> 
> To prevent the before mentioned issue add indication if
> the controller supports MAC binding timestamps.
> 
> Signed-off-by: Ales Musil <[email protected]>
> ---
>  controller/chassis.c       |  7 +++++++
>  include/ovn/features.h     |  1 +
>  northd/mac-binding-aging.c |  5 +++--
>  northd/northd.c            | 21 +++++++++++++++------
>  northd/northd.h            |  1 +
>  5 files changed, 27 insertions(+), 8 deletions(-)
> 
> diff --git a/controller/chassis.c b/controller/chassis.c
> index 3d75f10ad..685d9b2ae 100644
> --- a/controller/chassis.c
> +++ b/controller/chassis.c
> @@ -351,6 +351,7 @@ chassis_build_other_config(const struct ovs_chassis_cfg 
> *ovs_cfg,
>                   ovs_cfg->is_interconn ? "true" : "false");
>      smap_replace(config, OVN_FEATURE_PORT_UP_NOTIF, "true");
>      smap_replace(config, OVN_FEATURE_CT_NO_MASKED_LABEL, "true");
> +    smap_replace(config, OVN_FEATURE_MAC_BINDING_TIMESTAMP, "true");
>  }
>  
>  /*
> @@ -462,6 +463,12 @@ chassis_other_config_changed(const struct 
> ovs_chassis_cfg *ovs_cfg,
>          return true;
>      }
>  
> +    if (!smap_get_bool(&chassis_rec->other_config,
> +                       OVN_FEATURE_MAC_BINDING_TIMESTAMP,
> +                       false)) {
> +        return true;
> +    }
> +
>      return false;
>  }
>  
> diff --git a/include/ovn/features.h b/include/ovn/features.h
> index 8fbdbf19a..679f67457 100644
> --- a/include/ovn/features.h
> +++ b/include/ovn/features.h
> @@ -23,6 +23,7 @@
>  /* ovn-controller supported feature names. */
>  #define OVN_FEATURE_PORT_UP_NOTIF      "port-up-notif"
>  #define OVN_FEATURE_CT_NO_MASKED_LABEL "ct-no-masked-label"
> +#define OVN_FEATURE_MAC_BINDING_TIMESTAMP "mac-binding-timestamp"
>  
>  /* OVS datapath supported features.  Based on availability OVN might generate
>   * different types of openflows.
> diff --git a/northd/mac-binding-aging.c b/northd/mac-binding-aging.c
> index 36d0a6fd7..4a2dfbbf8 100644
> --- a/northd/mac-binding-aging.c
> +++ b/northd/mac-binding-aging.c
> @@ -90,8 +90,10 @@ void
>  en_mac_binding_aging_run(struct engine_node *node, void *data OVS_UNUSED)
>  {
>      const struct engine_context *eng_ctx = engine_get_context();
> +    struct northd_data *northd_data = engine_get_input_data("northd", node);
>  
> -    if (!eng_ctx->ovnsb_idl_txn) {
> +    if (!eng_ctx->ovnsb_idl_txn ||
> +        !northd_data->features.mac_binding_timestamp) {
>          return;
>      }
>  
> @@ -99,7 +101,6 @@ en_mac_binding_aging_run(struct engine_node *node, void 
> *data OVS_UNUSED)
>      int64_t now = time_wall_msec();
>      uint32_t removal_limit = get_removal_limit(node);
>      uint32_t removed_n = 0;
> -    struct northd_data *northd_data = engine_get_input_data("northd", node);
>      struct mac_binding_waker *waker =
>          engine_get_input_data("mac_binding_aging_waker", node);
>      struct ovsdb_idl_index *sbrec_mac_binding_by_datapath =
> diff --git a/northd/northd.c b/northd/northd.c
> index 76d79c5ce..684313a18 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -407,14 +407,23 @@ build_chassis_features(const struct northd_input 
> *input_data,
>      const struct sbrec_chassis *chassis;
>  
>      SBREC_CHASSIS_TABLE_FOR_EACH (chassis, input_data->sbrec_chassis) {
> -        if (!smap_get_bool(&chassis->other_config,
> -                           OVN_FEATURE_CT_NO_MASKED_LABEL,
> -                           false)) {
> +        bool ct_no_masked_label =
> +            smap_get_bool(&chassis->other_config,
> +                          OVN_FEATURE_CT_NO_MASKED_LABEL,
> +                          false);
> +        if (!ct_no_masked_label && chassis_features->ct_no_masked_label) {
>              chassis_features->ct_no_masked_label = false;
> -            return;
> +        }
> +
> +        bool mac_binding_timestamp =
> +            smap_get_bool(&chassis->other_config,
> +                          OVN_FEATURE_MAC_BINDING_TIMESTAMP,
> +                          false);
> +        if (!mac_binding_timestamp &&
> +            chassis_features->mac_binding_timestamp) {
> +            chassis_features->mac_binding_timestamp = false;
>          }
>      }
> -    chassis_features->ct_no_masked_label = true;

To make it explicit, please move the initialization part to the
beginning of the function or to northd_init().  We can use designated
initializers:

    *chassis_features = (struct chassis_features) {
        .ct_no_masked_label = true,
        .mac_binding_timestamp = true,
    };

>  }
>  
>  struct ovn_chassis_qdisc_queues {
> @@ -15202,7 +15211,7 @@ northd_init(struct northd_data *data)
>      hmap_init(&data->lbs);
>      hmap_init(&data->bfd_connections);
>      ovs_list_init(&data->lr_list);
> -    memset(&data->features, 0, sizeof data->features);
> +    memset(&data->features, true, sizeof data->features);

This looks a bit weird to me, 'data->features' is not an "array of
bool".  I think we either leave this as it was, zeroed by default, and
set what's needed to true/false in build_chassis_features() or
initialize all the fields to true explicitly here (using designated
initializers).

>      data->ovn_internal_version_changed = false;
>  }
>  
> diff --git a/northd/northd.h b/northd/northd.h
> index dcbed1b1f..d9856af97 100644
> --- a/northd/northd.h
> +++ b/northd/northd.h
> @@ -64,6 +64,7 @@ struct northd_input {
>  
>  struct chassis_features {
>      bool ct_no_masked_label;
> +    bool mac_binding_timestamp;
>  };
>  
>  struct northd_data {

Thanks,
Dumitru

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

Reply via email to