[{"id":3526301,"web_url":"http://patchwork.ozlabs.org/comment/3526301/","msgid":"<ef57b0e3-7f8a-459e-9975-52f42d129f67@redhat.com>","list_archive_url":null,"date":"2025-06-09T17:48:31","subject":"Re: [ovs-dev] [PATCH ovn 07/14] en-lflow-sync: Separate syncing\n from datapaths and from the lflow table.","submitter":{"id":71978,"url":"http://patchwork.ozlabs.org/api/people/71978/","name":"Mark Michelson","email":"mmichels@redhat.com"},"content":"On 6/9/25 13:35, Mark Michelson via dev wrote:\n> lflow_table_sync_to_sb() synced southbound logical flows based on two\n> criteria:\n> * Is the southbound logical flow's datapath or datapath group valid?\n> * Is there a matching flow in the lflow_table?\n> \n> Upcoming commits will allow for multiple lflow_tables to be synced, so\n> the syncing based on datapaths only needs to happen once. Moving this\n> syncing to its own function allows us to avoid redundant processing of\n> logical flows we already know have valid datapath information.\n> \n> Signed-off-by: Mark Michelson <mmichels@redhat.com>\n> ---\n>   northd/en-datapath-logical-router.c | 15 ++++++\n>   northd/en-datapath-logical-router.h |  5 ++\n>   northd/en-datapath-logical-switch.c | 15 ++++++\n>   northd/en-datapath-logical-switch.h |  5 ++\n>   northd/en-lflow.c                   | 73 +++++++++++++++++++++++++++++\n>   northd/inc-proc-northd.c            |  4 ++\n>   northd/lflow-mgr.c                  | 56 ++++++++++------------\n>   7 files changed, 143 insertions(+), 30 deletions(-)\n> \n> diff --git a/northd/en-datapath-logical-router.c b/northd/en-datapath-logical-router.c\n> index 1c70b32de..b8ec7073e 100644\n> --- a/northd/en-datapath-logical-router.c\n> +++ b/northd/en-datapath-logical-router.c\n> @@ -172,3 +172,18 @@ void en_datapath_synced_logical_router_cleanup(void *data)\n>       struct ovn_synced_logical_router_map *router_map = data;\n>       synced_logical_router_map_destroy(router_map);\n>   }\n> +\n> +const struct ovn_synced_logical_router *\n> +ovn_synced_logical_router_find(const struct ovn_synced_logical_router_map *map,\n> +                               const struct uuid *nb_uuid)\n> +{\n> +    uint32_t hash = uuid_hash(nb_uuid);\n> +    const struct ovn_synced_logical_router *router;\n> +    HMAP_FOR_EACH_WITH_HASH (router, hmap_node, hash, &map->synced_routers) {\n> +        if (uuid_equals(&router->nb->header_.uuid, nb_uuid)) {\n> +            return router;\n> +        }\n> +    }\n> +\n> +    return NULL;\n> +}\n> diff --git a/northd/en-datapath-logical-router.h b/northd/en-datapath-logical-router.h\n> index 587de8393..eb0923f9c 100644\n> --- a/northd/en-datapath-logical-router.h\n> +++ b/northd/en-datapath-logical-router.h\n> @@ -46,4 +46,9 @@ enum engine_node_state en_datapath_synced_logical_router_run(\n>   \n>   void en_datapath_synced_logical_router_cleanup(void *data);\n>   \n> +struct uuid;\n> +const struct ovn_synced_logical_router *\n> +ovn_synced_logical_router_find(const struct ovn_synced_logical_router_map *map,\n> +                               const struct uuid *nb_uuid);\n> +\n>   #endif /* EN_DATAPATH_LOGICAL_ROUTER_H */\n> diff --git a/northd/en-datapath-logical-switch.c b/northd/en-datapath-logical-switch.c\n> index b667db4db..6dd2adf3c 100644\n> --- a/northd/en-datapath-logical-switch.c\n> +++ b/northd/en-datapath-logical-switch.c\n> @@ -170,3 +170,18 @@ void en_datapath_synced_logical_switch_cleanup(void *data)\n>       struct ovn_synced_logical_switch_map *switch_map = data;\n>       synced_logical_switch_map_destroy(switch_map);\n>   }\n> +\n> +const struct ovn_synced_logical_switch *\n> +ovn_synced_logical_switch_find(const struct ovn_synced_logical_switch_map *map,\n> +                               const struct uuid *nb_uuid)\n> +{\n> +    uint32_t hash = uuid_hash(nb_uuid);\n> +    const struct ovn_synced_logical_switch *ls;\n> +    HMAP_FOR_EACH_WITH_HASH (ls, hmap_node, hash, &map->synced_switches) {\n> +        if (uuid_equals(&ls->nb->header_.uuid, nb_uuid)) {\n> +            return ls;\n> +        }\n> +    }\n> +\n> +    return NULL;\n> +}\n> diff --git a/northd/en-datapath-logical-switch.h b/northd/en-datapath-logical-switch.h\n> index 1190b7be8..3f00b9996 100644\n> --- a/northd/en-datapath-logical-switch.h\n> +++ b/northd/en-datapath-logical-switch.h\n> @@ -45,4 +45,9 @@ enum engine_node_state en_datapath_synced_logical_switch_run(\n>       struct engine_node *, void *data);\n>   void en_datapath_synced_logical_switch_cleanup(void *data);\n>   \n> +struct uuid;\n> +const struct ovn_synced_logical_switch *\n> +ovn_synced_logical_switch_find(const struct ovn_synced_logical_switch_map *map,\n> +                               const struct uuid *nb_uuid);\n> +\n>   #endif /* EN_DATAPATH_LOGICAL_SWITCH_H */\n> diff --git a/northd/en-lflow.c b/northd/en-lflow.c\n> index 4992f7ea5..aa92755cc 100644\n> --- a/northd/en-lflow.c\n> +++ b/northd/en-lflow.c\n> @@ -29,6 +29,8 @@\n>   #include \"en-sampling-app.h\"\n>   #include \"en-group-ecmp-route.h\"\n>   #include \"lflow-mgr.h\"\n> +#include \"en-datapath-logical-switch.h\"\n> +#include \"en-datapath-logical-router.h\"\n>   \n>   #include \"lib/inc-proc-eng.h\"\n>   #include \"northd.h\"\n> @@ -348,6 +350,71 @@ void en_lflow_clear_tracked_data(void *data_)\n>       data->handled_incrementally = true;\n>   }\n>   \n> +static bool\n> +datapath_is_valid(const struct sbrec_datapath_binding *dp,\n> +                  const struct ovn_synced_logical_switch_map *synced_lses,\n> +                  const struct ovn_synced_logical_router_map *synced_lrs)\n> +{\n> +    enum ovn_datapath_type dp_type = ovn_datapath_type_from_string(dp->type);\n> +    if (dp_type == DP_MAX) {\n> +        return false;\n> +    }\n> +    struct uuid nb_dp_key;\n> +    if (!smap_get_uuid(&dp->external_ids, \"nb_uuid\", &nb_dp_key)) {\n> +        return false;\n> +    }\n\nThis patch existed at one point when the datapath sync refactor was \nusing external-ids \"nb_uuid\" in the southbound Datapath_Binding. When I \nrebased this series on a newer version of the datapath sync refactor, I \nmessed this part up, apparently. The four lines above should instead be:\n\nstruct uuid nb_dp_key;\nif (!uuid_from_string(&nb_dp_key, dp->nb_uuid)) {\n     return false;\n}\n\nThis is moot, however, since this part of the function is overwritten by \npatch 12 anyway.\n\n> +    if (dp_type == DP_SWITCH) {\n> +        if (ovn_synced_logical_switch_find(synced_lses, &nb_dp_key)) {\n> +            return true;\n> +        } else {\n> +            return false;\n> +        }\n> +    } else if (dp_type == DP_ROUTER) {\n> +        if (ovn_synced_logical_router_find(synced_lrs, &nb_dp_key)) {\n> +            return true;\n> +        } else {\n> +            return false;\n> +        }\n> +    }\n> +\n> +    return false;\n> +}\n> +\n> +static void\n> +sb_lflows_sync_for_datapaths(\n> +    const struct ovn_synced_logical_switch_map *switches,\n> +    const struct ovn_synced_logical_router_map *routers,\n> +    struct sb_lflows *sb_lflows)\n> +{\n> +    struct sb_lflow *sb_lflow;\n> +    HMAP_FOR_EACH_SAFE (sb_lflow, hmap_node, &sb_lflows->valid) {\n> +        struct sbrec_datapath_binding *dp = sb_lflow->flow->logical_datapath;\n> +        if (dp) {\n> +            if (!datapath_is_valid(dp, switches, routers)) {\n> +                hmap_remove(&sb_lflows->valid, &sb_lflow->hmap_node);\n> +                hmap_insert(&sb_lflows->to_delete, &sb_lflow->hmap_node,\n> +                            hmap_node_hash(&sb_lflow->hmap_node));\n> +            }\n> +        } else if (sb_lflow->flow->logical_dp_group) {\n> +            const struct sbrec_logical_dp_group *dp_group;\n> +            dp_group = sb_lflow->flow->logical_dp_group;\n> +            for (size_t i = 0; i < dp_group->n_datapaths; i++) {\n> +                dp = dp_group->datapaths[i];\n> +                if (datapath_is_valid(dp, switches, routers)) {\n> +                    break;\n> +                }\n> +                dp = NULL;\n> +            }\n> +\n> +        }\n> +        if (!dp) {\n> +            hmap_remove(&sb_lflows->valid, &sb_lflow->hmap_node);\n> +            hmap_insert(&sb_lflows->to_delete, &sb_lflow->hmap_node,\n> +                        hmap_node_hash(&sb_lflow->hmap_node));\n> +        }\n> +    }\n> +}\n> +\n>   static void\n>   lflow_sync_data_init(struct lflow_sync_data *lflow_sync,\n>                        const struct sbrec_logical_flow_table *sb_lflow_table)\n> @@ -391,6 +458,10 @@ en_lflow_sync_run(struct engine_node *node, void *data)\n>   {\n>       const struct sbrec_logical_flow_table *sb_lflow_table =\n>           EN_OVSDB_GET(engine_get_input(\"SB_logical_flow\", node));\n> +    const struct ovn_synced_logical_switch_map *synced_lses =\n> +        engine_get_input_data(\"datapath_synced_logical_switch\", node);\n> +    const struct ovn_synced_logical_router_map *synced_lrs =\n> +        engine_get_input_data(\"datapath_synced_logical_router\", node);\n>       /* XXX The lflow table is currently not treated as const because it\n>        * contains mutable logical datapath groups. A future commit will\n>        * separate the dp groups from the lflow_table so that this can be\n> @@ -412,6 +483,8 @@ en_lflow_sync_run(struct engine_node *node, void *data)\n>   \n>       stopwatch_start(LFLOWS_TO_SB_STOPWATCH_NAME, time_msec());\n>   \n> +    sb_lflows_sync_for_datapaths(synced_lses, synced_lrs,\n> +                                 &lflow_sync->sb_lflows);\n>       lflow_table_sync_to_sb(lflow_data->lflow_table, eng_ctx->ovnsb_idl_txn,\n>                              &northd->ls_datapaths,\n>                              &northd->lr_datapaths,\n> diff --git a/northd/inc-proc-northd.c b/northd/inc-proc-northd.c\n> index 18b0ba9a5..3e6ff47b9 100644\n> --- a/northd/inc-proc-northd.c\n> +++ b/northd/inc-proc-northd.c\n> @@ -447,6 +447,10 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb,\n>       engine_add_input(&en_lflow, &en_sb_acl_id, NULL);\n>   \n>       engine_add_input(&en_lflow_sync, &en_sb_logical_flow, NULL);\n> +    engine_add_input(&en_lflow_sync, &en_datapath_synced_logical_router,\n> +                     engine_noop_handler);\n> +    engine_add_input(&en_lflow_sync, &en_datapath_synced_logical_switch,\n> +                     engine_noop_handler);\n>       engine_add_input(&en_lflow_sync, &en_global_config,\n>                        node_global_config_handler);\n>       engine_add_input(&en_lflow_sync, &en_lflow, lflow_sync_lflow_handler);\n> diff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c\n> index 5973179b2..a4f061b1f 100644\n> --- a/northd/lflow-mgr.c\n> +++ b/northd/lflow-mgr.c\n> @@ -249,6 +249,26 @@ lflow_table_set_size(struct lflow_table *lflow_table, size_t size)\n>       lflow_table->entries.n = size;\n>   }\n>   \n> +static enum ovn_datapath_type\n> +datapath_type_from_sb_lflow(const struct sbrec_logical_flow *sb_lflow)\n> +{\n> +    const char *dp_type_str = NULL;\n> +    if (sb_lflow->logical_datapath) {\n> +        dp_type_str = sb_lflow->logical_datapath->type;\n> +    } else if (sb_lflow->logical_dp_group) {\n> +        /* All datapaths in a dp_group are of the same type, so just use the\n> +         * first datapath in the group to determine the type.\n> +         */\n> +        dp_type_str = sb_lflow->logical_dp_group->datapaths[0]->type;\n> +    }\n> +\n> +    if (!dp_type_str) {\n> +        return DP_MAX;\n> +    }\n> +\n> +    return ovn_datapath_type_from_string(dp_type_str);\n> +}\n> +\n>   void\n>   lflow_table_sync_to_sb(struct lflow_table *lflow_table,\n>                          struct ovsdb_idl_txn *ovnsb_txn,\n> @@ -269,41 +289,17 @@ lflow_table_sync_to_sb(struct lflow_table *lflow_table,\n>       struct sb_lflow *sb_lflow;\n>       HMAP_FOR_EACH (sb_lflow, hmap_node, &sb_lflows->valid) {\n>           const struct sbrec_logical_flow *sbflow = sb_lflow->flow;\n> -        struct sbrec_logical_dp_group *dp_group = sbflow->logical_dp_group;\n> -        struct ovn_datapath *logical_datapath_od = NULL;\n> -        size_t i;\n> -\n> -        /* Find one valid datapath to get the datapath type. */\n> -        struct sbrec_datapath_binding *dp = sbflow->logical_datapath;\n> -        if (dp) {\n> -            logical_datapath_od = ovn_datapath_from_sbrec(\n> -                &ls_datapaths->datapaths, &lr_datapaths->datapaths, dp);\n> -            if (logical_datapath_od\n> -                && ovn_datapath_is_stale(logical_datapath_od)) {\n> -                logical_datapath_od = NULL;\n> -            }\n> -        }\n> -        for (i = 0; dp_group && i < dp_group->n_datapaths; i++) {\n> -            logical_datapath_od = ovn_datapath_from_sbrec(\n> -                &ls_datapaths->datapaths, &lr_datapaths->datapaths,\n> -                dp_group->datapaths[i]);\n> -            if (logical_datapath_od\n> -                && !ovn_datapath_is_stale(logical_datapath_od)) {\n> -                break;\n> -            }\n> -            logical_datapath_od = NULL;\n> -        }\n> -\n> -        if (!logical_datapath_od) {\n> -            /* This lflow has no valid logical datapaths. */\n> -            continue;\n> -        }\n>   \n>           enum ovn_pipeline pipeline\n>               = !strcmp(sbflow->pipeline, \"ingress\") ? P_IN : P_OUT;\n>   \n>           enum ovn_datapath_type dp_type\n> -            = ovn_datapath_get_type(logical_datapath_od);\n> +            = datapath_type_from_sb_lflow(sbflow);\n> +\n> +        /* Since we should have weeded out sb_lflows with invalid\n> +         * datapaths, we should only get valid datapath types here.\n> +         */\n> +        ovs_assert(dp_type < DP_MAX);\n>   \n>           lflow = ovn_lflow_find(\n>               lflows,","headers":{"Return-Path":"<ovs-dev-bounces@openvswitch.org>","X-Original-To":["incoming@patchwork.ozlabs.org","dev@openvswitch.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","ovs-dev@lists.linuxfoundation.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=FSYIwnhG;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=140.211.166.138; helo=smtp1.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp1.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key)\n header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=FSYIwnhG","smtp4.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","smtp4.osuosl.org;\n dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com\n header.a=rsa-sha256 header.s=mimecast20190719 header.b=FSYIwnhG"],"Received":["from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4bGKCc6YLfz1yYd\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 10 Jun 2025 03:48:28 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp1.osuosl.org (Postfix) with ESMTP id 19E2382070;\n\tMon,  9 Jun 2025 17:48:41 +0000 (UTC)","from smtp1.osuosl.org ([127.0.0.1])\n by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id gy_qrEeS5aLq; Mon,  9 Jun 2025 17:48:39 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org\n [IPv6:2605:bc80:3010:104::8cd3:938])\n\tby smtp1.osuosl.org (Postfix) with ESMTPS id CF89782061;\n\tMon,  9 Jun 2025 17:48:39 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id A8357C0AC5;\n\tMon,  9 Jun 2025 17:48:39 +0000 (UTC)","from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 57630C0AC4\n for <dev@openvswitch.org>; Mon,  9 Jun 2025 17:48:38 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp4.osuosl.org (Postfix) with ESMTP id 3E12741C15\n for <dev@openvswitch.org>; Mon,  9 Jun 2025 17:48:38 +0000 (UTC)","from smtp4.osuosl.org ([127.0.0.1])\n by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id R48w0GQrCzxA for <dev@openvswitch.org>;\n Mon,  9 Jun 2025 17:48:37 +0000 (UTC)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by smtp4.osuosl.org (Postfix) with ESMTPS id 3A66641C3D\n for <dev@openvswitch.org>; Mon,  9 Jun 2025 17:48:36 +0000 (UTC)","from mail-yw1-f199.google.com (mail-yw1-f199.google.com\n [209.85.128.199]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-272-2ucEcEGcNeG1IJhBusngsQ-1; Mon, 09 Jun 2025 13:48:35 -0400","by mail-yw1-f199.google.com with SMTP id\n 00721157ae682-71111a7c31cso24908467b3.3\n for <dev@openvswitch.org>; Mon, 09 Jun 2025 10:48:34 -0700 (PDT)","from [192.168.0.220] ([66.85.230.211])\n by smtp.gmail.com with ESMTPSA id\n 00721157ae682-710f99e6a9fsm13301097b3.80.2025.06.09.10.48.32\n for <dev@openvswitch.org>\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Mon, 09 Jun 2025 10:48:32 -0700 (PDT)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections -\n client-ip=2605:bc80:3010:104::8cd3:938; helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp1.osuosl.org CF89782061","OpenDKIM Filter v2.11.0 smtp4.osuosl.org 3A66641C3D"],"Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=170.10.133.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=mmichels@redhat.com;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp4.osuosl.org 3A66641C3D","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1749491316;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=KDboMBK0U0RjcEGBgrasQBxxqVD5acLRa7UWgn379Fg=;\n b=FSYIwnhGHR3SFjXTHoHbr6g4Xg1FKes1AMkOlPl/xh1XHQQrXwc7HClzfXR8v3pqb1fo1b\n mS4Z3+01lPoF7r6fK1gssSh0k+PockAG4BWjCOa83zTkbm+ORumLk63jNKXYLFJzDp+zR1\n rAf2Ci0Gcf/lZve1dM/yBhkI4XWaagI=","X-MC-Unique":"2ucEcEGcNeG1IJhBusngsQ-1","X-Mimecast-MFC-AGG-ID":"2ucEcEGcNeG1IJhBusngsQ_1749491314","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1749491314; x=1750096114;\n h=content-transfer-encoding:in-reply-to:from:content-language\n :references:to:subject:user-agent:mime-version:date:message-id\n :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n bh=KDboMBK0U0RjcEGBgrasQBxxqVD5acLRa7UWgn379Fg=;\n b=UsBYcspWjeVA+x8fBXnpAf7XYiFKh/sg/cG/dVWBVZL3tI4xFeeJN/+rPziWyA/I5q\n q3kUqX8mYmL2+8GKlJNaE54r03HyxsCu3QCnz/gR8tNDAJeUsIEVzUHs81lf4FYoPjB4\n DmvhT2u4zYciYO0+dKIQR8vsrXUvMq8U/hSgTBKKk4d0p24VJ9QHmNRhF1ps1r1ApUVI\n pU5R3BkBrQwWSJkNVxTNHFuzw2WUiTCZSiAlLXerqi4QiKY2o9/J1Au4CVNE6XGJ5JXN\n T6eIbjl9hNAiIv6XizpkQkw1UqinT/v1ZbJzJ/lGxWjCXubBgCtR2nr1L2t6gAH5a1v6\n L68w==","X-Gm-Message-State":"AOJu0Yz/mY7Wp+OBqzxByvwHhcQv8U5+PZl6Rw5QbtFcGiLtbNV05eGY\n tmRRfewQLFw58Zu6QsuKjE7CLsvN1ZOCvKYDemZjRzLPIsxao32+uqLW5P7o9Wp378DqR7dUtST\n LIfTmgge8oQqt3Ylvt6ASex+9eR/wb+8oyNP50KM+wCBycrQVC+MBKMKOU8Xiync8jzWGtJ7qrf\n 7MrrIz5oiAjwAl4j7HtoD/YX0B8DXn5hmGBud2Ew==","X-Gm-Gg":"ASbGnctbJwMpLNTPzu1Q83a0EdmwPVhNeLVteq/FmxypaYNiFhgKBp8BoETNrWTFy1P\n nMZ7I/67Zx9M2nmB81Agqm2B5zlSCXentL1nIu78gLxZoHtpsR+i7/EcrIUv4b4aJAXAksS5xyr\n GS7QanJ19p2w8dxMeDATjaeEZzZHj3HMjJ3B4+f+qto51NcSJjHCgbqeZT8h/UC4+Zom6a2PRdN\n jPG/o0bl0Ni4TY5C4vXCiov6tIUJRWvAtqM1eLPbbd3z5louIIeXvjse5ch1FWRhurpee25Niqq\n 4XZL+pebr7FBaAdA/PdmcjkAlg==","X-Received":["by 2002:a05:690c:314:b0:70e:29af:844a with SMTP id\n 00721157ae682-710f769a864mr206605417b3.18.1749491313902;\n Mon, 09 Jun 2025 10:48:33 -0700 (PDT)","by 2002:a05:690c:314:b0:70e:29af:844a with SMTP id\n 00721157ae682-710f769a864mr206604977b3.18.1749491313493;\n Mon, 09 Jun 2025 10:48:33 -0700 (PDT)"],"X-Google-Smtp-Source":"\n AGHT+IE38dLAHzdNNLDHl1PvCiayrXUMzateTktMCyNylURTYBUUwzuHy2rbgoZ1V9CebrnNRxOEXg==","Message-ID":"<ef57b0e3-7f8a-459e-9975-52f42d129f67@redhat.com>","Date":"Mon, 9 Jun 2025 13:48:31 -0400","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","To":"dev@openvswitch.org","References":"<20250609173539.1636916-1-mmichels@redhat.com>\n <20250609173539.1636916-8-mmichels@redhat.com>","In-Reply-To":"<20250609173539.1636916-8-mmichels@redhat.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"J3MsA6hiJWbMzrTCgRWQqOZUN4eV3yWvOdprX1zarus_1749491314","X-Mimecast-Originator":"redhat.com","Content-Language":"en-US","Subject":"Re: [ovs-dev] [PATCH ovn 07/14] en-lflow-sync: Separate syncing\n from datapaths and from the lflow table.","X-BeenThere":"ovs-dev@openvswitch.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"<ovs-dev.openvswitch.org>","List-Unsubscribe":"<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=unsubscribe>","List-Archive":"<http://mail.openvswitch.org/pipermail/ovs-dev/>","List-Post":"<mailto:ovs-dev@openvswitch.org>","List-Help":"<mailto:ovs-dev-request@openvswitch.org?subject=help>","List-Subscribe":"<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=subscribe>","From":"Mark Michelson via dev <ovs-dev@openvswitch.org>","Reply-To":"Mark Michelson <mmichels@redhat.com>","Content-Transfer-Encoding":"7bit","Content-Type":"text/plain; charset=\"us-ascii\"; Format=\"flowed\"","Errors-To":"ovs-dev-bounces@openvswitch.org","Sender":"\"dev\" <ovs-dev-bounces@openvswitch.org>"}}]