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 <[email protected]>
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
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev