{"id":2095637,"url":"http://patchwork.ozlabs.org/api/patches/2095637/?format=json","web_url":"http://patchwork.ozlabs.org/project/ovn/patch/20250609173539.1636916-11-mmichels@redhat.com/","project":{"id":68,"url":"http://patchwork.ozlabs.org/api/projects/68/?format=json","name":"Open Virtual Network development","link_name":"ovn","list_id":"ovs-dev.openvswitch.org","list_email":"ovs-dev@openvswitch.org","web_url":"http://openvswitch.org/","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20250609173539.1636916-11-mmichels@redhat.com>","list_archive_url":null,"date":"2025-06-09T17:35:29","name":"[ovs-dev,10/14] lflows: Separate lflow_ref building and syncing.","commit_ref":null,"pull_url":null,"state":"deferred","archived":false,"hash":"667cc86ff42a1123c32d228d26f2d78cd437b432","submitter":{"id":71978,"url":"http://patchwork.ozlabs.org/api/people/71978/?format=json","name":"Mark Michelson","email":"mmichels@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/ovn/patch/20250609173539.1636916-11-mmichels@redhat.com/mbox/","series":[{"id":460139,"url":"http://patchwork.ozlabs.org/api/series/460139/?format=json","web_url":"http://patchwork.ozlabs.org/project/ovn/list/?series=460139","date":"2025-06-09T17:35:19","name":"Logical Flow Sync Refactor.","version":1,"mbox":"http://patchwork.ozlabs.org/series/460139/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2095637/comments/","check":"success","checks":"http://patchwork.ozlabs.org/api/patches/2095637/checks/","tags":{},"related":[],"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=Avi/crXg;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=140.211.166.133; helo=smtp2.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp2.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=Avi/crXg","smtp3.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","smtp3.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=Avi/crXg"],"Received":["from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133])\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 4bGJxM3v9rz1yDx\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 10 Jun 2025 03:36:07 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp2.osuosl.org (Postfix) with ESMTP id A309241EBA;\n\tMon,  9 Jun 2025 17:36:19 +0000 (UTC)","from smtp2.osuosl.org ([127.0.0.1])\n by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id ynnLZh2TDGmO; Mon,  9 Jun 2025 17:36:13 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56])\n\tby smtp2.osuosl.org (Postfix) with ESMTPS id A413941E97;\n\tMon,  9 Jun 2025 17:36:10 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id 993B4C0AC5;\n\tMon,  9 Jun 2025 17:36:10 +0000 (UTC)","from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 0D514C0AC4\n for <dev@openvswitch.org>; Mon,  9 Jun 2025 17:36:09 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp3.osuosl.org (Postfix) with ESMTP id C92EC61469\n for <dev@openvswitch.org>; Mon,  9 Jun 2025 17:35:58 +0000 (UTC)","from smtp3.osuosl.org ([127.0.0.1])\n by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id 08KvHN-k96OI for <dev@openvswitch.org>;\n Mon,  9 Jun 2025 17:35:53 +0000 (UTC)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by smtp3.osuosl.org (Postfix) with ESMTPS id 646B661449\n for <dev@openvswitch.org>; Mon,  9 Jun 2025 17:35:52 +0000 (UTC)","from mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-677-9tS6kEM9NDyUYhkLAaHibw-1; Mon,\n 09 Jun 2025 13:35:49 -0400","from mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.111])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-02.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id D7FA21956089\n for <dev@openvswitch.org>; Mon,  9 Jun 2025 17:35:48 +0000 (UTC)","from localhost.localdomain.com (unknown [10.22.58.15])\n by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 529F918003FC\n for <dev@openvswitch.org>; Mon,  9 Jun 2025 17:35:48 +0000 (UTC)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections - client-ip=140.211.9.56;\n helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp2.osuosl.org A413941E97","OpenDKIM Filter v2.11.0 smtp3.osuosl.org 646B661449"],"Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=170.10.129.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=mmichels@redhat.com;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp3.osuosl.org 646B661449","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1749490551;\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=Q+TmiT+6LPwNQje7PvyiGZrnUE9yuHdNGJ/IgCIxpu4=;\n b=Avi/crXgKo6Hary/wqqLMoTrkKG/13+5JkjrigILJN82KyYT2wUfhExIkN13H02Cm7bAlT\n FkE9BznaAFuMj0MLJDRpxEFIpWdnIRaC06H9n9uWZT2KFPJAv/L3FnYFOZRRIuxKtMBBhG\n +Rp3W9E36H/sAXw3hyXMNpx43G10vTk=","X-MC-Unique":"9tS6kEM9NDyUYhkLAaHibw-1","X-Mimecast-MFC-AGG-ID":"9tS6kEM9NDyUYhkLAaHibw_1749490549","To":"dev@openvswitch.org","Date":"Mon,  9 Jun 2025 13:35:29 -0400","Message-ID":"<20250609173539.1636916-11-mmichels@redhat.com>","In-Reply-To":"<20250609173539.1636916-1-mmichels@redhat.com>","References":"<20250609173539.1636916-1-mmichels@redhat.com>","MIME-Version":"1.0","X-Scanned-By":"MIMEDefang 3.4.1 on 10.30.177.111","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"O5EewttEVWih9lHQppkzGACml67mTxubfbugYbDrw9s_1749490549","X-Mimecast-Originator":"redhat.com","Subject":"[ovs-dev] [PATCH ovn 10/14] lflows: Separate lflow_ref building and\n syncing.","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-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"ovs-dev-bounces@openvswitch.org","Sender":"\"dev\" <ovs-dev-bounces@openvswitch.org>"},"content":"This commit gives responsibility for syncing lflow_refs to the\nen-lflow-sync engine node. Currently it only handles lflow_refs from the\nen-lflow node, but it could potentially handle lflow_refs from any input\nnode.\n\nTo accomplish this, all en-lflow input handlers mostly work the same.\nThe difference is that instead of calling lflow_ref_sync_lflows(), they\npush their lflow_ref to a vector. The en-lflow-sync node then iterates\nover this vector and calls lflow_ref_sync_lflows() on all of the\nlflow_refs.\n\nIn order to ensure that all unlinked lflow_ref_nodes have their\ncorresponding lflows removed from the lflow_table, we no longer\nshort-circuit when a call to lflow_ref_sync_lflows() fails. We allow all\nof the calls to complete, and afterwards if there were any failures, we\nfall back to a recompute. This way, when the recompute happens, there is\nno chance of attempting to sync unlinked lflows with the southbound\ndatabase.\n\nThis commit also adds an awkward call to clear datapath groups at the\nbeginning of lflow_table_sync_to_sb(). This is necessary because when we\nfall back to a recompute from the incremental case, the dp_groups need\nto be cleared out. A more natural place for this would be in the\nen-lflow-sync run() function, but the internals of the lflow_table are\nnot accessible from the en-lflow.c file. The next commit will separate\nthe dp_groups from the lflow_table.\n\nSigned-off-by: Mark Michelson <mmichels@redhat.com>\n---\n northd/en-lflow.c   | 123 +++++++++++++++-----------------\n northd/en-lflow.h   |  12 +++-\n northd/lflow-mgr.c  |  40 +++++------\n northd/lflow-mgr.h  |  10 +--\n northd/northd.c     | 167 +++++++++++---------------------------------\n northd/northd.h     |  19 +++--\n tests/ovn-northd.at | 125 ++++++++++++++++++++++++++++++++-\n 7 files changed, 262 insertions(+), 234 deletions(-)","diff":"diff --git a/northd/en-lflow.c b/northd/en-lflow.c\nindex aa92755cc..2e8f1ef60 100644\n--- a/northd/en-lflow.c\n+++ b/northd/en-lflow.c\n@@ -144,13 +144,12 @@ lflow_northd_handler(struct engine_node *node,\n     if (!lflow_handle_northd_port_changes(eng_ctx->ovnsb_idl_txn,\n                                           &northd_data->trk_data.trk_lsps,\n                                           &lflow_input,\n-                                          lflow_data->lflow_table)) {\n+                                          lflow_data)) {\n         return EN_UNHANDLED;\n     }\n \n-    if (!lflow_handle_northd_lb_changes(\n-            eng_ctx->ovnsb_idl_txn, &northd_data->trk_data.trk_lbs,\n-            &lflow_input, lflow_data->lflow_table)) {\n+    if (!lflow_handle_northd_lb_changes(&northd_data->trk_data.trk_lbs,\n+            &lflow_input, lflow_data)) {\n         return EN_UNHANDLED;\n     }\n \n@@ -183,15 +182,13 @@ lflow_lr_stateful_handler(struct engine_node *node, void *data)\n         return EN_UNHANDLED;\n     }\n \n-    const struct engine_context *eng_ctx = engine_get_context();\n     struct lflow_data *lflow_data = data;\n     struct lflow_input lflow_input;\n \n     lflow_get_input_data(node, &lflow_input);\n-    if (!lflow_handle_lr_stateful_changes(eng_ctx->ovnsb_idl_txn,\n-                                          &lr_sful_data->trk_data,\n+    if (!lflow_handle_lr_stateful_changes(&lr_sful_data->trk_data,\n                                           &lflow_input,\n-                                          lflow_data->lflow_table)) {\n+                                          lflow_data)) {\n         return EN_UNHANDLED;\n     }\n \n@@ -208,15 +205,13 @@ lflow_ls_stateful_handler(struct engine_node *node, void *data)\n         return EN_UNHANDLED;\n     }\n \n-    const struct engine_context *eng_ctx = engine_get_context();\n     struct lflow_data *lflow_data = data;\n     struct lflow_input lflow_input;\n \n     lflow_get_input_data(node, &lflow_input);\n-    if (!lflow_handle_ls_stateful_changes(eng_ctx->ovnsb_idl_txn,\n-                                          &ls_sful_data->trk_data,\n+    if (!lflow_handle_ls_stateful_changes(&ls_sful_data->trk_data,\n                                           &lflow_input,\n-                                          lflow_data->lflow_table)) {\n+                                          lflow_data)) {\n         return EN_UNHANDLED;\n     }\n \n@@ -229,37 +224,16 @@ lflow_multicast_igmp_handler(struct engine_node *node, void *data)\n     struct multicast_igmp_data *mcast_igmp_data =\n         engine_get_input_data(\"multicast_igmp\", node);\n \n-    const struct engine_context *eng_ctx = engine_get_context();\n     struct lflow_data *lflow_data = data;\n     struct lflow_input lflow_input;\n     lflow_get_input_data(node, &lflow_input);\n \n-    if (!lflow_ref_resync_flows(mcast_igmp_data->lflow_ref,\n-                                lflow_data->lflow_table,\n-                                eng_ctx->ovnsb_idl_txn,\n-                                lflow_input.ls_datapaths,\n-                                lflow_input.lr_datapaths,\n-                                lflow_input.ovn_internal_version_changed,\n-                                lflow_input.sbrec_logical_flow_table,\n-                                lflow_input.sbrec_logical_dp_group_table)) {\n-        return EN_UNHANDLED;\n-    }\n-\n+    lflow_ref_unlink_lflows(mcast_igmp_data->lflow_ref);\n     build_igmp_lflows(&mcast_igmp_data->igmp_groups,\n                       &lflow_input.ls_datapaths->datapaths,\n                       lflow_data->lflow_table,\n                       mcast_igmp_data->lflow_ref);\n-\n-    if (!lflow_ref_sync_lflows(mcast_igmp_data->lflow_ref,\n-                               lflow_data->lflow_table,\n-                               eng_ctx->ovnsb_idl_txn,\n-                               lflow_input.ls_datapaths,\n-                               lflow_input.lr_datapaths,\n-                               lflow_input.ovn_internal_version_changed,\n-                               lflow_input.sbrec_logical_flow_table,\n-                               lflow_input.sbrec_logical_dp_group_table)) {\n-        return EN_UNHANDLED;\n-    }\n+    vector_push(&lflow_data->lflow_refs, &mcast_igmp_data->lflow_ref);\n \n     return EN_HANDLED_UPDATED;\n }\n@@ -276,7 +250,6 @@ lflow_group_ecmp_route_change_handler(struct engine_node *node,\n         return EN_UNHANDLED;\n     }\n \n-    const struct engine_context *eng_ctx = engine_get_context();\n     struct lflow_data *lflow_data = data;\n \n     struct lflow_input lflow_input;\n@@ -291,17 +264,7 @@ lflow_group_ecmp_route_change_handler(struct engine_node *node,\n                     &group_ecmp_route_data->trk_data.deleted_datapath_routes) {\n         route_node = hmapx_node->data;\n         lflow_ref_unlink_lflows(route_node->lflow_ref);\n-\n-        bool handled = lflow_ref_sync_lflows(\n-            route_node->lflow_ref, lflow_data->lflow_table,\n-            eng_ctx->ovnsb_idl_txn, lflow_input.ls_datapaths,\n-            lflow_input.lr_datapaths,\n-            lflow_input.ovn_internal_version_changed,\n-            lflow_input.sbrec_logical_flow_table,\n-            lflow_input.sbrec_logical_dp_group_table);\n-        if (!handled) {\n-            return EN_UNHANDLED;\n-        }\n+        vector_push(&lflow_data->lflow_refs, &route_node->lflow_ref);\n     }\n \n     /* Now we handle created or updated route nodes. */\n@@ -313,17 +276,7 @@ lflow_group_ecmp_route_change_handler(struct engine_node *node,\n         build_route_data_flows_for_lrouter(\n             route_node->od, lflow_data->lflow_table,\n             route_node, lflow_input.bfd_ports);\n-\n-        bool handled = lflow_ref_sync_lflows(\n-            route_node->lflow_ref, lflow_data->lflow_table,\n-            eng_ctx->ovnsb_idl_txn, lflow_input.ls_datapaths,\n-            lflow_input.lr_datapaths,\n-            lflow_input.ovn_internal_version_changed,\n-            lflow_input.sbrec_logical_flow_table,\n-            lflow_input.sbrec_logical_dp_group_table);\n-        if (!handled) {\n-            return EN_UNHANDLED;\n-        }\n+        vector_push(&lflow_data->lflow_refs, &route_node->lflow_ref);\n     }\n \n     return EN_HANDLED_UPDATED;\n@@ -335,6 +288,7 @@ void *en_lflow_init(struct engine_node *node OVS_UNUSED,\n     struct lflow_data *data = xmalloc(sizeof *data);\n     data->lflow_table = lflow_table_alloc();\n     lflow_table_init(data->lflow_table);\n+    data->lflow_refs = VECTOR_EMPTY_INITIALIZER(struct lflow_ref *);\n     return data;\n }\n \n@@ -348,6 +302,7 @@ void en_lflow_clear_tracked_data(void *data_)\n {\n     struct lflow_data *data = data_;\n     data->handled_incrementally = true;\n+    vector_clear(&data->lflow_refs);\n }\n \n static bool\n@@ -417,11 +372,16 @@ sb_lflows_sync_for_datapaths(\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+                     const struct sbrec_logical_flow_table *sb_lflow_table,\n+                     const struct lflow_data *lflow_data)\n {\n     hmap_init(&lflow_sync->sb_lflows.valid);\n     hmap_init(&lflow_sync->sb_lflows.to_delete);\n \n+    if (lflow_data) {\n+        lflow_table_clear_dp_groups(lflow_data->lflow_table);\n+    }\n+\n     if (!sb_lflow_table) {\n         return;\n     }\n@@ -479,7 +439,7 @@ en_lflow_sync_run(struct engine_node *node, void *data)\n \n     struct lflow_sync_data *lflow_sync = data;\n     lflow_sync_data_destroy(lflow_sync);\n-    lflow_sync_data_init(lflow_sync, sb_lflow_table);\n+    lflow_sync_data_init(lflow_sync, sb_lflow_table, lflow_data);\n \n     stopwatch_start(LFLOWS_TO_SB_STOPWATCH_NAME, time_msec());\n \n@@ -507,7 +467,7 @@ en_lflow_sync_init(struct engine_node *node OVS_UNUSED,\n                         struct engine_arg *arg OVS_UNUSED)\n {\n     struct lflow_sync_data *lflow_sync = xzalloc(sizeof *lflow_sync);\n-    lflow_sync_data_init(lflow_sync, NULL);\n+    lflow_sync_data_init(lflow_sync, NULL, NULL);\n     return lflow_sync;\n }\n \n@@ -521,15 +481,48 @@ en_lflow_sync_cleanup(void *data)\n enum engine_input_handler_result\n lflow_sync_lflow_handler(struct engine_node *node, void *data OVS_UNUSED)\n {\n-    const struct lflow_data *lflow_data = engine_get_input_data(\"lflow\", node);\n+    const struct sbrec_logical_flow_table *sb_lflow_table =\n+        EN_OVSDB_GET(engine_get_input(\"SB_logical_flow\", 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+     * treated as const.\n+     */\n+    struct lflow_data *lflow_data =\n+        engine_get_input_data(\"lflow\", node);\n+    const struct northd_data *northd =\n+        engine_get_input_data(\"northd\", node);\n+    struct ed_type_global_config *global_config =\n+        engine_get_input_data(\"global_config\", node);\n+    const struct sbrec_logical_dp_group_table *sb_dp_group_table =\n+        EN_OVSDB_GET(engine_get_input(\"SB_logical_dp_group\", node));\n+    const struct engine_context *eng_ctx = engine_get_context();\n \n     /* The en-lflow node's handlers sync flows based on lflow_refs. If they\n      * were all able to handle the changes incrementally, then there's no need\n      * for en-lflow-sync to perform a sync of the entire lflow table.\n      */\n-    if (lflow_data->handled_incrementally) {\n-        return EN_HANDLED_UPDATED;\n-    } else {\n+    if (!lflow_data->handled_incrementally) {\n         return EN_UNHANDLED;\n     }\n+\n+    struct lflow_ref *lflow_ref;\n+    bool handled = true;\n+    VECTOR_FOR_EACH (&lflow_data->lflow_refs, lflow_ref) {\n+        /* We need to be sure to attempt to sync all lflow_refs, even if\n+         * one fails. The reason is that if there are any unlinked\n+         * lflow_ref_nodes whose lflows are no longer referenced by\n+         * any other lflow_ref_nodes, then those lflows need to be\n+         * removed from the lflow table. Otherwise, when we fall back\n+         * to recompute, we can attempt to sync non-existent lflows with\n+         * the southbound database\n+         */\n+        handled &= lflow_ref_sync_lflows(\n+            lflow_ref, lflow_data->lflow_table, eng_ctx->ovnsb_idl_txn,\n+            &northd->ls_datapaths, &northd->lr_datapaths,\n+            global_config->ovn_internal_version_changed, sb_lflow_table,\n+            sb_dp_group_table);\n+    }\n+\n+    return handled ? EN_HANDLED_UPDATED : EN_UNHANDLED;\n }\ndiff --git a/northd/en-lflow.h b/northd/en-lflow.h\nindex c6e6672c6..a057f9193 100644\n--- a/northd/en-lflow.h\n+++ b/northd/en-lflow.h\n@@ -15,8 +15,16 @@ struct sb_lflows;\n \n struct lflow_data {\n     struct lflow_table *lflow_table;\n-    /* This is set true if all of en-lflow's input handlers\n-     * were able to handle northd's changes incrementally.\n+    /* When en-lflow incrementally processes lflow_refs, it rebuilds\n+     * the flows and adds the lflow_refs to this vector so that the\n+     * en-lflow-sync node can resync the flows with the southbound\n+     * database\n+     */\n+    struct vector lflow_refs;\n+    /* Not all incremental changes in en-lflow affect the lflow_refs\n+     * vector above. So we use this as a way of knowing for certain\n+     * if en-lflow was able to handle all changes incrementally in\n+     * nodes that take en-lflow as an input.\n      */\n     bool handled_incrementally;\n };\ndiff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c\nindex aa8e60478..cb5511235 100644\n--- a/northd/lflow-mgr.c\n+++ b/northd/lflow-mgr.c\n@@ -285,6 +285,9 @@ lflow_table_sync_to_sb(struct lflow_table *lflow_table,\n     fast_hmap_size_for(&lflows_temp,\n                        lflow_table->max_seen_lflow_size);\n \n+    ovn_dp_groups_clear(&lflow_table->ls_dp_groups);\n+    ovn_dp_groups_clear(&lflow_table->lr_dp_groups);\n+\n     /* Push changes to the Logical_Flow table to database. */\n     struct sb_lflow *sb_lflow;\n     HMAP_FOR_EACH (sb_lflow, hmap_node, &sb_lflows->valid) {\n@@ -620,23 +623,6 @@ lflow_ref_unlink_lflows(struct lflow_ref *lflow_ref)\n     }\n }\n \n-bool\n-lflow_ref_resync_flows(struct lflow_ref *lflow_ref,\n-                       struct lflow_table *lflow_table,\n-                       struct ovsdb_idl_txn *ovnsb_txn,\n-                       const struct ovn_datapaths *ls_datapaths,\n-                       const struct ovn_datapaths *lr_datapaths,\n-                       bool ovn_internal_version_changed,\n-                       const struct sbrec_logical_flow_table *sbflow_table,\n-                       const struct sbrec_logical_dp_group_table *dpgrp_table)\n-{\n-    lflow_ref_unlink_lflows(lflow_ref);\n-    return lflow_ref_sync_lflows__(lflow_ref, lflow_table, ovnsb_txn,\n-                                   ls_datapaths, lr_datapaths,\n-                                   ovn_internal_version_changed, sbflow_table,\n-                                   dpgrp_table);\n-}\n-\n bool\n lflow_ref_sync_lflows(struct lflow_ref *lflow_ref,\n                       struct lflow_table *lflow_table,\n@@ -1280,6 +1266,7 @@ lflow_ref_sync_lflows__(struct lflow_ref  *lflow_ref,\n {\n     struct lflow_ref_node *lrn;\n     struct ovn_lflow *lflow;\n+    bool handled = true;\n     HMAP_FOR_EACH_SAFE (lrn, ref_node, &lflow_ref->lflow_ref_nodes) {\n         lflow = lrn->lflow;\n         const struct sbrec_logical_flow *sblflow =\n@@ -1305,10 +1292,9 @@ lflow_ref_sync_lflows__(struct lflow_ref  *lflow_ref,\n             if (!sync_lflow_to_sb(lflow, ovnsb_txn, dp_groups, datapaths,\n                                   ovn_internal_version_changed, sblflow,\n                                   dpgrp_table)) {\n-                return false;\n+                handled = false;\n             }\n         }\n-\n         if (!lrn->linked) {\n             lflow_ref_node_destroy(lrn);\n \n@@ -1322,7 +1308,7 @@ lflow_ref_sync_lflows__(struct lflow_ref  *lflow_ref,\n         }\n     }\n \n-    return true;\n+    return handled;\n }\n \n /* Used for the datapath reference counting for a given 'struct ovn_lflow'.\n@@ -1425,3 +1411,17 @@ lflow_ref_node_destroy(struct lflow_ref_node *lrn)\n     }\n     free(lrn);\n }\n+\n+void\n+lflow_table_clear_dp_groups(const struct lflow_table *lflow_table)\n+{\n+    /* This function should only be called in the case where the\n+     * reference counts of dp_groups do not matter. For instance,\n+     * if all dp_groups have been cleared/destroyed or are about\n+     * to be cleared/destroyed\n+     */\n+    struct ovn_lflow *lflow;\n+    HMAP_FOR_EACH (lflow, hmap_node, &lflow_table->entries) {\n+        lflow->dpg = NULL;\n+    }\n+}\ndiff --git a/northd/lflow-mgr.h b/northd/lflow-mgr.h\nindex 4e8aace07..f3f16f8f2 100644\n--- a/northd/lflow-mgr.h\n+++ b/northd/lflow-mgr.h\n@@ -63,14 +63,6 @@ struct lflow_ref *lflow_ref_create(void);\n void lflow_ref_destroy(struct lflow_ref *);\n void lflow_ref_clear(struct lflow_ref *lflow_ref);\n void lflow_ref_unlink_lflows(struct lflow_ref *);\n-bool lflow_ref_resync_flows(struct lflow_ref *,\n-                            struct lflow_table *lflow_table,\n-                            struct ovsdb_idl_txn *ovnsb_txn,\n-                            const struct ovn_datapaths *ls_datapaths,\n-                            const struct ovn_datapaths *lr_datapaths,\n-                            bool ovn_internal_version_changed,\n-                            const struct sbrec_logical_flow_table *,\n-                            const struct sbrec_logical_dp_group_table *);\n bool lflow_ref_sync_lflows(struct lflow_ref *,\n                            struct lflow_table *lflow_table,\n                            struct ovsdb_idl_txn *ovnsb_txn,\n@@ -228,4 +220,6 @@ dec_ovn_dp_group_ref(struct hmap *dp_groups, struct ovn_dp_group *dpg)\n     }\n }\n \n+void lflow_table_clear_dp_groups(const struct lflow_table *);\n+\n #endif /* LFLOW_MGR_H */\ndiff --git a/northd/northd.c b/northd/northd.c\nindex 3016be949..39323aa5f 100644\n--- a/northd/northd.c\n+++ b/northd/northd.c\n@@ -58,6 +58,7 @@\n #include \"en-port-binding-logical-router-port.h\"\n #include \"en-port-binding-chassisredirect.h\"\n #include \"en-port-binding-mirror.h\"\n+#include \"en-lflow.h\"\n #include \"lib/ovn-parallel-hmap.h\"\n #include \"ovn/actions.h\"\n #include \"ovn/features.h\"\n@@ -17887,24 +17888,20 @@ bool\n lflow_handle_northd_port_changes(struct ovsdb_idl_txn *ovnsb_txn,\n                                  struct tracked_ovn_ports *trk_lsps,\n                                  struct lflow_input *lflow_input,\n-                                 struct lflow_table *lflows)\n+                                 struct lflow_data *lflow_data)\n {\n     struct hmapx_node *hmapx_node;\n     struct ovn_port *op;\n \n+    struct lflow_table *lflows = lflow_data->lflow_table;\n+\n     HMAPX_FOR_EACH (hmapx_node, &trk_lsps->deleted) {\n         op = hmapx_node->data;\n         /* Make sure 'op' is an lsp and not lrp. */\n         ovs_assert(op->nbsp);\n-        bool handled = lflow_ref_resync_flows(\n-            op->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths,\n-            lflow_input->lr_datapaths,\n-            lflow_input->ovn_internal_version_changed,\n-            lflow_input->sbrec_logical_flow_table,\n-            lflow_input->sbrec_logical_dp_group_table);\n-        if (!handled) {\n-            return false;\n-        }\n+        lflow_ref_unlink_lflows(op->lflow_ref);\n+        vector_push(&lflow_data->lflow_refs, &op->lflow_ref);\n+\n         /* No need to update SB multicast groups, thanks to weak\n          * references. */\n     }\n@@ -17924,36 +17921,18 @@ lflow_handle_northd_port_changes(struct ovsdb_idl_txn *ovnsb_txn,\n                                                  lflow_input->meter_groups,\n                                                  &match, &actions,\n                                                  lflows);\n-        /* Sync the new flows to SB. */\n-        bool handled = lflow_ref_sync_lflows(\n-            op->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths,\n-            lflow_input->lr_datapaths,\n-            lflow_input->ovn_internal_version_changed,\n-            lflow_input->sbrec_logical_flow_table,\n-            lflow_input->sbrec_logical_dp_group_table);\n-        if (handled) {\n-            /* Now regenerate the stateful lflows for 'op' */\n-            /* Clear old lflows. */\n-            lflow_ref_unlink_lflows(op->stateful_lflow_ref);\n-            build_lbnat_lflows_iterate_by_lsp(op,\n-                                              lflow_input->lr_stateful_table,\n-                                              &match, &actions, lflows);\n-            handled = lflow_ref_sync_lflows(\n-                op->stateful_lflow_ref, lflows, ovnsb_txn,\n-                lflow_input->ls_datapaths,\n-                lflow_input->lr_datapaths,\n-                lflow_input->ovn_internal_version_changed,\n-                lflow_input->sbrec_logical_flow_table,\n-                lflow_input->sbrec_logical_dp_group_table);\n-        }\n+        vector_push(&lflow_data->lflow_refs, &op->lflow_ref);\n+        /* Now regenerate the stateful lflows for 'op' */\n+        /* Clear old lflows. */\n+        lflow_ref_unlink_lflows(op->stateful_lflow_ref);\n+        build_lbnat_lflows_iterate_by_lsp(op,\n+                                          lflow_input->lr_stateful_table,\n+                                          &match, &actions, lflows);\n+        vector_push(&lflow_data->lflow_refs, &op->stateful_lflow_ref);\n \n         ds_destroy(&match);\n         ds_destroy(&actions);\n \n-        if (!handled) {\n-            return false;\n-        }\n-\n         /* SB port_binding is not deleted, so don't update SB multicast\n          * groups. */\n     }\n@@ -17980,34 +17959,16 @@ lflow_handle_northd_port_changes(struct ovsdb_idl_txn *ovnsb_txn,\n                                                  lflow_input->meter_groups,\n                                                  &match, &actions, lflows);\n \n-        /* Sync the newly added flows to SB. */\n-        bool handled = lflow_ref_sync_lflows(\n-            op->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths,\n-            lflow_input->lr_datapaths,\n-            lflow_input->ovn_internal_version_changed,\n-            lflow_input->sbrec_logical_flow_table,\n-            lflow_input->sbrec_logical_dp_group_table);\n-        if (handled) {\n-            /* Now generate the stateful lflows for 'op' */\n-            build_lbnat_lflows_iterate_by_lsp(op,\n-                                              lflow_input->lr_stateful_table,\n-                                              &match, &actions, lflows);\n-            handled = lflow_ref_sync_lflows(\n-                op->stateful_lflow_ref, lflows, ovnsb_txn,\n-                lflow_input->ls_datapaths,\n-                lflow_input->lr_datapaths,\n-                lflow_input->ovn_internal_version_changed,\n-                lflow_input->sbrec_logical_flow_table,\n-                lflow_input->sbrec_logical_dp_group_table);\n-        }\n+        vector_push(&lflow_data->lflow_refs, &op->lflow_ref);\n+        /* Now generate the stateful lflows for 'op' */\n+        build_lbnat_lflows_iterate_by_lsp(op,\n+                                          lflow_input->lr_stateful_table,\n+                                          &match, &actions, lflows);\n+        vector_push(&lflow_data->lflow_refs, &op->stateful_lflow_ref);\n \n         ds_destroy(&match);\n         ds_destroy(&actions);\n \n-        if (!handled) {\n-            return false;\n-        }\n-\n         /* Update SB multicast groups for the new port. */\n         if (!sbmc_flood) {\n             sbmc_flood = create_sb_multicast_group(ovnsb_txn,\n@@ -18037,22 +17998,18 @@ lflow_handle_northd_port_changes(struct ovsdb_idl_txn *ovnsb_txn,\n }\n \n bool\n-lflow_handle_northd_lb_changes(struct ovsdb_idl_txn *ovnsb_txn,\n-                               struct tracked_lbs *trk_lbs,\n+lflow_handle_northd_lb_changes(struct tracked_lbs *trk_lbs,\n                                struct lflow_input *lflow_input,\n-                               struct lflow_table *lflows)\n+                               struct lflow_data *lflow_data)\n {\n     struct ovn_lb_datapaths *lb_dps;\n     struct hmapx_node *hmapx_node;\n+    struct lflow_table *lflows = lflow_data->lflow_table;\n     HMAPX_FOR_EACH (hmapx_node, &trk_lbs->deleted) {\n         lb_dps = hmapx_node->data;\n \n-        lflow_ref_resync_flows(\n-            lb_dps->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths,\n-            lflow_input->lr_datapaths,\n-            lflow_input->ovn_internal_version_changed,\n-            lflow_input->sbrec_logical_flow_table,\n-            lflow_input->sbrec_logical_dp_group_table);\n+        lflow_ref_unlink_lflows(lb_dps->lflow_ref);\n+        vector_push(&lflow_data->lflow_refs, &lb_dps->lflow_ref);\n     }\n \n     HMAPX_FOR_EACH (hmapx_node, &trk_lbs->crupdated) {\n@@ -18086,32 +18043,23 @@ lflow_handle_northd_lb_changes(struct ovsdb_idl_txn *ovnsb_txn,\n         ds_destroy(&match);\n         ds_destroy(&actions);\n \n-        /* Sync the new flows to SB. */\n-        bool handled = lflow_ref_sync_lflows(\n-            lb_dps->lflow_ref, lflows, ovnsb_txn, lflow_input->ls_datapaths,\n-            lflow_input->lr_datapaths,\n-            lflow_input->ovn_internal_version_changed,\n-            lflow_input->sbrec_logical_flow_table,\n-            lflow_input->sbrec_logical_dp_group_table);\n-        if (!handled) {\n-            return false;\n-        }\n+        vector_push(&lflow_data->lflow_refs, &lb_dps->lflow_ref);\n     }\n \n     return true;\n }\n \n bool\n-lflow_handle_lr_stateful_changes(struct ovsdb_idl_txn *ovnsb_txn,\n-                                struct lr_stateful_tracked_data *trk_data,\n-                                struct lflow_input *lflow_input,\n-                                struct lflow_table *lflows)\n+lflow_handle_lr_stateful_changes(struct lr_stateful_tracked_data *trk_data,\n+                                 struct lflow_input *lflow_input,\n+                                 struct lflow_data *lflow_data)\n {\n     struct lr_stateful_record *lr_stateful_rec;\n     struct ds actions = DS_EMPTY_INITIALIZER;\n     struct ds match = DS_EMPTY_INITIALIZER;\n     struct hmapx_node *hmapx_node;\n     bool handled = true;\n+    struct lflow_table *lflows = lflow_data->lflow_table;\n \n     HMAPX_FOR_EACH (hmapx_node, &trk_data->crupdated) {\n         lr_stateful_rec = hmapx_node->data;\n@@ -18125,16 +18073,7 @@ lflow_handle_lr_stateful_changes(struct ovsdb_idl_txn *ovnsb_txn,\n                                 lflow_input->meter_groups,\n                                 lflow_input->features);\n \n-        /* Sync the new flows to SB. */\n-        handled = lflow_ref_sync_lflows(\n-            lr_stateful_rec->lflow_ref, lflows, ovnsb_txn,\n-            lflow_input->ls_datapaths, lflow_input->lr_datapaths,\n-            lflow_input->ovn_internal_version_changed,\n-            lflow_input->sbrec_logical_flow_table,\n-            lflow_input->sbrec_logical_dp_group_table);\n-        if (!handled) {\n-            goto exit;\n-        }\n+        vector_push(&lflow_data->lflow_refs, &lr_stateful_rec->lflow_ref);\n \n         const struct ovn_datapath *od =\n             ovn_datapaths_find_by_index(lflow_input->lr_datapaths,\n@@ -18150,15 +18089,7 @@ lflow_handle_lr_stateful_changes(struct ovsdb_idl_txn *ovnsb_txn,\n                                               &match, &actions,\n                                               lflows);\n \n-            handled = lflow_ref_sync_lflows(\n-                op->stateful_lflow_ref, lflows, ovnsb_txn,\n-                lflow_input->ls_datapaths, lflow_input->lr_datapaths,\n-                lflow_input->ovn_internal_version_changed,\n-                lflow_input->sbrec_logical_flow_table,\n-                lflow_input->sbrec_logical_dp_group_table);\n-            if (!handled) {\n-                goto exit;\n-            }\n+            vector_push(&lflow_data->lflow_refs, &op->stateful_lflow_ref);\n \n             if (op->peer && op->peer->nbsp) {\n                 lflow_ref_unlink_lflows(op->peer->stateful_lflow_ref);\n@@ -18167,20 +18098,12 @@ lflow_handle_lr_stateful_changes(struct ovsdb_idl_txn *ovnsb_txn,\n                     op->peer, lflow_input->lr_stateful_table, &match, &actions,\n                     lflows);\n \n-                handled = lflow_ref_sync_lflows(\n-                    op->peer->stateful_lflow_ref, lflows, ovnsb_txn,\n-                    lflow_input->ls_datapaths, lflow_input->lr_datapaths,\n-                    lflow_input->ovn_internal_version_changed,\n-                    lflow_input->sbrec_logical_flow_table,\n-                    lflow_input->sbrec_logical_dp_group_table);\n-                if (!handled) {\n-                    goto exit;\n-                }\n+                vector_push(&lflow_data->lflow_refs,\n+                            &op->peer->stateful_lflow_ref);\n             }\n         }\n     }\n \n-exit:\n     ds_destroy(&match);\n     ds_destroy(&actions);\n \n@@ -18188,12 +18111,12 @@ exit:\n }\n \n bool\n-lflow_handle_ls_stateful_changes(struct ovsdb_idl_txn *ovnsb_txn,\n-                                struct ls_stateful_tracked_data *trk_data,\n-                                struct lflow_input *lflow_input,\n-                                struct lflow_table *lflows)\n+lflow_handle_ls_stateful_changes(struct ls_stateful_tracked_data *trk_data,\n+                                 struct lflow_input *lflow_input,\n+                                 struct lflow_data *lflow_data)\n {\n     struct hmapx_node *hmapx_node;\n+    struct lflow_table *lflows = lflow_data->lflow_table;\n \n     HMAPX_FOR_EACH (hmapx_node, &trk_data->crupdated) {\n         struct ls_stateful_record *ls_stateful_rec = hmapx_node->data;\n@@ -18214,17 +18137,7 @@ lflow_handle_ls_stateful_changes(struct ovsdb_idl_txn *ovnsb_txn,\n                                 lflows,\n                                 lflow_input->sbrec_acl_id_table);\n \n-        /* Sync the new flows to SB. */\n-        bool handled = lflow_ref_sync_lflows(\n-            ls_stateful_rec->lflow_ref, lflows, ovnsb_txn,\n-            lflow_input->ls_datapaths,\n-            lflow_input->lr_datapaths,\n-            lflow_input->ovn_internal_version_changed,\n-            lflow_input->sbrec_logical_flow_table,\n-            lflow_input->sbrec_logical_dp_group_table);\n-        if (!handled) {\n-            return false;\n-        }\n+        vector_push(&lflow_data->lflow_refs, &ls_stateful_rec->lflow_ref);\n     }\n \n     return true;\ndiff --git a/northd/northd.h b/northd/northd.h\nindex 3de8fc17a..23c2fad49 100644\n--- a/northd/northd.h\n+++ b/northd/northd.h\n@@ -866,23 +866,20 @@ void build_route_data_flows_for_lrouter(\n     const struct group_ecmp_datapath *route_node,\n     const struct sset *bfd_ports);\n \n-\n+struct lflow_data;\n bool lflow_handle_northd_port_changes(struct ovsdb_idl_txn *ovnsb_txn,\n                                       struct tracked_ovn_ports *,\n                                       struct lflow_input *,\n-                                      struct lflow_table *lflows);\n-bool lflow_handle_northd_lb_changes(struct ovsdb_idl_txn *ovnsb_txn,\n-                                    struct tracked_lbs *,\n+                                      struct lflow_data *lflow_data);\n+bool lflow_handle_northd_lb_changes(struct tracked_lbs *,\n                                     struct lflow_input *,\n-                                    struct lflow_table *lflows);\n-bool lflow_handle_lr_stateful_changes(struct ovsdb_idl_txn *,\n-                                      struct lr_stateful_tracked_data *,\n+                                    struct lflow_data *lflow_data);\n+bool lflow_handle_lr_stateful_changes(struct lr_stateful_tracked_data *,\n                                       struct lflow_input *,\n-                                      struct lflow_table *lflows);\n-bool lflow_handle_ls_stateful_changes(struct ovsdb_idl_txn *,\n-                                      struct ls_stateful_tracked_data *,\n+                                      struct lflow_data *lflow_data);\n+bool lflow_handle_ls_stateful_changes(struct ls_stateful_tracked_data *,\n                                       struct lflow_input *,\n-                                      struct lflow_table *lflows);\n+                                      struct lflow_data *lflow_data);\n bool northd_handle_sb_port_binding_changes(\n     const struct sbrec_port_binding_table *, struct hmap *ls_ports,\n     struct hmap *lr_ports);\ndiff --git a/tests/ovn-northd.at b/tests/ovn-northd.at\nindex f334698dd..baf0b7244 100644\n--- a/tests/ovn-northd.at\n+++ b/tests/ovn-northd.at\n@@ -3995,6 +3995,7 @@ wait_row_count bfd 1 logical_port=r0-sw3 detect_mult=5 dst_ip=192.168.3.2 \\\n check_engine_stats northd norecompute nocompute\n check_engine_stats bfd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats northd_output norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -4010,6 +4011,7 @@ wait_row_count bfd 1 logical_port=r0-sw1 min_rx=1000 min_tx=1000 detect_mult=100\n check_engine_stats northd norecompute nocompute\n check_engine_stats bfd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats northd_output norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -4022,6 +4024,7 @@ check_engine_stats northd recompute nocompute\n check_engine_stats bfd recompute nocompute\n check_engine_stats routes recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats northd_output norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -4038,6 +4041,7 @@ check_engine_stats northd recompute nocompute\n check_engine_stats bfd recompute nocompute\n check_engine_stats routes recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats northd_output norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -4050,6 +4054,7 @@ check_engine_stats northd recompute nocompute\n check_engine_stats bfd recompute nocompute\n check_engine_stats route_policies recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats northd_output norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -4085,6 +4090,7 @@ check_engine_stats northd recompute nocompute\n check_engine_stats bfd recompute nocompute\n check_engine_stats routes recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats northd_output norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -4100,6 +4106,7 @@ check_engine_stats northd recompute nocompute\n check_engine_stats bfd recompute nocompute\n check_engine_stats route_policies recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats northd_output norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -11498,6 +11505,7 @@ check ovn-nbctl --wait=sb lb-add lb1 10.0.0.10:80 10.0.0.3:80\n check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE(1)\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -11507,6 +11515,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11516,6 +11525,7 @@ check_engine_stats lb_data recompute nocompute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11525,6 +11535,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -11536,6 +11547,7 @@ check_engine_stats lb_data recompute nocompute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11546,6 +11558,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11555,6 +11568,7 @@ check_engine_stats lb_data recompute nocompute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11564,6 +11578,7 @@ check_engine_stats lb_data recompute nocompute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11573,6 +11588,7 @@ check_engine_stats lb_data recompute nocompute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11582,6 +11598,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n \n CHECK_NO_CHANGE_AFTER_RECOMPUTE(1)\n@@ -11592,6 +11609,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n \n CHECK_NO_CHANGE_AFTER_RECOMPUTE(1)\n@@ -11606,6 +11624,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n \n # Any change to load balancer health check should also result in full recompute\n@@ -11615,6 +11634,7 @@ check ovn-nbctl --wait=sb set load_balancer_health_check . options:foo=bar1\n check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n \n # Delete the health check from the load balancer.  northd engine node should do a full recompute.\n@@ -11624,6 +11644,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -11639,6 +11660,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute compute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n \n # Associate lb1 to sw0. There should be no recompute of northd engine node\n@@ -11653,6 +11675,7 @@ check_engine_stats lr_stateful norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE((1))\n \n # Modify the backend of the lb1 vip\n@@ -11663,6 +11686,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE(1)\n \n@@ -11674,6 +11698,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE(1)\n \n@@ -11685,6 +11710,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE(1)\n \n@@ -11696,6 +11722,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE(1)\n \n@@ -11707,6 +11734,7 @@ check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats ls_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE(1)\n \n@@ -11719,6 +11747,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n \n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n@@ -11730,6 +11759,7 @@ check ovn-nbctl --wait=sb ls-lb-del sw0 lb1\n check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11740,6 +11770,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11750,6 +11781,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11760,6 +11792,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11770,6 +11803,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11780,6 +11814,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11789,6 +11824,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11798,6 +11834,7 @@ lbg1_uuid=$(ovn-nbctl --wait=sb create load_balancer_group name=lbg1)\n check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute nocompute\n+check_engine_stats lflow_sync norecompute nocompute\n check_engine_stats sync_to_sb_lb norecompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -11811,6 +11848,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11820,6 +11858,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n \n # Add back lb to the lbg1 group\n@@ -11828,6 +11867,7 @@ check ovn-nbctl --wait=sb add load_balancer_group . load_Balancer $lb1_uuid\n check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11838,6 +11878,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n \n # Update lb and this should not result in northd recompute\n@@ -11848,6 +11889,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n \n # Modify the backend of the lb1 vip\n@@ -11858,6 +11900,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11869,6 +11912,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11880,6 +11924,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11891,6 +11936,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11899,6 +11945,7 @@ check ovn-nbctl --wait=sb clear logical_switch sw0 load_balancer_group\n check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute compute\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -11907,6 +11954,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11917,6 +11965,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11927,6 +11976,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11937,6 +11987,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11947,6 +11998,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11956,6 +12008,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11967,6 +12020,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -11977,6 +12031,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb compute compute\n \n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n@@ -12001,6 +12056,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute nocompute\n+check_engine_stats lflow_sync norecompute nocompute\n check_engine_stats sync_to_sb_lb norecompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12011,6 +12067,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12021,6 +12078,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12030,6 +12088,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12040,6 +12099,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12050,6 +12110,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12060,6 +12121,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12069,6 +12131,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12079,6 +12142,7 @@ check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats ls_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12091,6 +12155,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12103,6 +12168,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats ls_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12112,6 +12178,7 @@ check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lr_stateful recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12325,6 +12392,7 @@ check ovn-nbctl --wait=sb ls-lb-add sw0 lb1\n check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12334,6 +12402,7 @@ check ovn-nbctl --wait=sb clear load_balancer . vips\n check_engine_stats lb_data norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12342,6 +12411,7 @@ check ovn-nbctl --wait=sb lb-del lb1\n check_engine_stats lb_data norecompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats sync_to_sb_lb recompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -12360,6 +12430,7 @@ check ovn-nbctl --wait=sb lb-add lb2 10.0.0.10:80 10.0.0.3:80\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb ls-lb-add sw0 lb1\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n lb_lflow_uuid=$(fetch_column Logical_flow _uuid match='\"ct.new && ip4.dst == 10.0.0.10 && ct_tcp.dst == 80\"')\n@@ -12374,6 +12445,7 @@ AT_CHECK([test \"$lb_lflow_dpgrp\" = \"\"])\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb ls-lb-add sw1 lb2\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n lb_lflow_dp=$(ovn-sbctl --bare --columns logical_datapath list logical_flow $lb_lflow_uuid)\n@@ -12385,6 +12457,7 @@ AT_CHECK([test \"$lb_lflow_dpgrp\" != \"\"])\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb set load_balancer lb1 options:bar=foo\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n # Clear the SB:Logical_Flow.logical_dp_groups column of all the\n@@ -12397,7 +12470,12 @@ done\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb set load_balancer lb1 options:foo=bar\n-check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow norecompute compute\n+# 99.9% of the time, lflow and lflow_sync have the same result when\n+# it comes to recompute and compute. Messing with southbound logical\n+# flow datapath groups are the one case where lflow will compute but\n+# lflow_sync will need to recompute.\n+check_engine_stats lflow_sync recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n lb_lflow_uuid=$(fetch_column Logical_flow _uuid match='\"ct.new && ip4.dst == 10.0.0.10 && ct_tcp.dst == 80\"')\n@@ -12405,6 +12483,7 @@ lb_lflow_uuid=$(fetch_column Logical_flow _uuid match='\"ct.new && ip4.dst == 10.\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb clear load_balancer lb2 vips\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n lb_lflow_dp=$(ovn-sbctl --bare --columns logical_datapath list logical_flow $lb_lflow_uuid)\n@@ -12431,6 +12510,7 @@ check ovn-nbctl ls-lb-add sw4 lb2\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb ls-lb-add sw5 lb2\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n lb_lflow_dp=$(ovn-sbctl --bare --columns logical_datapath list logical_flow $lb_lflow_uuid)\n@@ -12462,6 +12542,7 @@ echo \"dpgrp_dps - $dpgrp_dps\"\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb clear load_balancer lb2 vips\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n lb_lflow_dpgrp=$(ovn-sbctl --bare --columns logical_dp_group list logical_flow $lb_lflow_uuid)\n@@ -12496,6 +12577,7 @@ check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl ls-lb-add sw0 lb3\n check ovn-nbctl --wait=sb ls-lb-add sw1 lb3\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n lb_lflow_uuid=$(fetch_column Logical_flow _uuid match='\"ct.new && ip4.dst == 10.0.0.10 && ct_tcp.dst == 80\"')\n@@ -12521,6 +12603,7 @@ AT_CHECK([echo $dpgrp_dps | grep $sw5_uuid], [0], [ignore])\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb clear load_balancer lb1 vips\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n lb_lflow_dp=$(ovn-sbctl --bare --columns logical_datapath list logical_flow $lb_lflow_uuid)\n@@ -12547,6 +12630,7 @@ AT_CHECK([echo $dpgrp_dps | grep $sw5_uuid], [0], [ignore])\n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb clear load_balancer lb3 vips\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n lb_lflow_dp=$(ovn-sbctl --bare --columns logical_datapath list logical_flow $lb_lflow_uuid)\n@@ -12593,6 +12677,7 @@ check_engine_stats lr_stateful recompute nocompute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n # Adding a logical router port should result in recompute\n@@ -12607,6 +12692,7 @@ check_engine_stats lr_stateful recompute nocompute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check ovn-nbctl lsp-add sw0 sw0-lr0\n@@ -12620,6 +12706,7 @@ check_engine_stats lr_stateful recompute nocompute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check ovn-nbctl ls-add public\n@@ -12647,6 +12734,7 @@ check_engine_stats lr_stateful recompute nocompute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n # Do checks for NATs.\n@@ -12657,6 +12745,7 @@ check ovn-nbctl --wait=sb lr-nat-add lr0 dnat_and_snat  172.168.0.110 10.0.0.4\n check_engine_stats northd norecompute compute\n check_engine_stats lr_nat norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n@@ -12667,6 +12756,7 @@ check ovn-nbctl --wait=sb set NAT . options:foo=bar\n check_engine_stats northd norecompute compute\n check_engine_stats lr_nat norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n@@ -12678,6 +12768,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_nat norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n@@ -12689,6 +12780,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_nat norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n@@ -12700,6 +12792,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_nat norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n@@ -12711,6 +12804,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_nat norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n@@ -12723,6 +12817,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_nat norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n@@ -12743,6 +12838,7 @@ check_engine_stats lr_stateful norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n # lflow engine should not recompute even if the nat ip 172.168.0.150\n@@ -12755,6 +12851,7 @@ check_engine_stats lr_stateful norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n # lflow engine should not recompute even if the deleted nat ip 172.168.0.150\n@@ -12767,6 +12864,7 @@ check_engine_stats lr_stateful norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n # lflow engine should not recompute even if the deleted nat ip 172.168.0.140\n@@ -12779,6 +12877,7 @@ check_engine_stats lr_stateful norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n # Delete the NAT\n@@ -12788,6 +12887,7 @@ check_engine_stats northd norecompute compute\n check_engine_stats lr_nat norecompute compute\n check_engine_stats lr_stateful norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n@@ -12801,6 +12901,7 @@ check_engine_stats lr_stateful recompute nocompute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -12811,6 +12912,7 @@ check_engine_stats lr_stateful recompute nocompute\n check_engine_stats sync_to_sb_pb recompute nocompute\n check_engine_stats sync_to_sb_lb recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n OVN_CLEANUP([hv1])\n@@ -12969,6 +13071,7 @@ check ovn-nbctl --wait=sb set NB_Global . options:foo=bar\n check_engine_stats global_config norecompute compute\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n@@ -12978,6 +13081,7 @@ check ovn-nbctl --wait=sb sync\n check_engine_stats global_config recompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n # Clears an nb option and checks that recomputes were triggered\n@@ -12992,6 +13096,7 @@ clear_nb_option() {\n   check_engine_stats global_config recompute compute\n   check_engine_stats northd recompute nocompute\n   check_engine_stats lflow recompute nocompute\n+  check_engine_stats lflow_sync recompute nocompute\n \n   local retval=1\n   if [ \"$add_back\" == \"true\" ]; then\n@@ -13012,6 +13117,7 @@ check ovn-nbctl --wait=sb set NB_Global . options:ignore_chassis_features=true\n check_engine_stats global_config recompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n \n clear_nb_option ignore_chassis_features false\n \n@@ -13023,6 +13129,7 @@ set_nb_option_lflow_recompute() {\n   check_engine_stats global_config norecompute compute\n   check_engine_stats northd recompute nocompute\n   check_engine_stats lflow recompute nocompute\n+  check_engine_stats lflow_sync recompute nocompute\n   check_engine_stats mac_binding_aging recompute nocompute\n   CHECK_NO_CHANGE_AFTER_RECOMPUTE\n }\n@@ -13034,6 +13141,7 @@ clear_nb_option_lflow_recompute() {\n   check_engine_stats global_config norecompute compute\n   check_engine_stats northd recompute nocompute\n   check_engine_stats lflow recompute nocompute\n+  check_engine_stats lflow_sync recompute nocompute\n   check_engine_stats mac_binding_aging recompute nocompute\n   CHECK_NO_CHANGE_AFTER_RECOMPUTE\n }\n@@ -13075,6 +13183,7 @@ check ovn-nbctl --wait=sb sync\n check_engine_stats global_config recompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-sbctl chassis-add ch2 geneve 127.0.0.2\n@@ -13082,6 +13191,7 @@ check ovn-nbctl --wait=sb sync\n check_engine_stats global_config recompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n \n AT_CHECK([ovn-nbctl get NB_Global . options:max_tunid | \\\n sed s/\":\"//g | sed s/\\\"//g], [0], [16711680\n@@ -13093,6 +13203,7 @@ check ovn-nbctl --wait=sb sync\n check_engine_stats global_config recompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-sbctl set encap . type=vxlan\n@@ -13100,6 +13211,7 @@ check ovn-nbctl --wait=sb sync\n check_engine_stats global_config recompute compute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n \n AT_CHECK([ovn-nbctl get NB_Global . options:max_tunid | \\\n sed s/\":\"//g | sed s/\\\"//g], [0], [4095\n@@ -13113,6 +13225,7 @@ check_engine_stats mac_binding_aging recompute nocompute\n check_engine_stats fdb_aging recompute nocompute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-sbctl set chassis . other_config:ct-commit-to-zone=true\n@@ -13122,6 +13235,7 @@ check_engine_stats mac_binding_aging recompute nocompute\n check_engine_stats fdb_aging recompute nocompute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n \n AT_CLEANUP\n \n@@ -13138,6 +13252,7 @@ check_row_count nb:Sampling_App 1\n check_engine_stats sampling_app recompute nocompute\n check_engine_stats northd recompute nocompute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n check_engine_stats global_config recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n@@ -17377,48 +17492,56 @@ check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb lsp-attach-mirror lport1 mirror_lport\n check_engine_stats northd recompute compute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb lsp-detach-mirror lport1 mirror_lport\n check_engine_stats northd recompute compute\n check_engine_stats lflow recompute nocompute\n+check_engine_stats lflow_sync recompute nocompute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb lsp-attach-mirror lport1 mirror_local\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb lsp-detach-mirror lport1 mirror_local\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb lsp-attach-mirror lport1 mirror_gre\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb lsp-detach-mirror lport1 mirror_gre\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb lsp-attach-mirror lport1 mirror_erspan\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n check as northd ovn-appctl -t ovn-northd inc-engine/clear-stats\n check ovn-nbctl --wait=sb lsp-detach-mirror lport1 mirror_erspan\n check_engine_stats northd norecompute compute\n check_engine_stats lflow norecompute compute\n+check_engine_stats lflow_sync norecompute compute\n CHECK_NO_CHANGE_AFTER_RECOMPUTE\n \n AT_CLEANUP\n","prefixes":["ovs-dev","10/14"]}