On Mon, Apr 24, 2023 at 02:01:03PM +0800, Wan Junjie via dev wrote:
> ovs-save will do replace-flows for ovs restart. For some reason, ovs
> could have an invalid action, like invalid meter. Then adding flows
> will be stopped at the position of the first invalid flow. This could
> happen when ovs restart and vm related resource allocatting or destructing
> at the same time.
> 
> This patch will skip the invalid flows and continue the process so
> all valid flows will be added during the ovs restart. An destructed vm
> will not affect those normal vm traffic.
> 
> Signed-off-by: Wan Junjie <wanjun...@bytedance.com>

Hi Wan Junjie,

thanks for your patch.

> ---
>  include/openvswitch/vconn.h |  2 +-
>  lib/vconn.c                 | 23 ++++++++++++++---------
>  utilities/ovs-ofctl.c       | 19 +++++++++++++------
>  3 files changed, 28 insertions(+), 16 deletions(-)
> 
> diff --git a/include/openvswitch/vconn.h b/include/openvswitch/vconn.h
> index 5f69c732b..781c59075 100644
> --- a/include/openvswitch/vconn.h
> +++ b/include/openvswitch/vconn.h
> @@ -57,7 +57,7 @@ int vconn_recv_xid(struct vconn *, ovs_be32 xid, struct 
> ofpbuf **);
>  int vconn_transact(struct vconn *, struct ofpbuf *, struct ofpbuf **);
>  int vconn_transact_noreply(struct vconn *, struct ofpbuf *, struct ofpbuf 
> **);
>  int vconn_transact_multiple_noreply(struct vconn *, struct ovs_list 
> *requests,
> -                                    struct ofpbuf **replyp);
> +                                    struct ovs_list *replies);
>  int vconn_transact_multipart(struct vconn *, struct ovs_list *request,
>                               struct ovs_list *replies);
>  
> diff --git a/lib/vconn.c b/lib/vconn.c
> index b55676227..a5f6177ec 100644
> --- a/lib/vconn.c
> +++ b/lib/vconn.c
> @@ -926,23 +926,28 @@ vconn_transact_noreply(struct vconn *vconn, struct 
> ofpbuf *request,
>  /* vconn_transact_noreply() for a list of "struct ofpbuf"s, sent one by one.
>   * All of the requests on 'requests' are always destroyed, regardless of the
>   * return value. */
> -int
> -vconn_transact_multiple_noreply(struct vconn *vconn, struct ovs_list 
> *requests,
> -                                struct ofpbuf **replyp)
> -{
> +int vconn_transact_multiple_noreply(struct vconn *vconn,
> +                                    struct ovs_list *requests,
> +                                    struct ovs_list *replies) {
>      struct ofpbuf *request;
> +    int error = 0;
>  
>      LIST_FOR_EACH_POP (request, list_node, requests) {
> -        int error;
> +        struct ofpbuf *reply;
> +
> +        error = vconn_transact_noreply(vconn, request, &reply);
>  

nit: no blank line here please

> -        error = vconn_transact_noreply(vconn, request, replyp);
> -        if (error || *replyp) {
> -            ofpbuf_list_delete(requests);
> +        if (error && !reply) {
>              return error;
>          }
> +        if (reply) {
> +            ovs_list_push_back(replies, &reply->list_node);
> +        }
>      }
>  
> -    *replyp = NULL;
> +    if (!ovs_list_is_empty(replies)) {
> +        return error;

If there has been a reply then we get here.
And return the most recent value of error which,
by my reading, may not relate to any of the replies.
Is this intentional?

> +    }
>      return 0;
>  }
>  
> diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
> index 24d0941cf..a84551672 100644
> --- a/utilities/ovs-ofctl.c
> +++ b/utilities/ovs-ofctl.c
> @@ -715,18 +715,25 @@ dump_trivial_transaction(const char *vconn_name, enum 
> ofpraw ofpraw)
>  static void
>  transact_multiple_noreply(struct vconn *vconn, struct ovs_list *requests)
>  {
> +    struct ovs_list replies;
>      struct ofpbuf *reply;
>  
> -    run(vconn_transact_multiple_noreply(vconn, requests, &reply),
> +    ovs_list_init(&replies);
> +
> +    run(vconn_transact_multiple_noreply(vconn, requests, &replies),
>          "talking to %s", vconn_get_name(vconn));
> -    if (reply) {
> +

nit: no blank line here please

> +    if (ovs_list_is_empty(&replies)) {
> +        return;
> +    }
> +
> +    LIST_FOR_EACH_POP (reply, list_node, &replies) {
>          ofp_print(stderr, reply->data, reply->size,
>                    ports_to_show(vconn_get_name(vconn)),
> -                  tables_to_show(vconn_get_name(vconn)),
> -                  verbosity + 2);
> -        exit(1);
> +                  tables_to_show(vconn_get_name(vconn)), verbosity + 2);

nit: the change to the line immediately above seems to be whitepace only.
     I don't think it belongs in this patch.

> +        ofpbuf_delete(reply);
>      }
> -    ofpbuf_delete(reply);
> +    exit(1);
>  }
>  
>  /* Frees the error messages as they are printed. */

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

Reply via email to