get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.1/patches/2225761/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2225761,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2225761/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/ovn/patch/20260421144425.1191802-1-jtanenba@redhat.com/",
    "project": {
        "id": 68,
        "url": "http://patchwork.ozlabs.org/api/1.1/projects/68/?format=api",
        "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": ""
    },
    "msgid": "<20260421144425.1191802-1-jtanenba@redhat.com>",
    "date": "2026-04-21T14:44:25",
    "name": "[ovs-dev,v8] ovn-controller: Port up/ovn-installed reported too early.",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": false,
    "hash": "341999691ef48a06dc1b9e5c7b02e9257e3cbb9f",
    "submitter": {
        "id": 88238,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/88238/?format=api",
        "name": "Jacob Tanenbaum",
        "email": "jtanenba@redhat.com"
    },
    "delegate": {
        "id": 94943,
        "url": "http://patchwork.ozlabs.org/api/1.1/users/94943/?format=api",
        "username": "dceara",
        "first_name": "Dumitru",
        "last_name": "Ceara",
        "email": "dceara@redhat.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/ovn/patch/20260421144425.1191802-1-jtanenba@redhat.com/mbox/",
    "series": [
        {
            "id": 500828,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/500828/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/ovn/list/?series=500828",
            "date": "2026-04-21T14:44:25",
            "name": "[ovs-dev,v8] ovn-controller: Port up/ovn-installed reported too early.",
            "version": 8,
            "mbox": "http://patchwork.ozlabs.org/series/500828/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2225761/comments/",
    "check": "success",
    "checks": "http://patchwork.ozlabs.org/api/patches/2225761/checks/",
    "tags": {},
    "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=c7XgeCdv;\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 unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=c7XgeCdv",
            "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=c7XgeCdv"
        ],
        "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 4g0Q9k0VyYz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 00:44:42 +1000 (AEST)",
            "from localhost (localhost [127.0.0.1])\n\tby smtp2.osuosl.org (Postfix) with ESMTP id D67D242001;\n\tTue, 21 Apr 2026 14:44:39 +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 IrM5u32yvaRA; Tue, 21 Apr 2026 14:44:38 +0000 (UTC)",
            "from lists.linuxfoundation.org (lf-lists.osuosl.org\n [IPv6:2605:bc80:3010:104::8cd3:938])\n\tby smtp2.osuosl.org (Postfix) with ESMTPS id 71D9E40225;\n\tTue, 21 Apr 2026 14:44:38 +0000 (UTC)",
            "from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id 55A42C058E;\n\tTue, 21 Apr 2026 14:44:38 +0000 (UTC)",
            "from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 4D7F6C058D\n for <dev@openvswitch.org>; Tue, 21 Apr 2026 14:44:37 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n by smtp4.osuosl.org (Postfix) with ESMTP id 39C71412FC\n for <dev@openvswitch.org>; Tue, 21 Apr 2026 14:44:37 +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 i0gxaaZ0Gl3c for <dev@openvswitch.org>;\n Tue, 21 Apr 2026 14:44:36 +0000 (UTC)",
            "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by smtp4.osuosl.org (Postfix) with ESMTPS id DDDCF412F5\n for <dev@openvswitch.org>; Tue, 21 Apr 2026 14:44:35 +0000 (UTC)",
            "from mx-prod-mc-03.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-295-x-l1uJQPMIeJFiY3c_QfNQ-1; Tue,\n 21 Apr 2026 10:44:32 -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-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id A2A501955DE3\n for <dev@openvswitch.org>; Tue, 21 Apr 2026 14:44:31 +0000 (UTC)",
            "from jtanenba-thinkpadp16vgen1.boston.csb (unknown [10.22.81.185])\n by mx-prod-int-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id B845C180045E; Tue, 21 Apr 2026 14:44:30 +0000 (UTC)"
        ],
        "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 smtp2.osuosl.org 71D9E40225",
            "OpenDKIM Filter v2.11.0 smtp4.osuosl.org DDDCF412F5"
        ],
        "Received-SPF": "Pass (mailfrom) identity=mailfrom; client-ip=170.10.129.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=jtanenba@redhat.com;\n receiver=<UNKNOWN>",
        "DMARC-Filter": "OpenDMARC Filter v1.4.2 smtp4.osuosl.org DDDCF412F5",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1776782674;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding;\n bh=en0c/j+DJQ2QTjBKJRZVk0QDp+/s1jL9j4Pcjm4lPkE=;\n b=c7XgeCdv8iwIHrLNbsYG5KklBieHIeDpk+xVIMTfWnQvyiYC8ODSLHfkp6XPQJANtzQVuu\n IFCHtI54uhf1gZrEXxxcLlhKW+B7cJ/VmS2TBIPnvx0X8ppaa5fa4zIwcbJDuN7zH3BMEu\n 0NuJtMwppimMsTykncsrFUuylG22aaI=",
        "X-MC-Unique": "x-l1uJQPMIeJFiY3c_QfNQ-1",
        "X-Mimecast-MFC-AGG-ID": "x-l1uJQPMIeJFiY3c_QfNQ_1776782671",
        "To": "dev@openvswitch.org",
        "Date": "Tue, 21 Apr 2026 10:44:25 -0400",
        "Message-ID": "<20260421144425.1191802-1-jtanenba@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": "AZpe7djq-BcftVEt7PrZKrgjqJlQket4ndVjtc8_DJw_1776782671",
        "X-Mimecast-Originator": "redhat.com",
        "Subject": "[ovs-dev] [Patch ovn v8] ovn-controller: Port up/ovn-installed\n reported too early.",
        "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": "Jacob Tanenbaum via dev <ovs-dev@openvswitch.org>",
        "Reply-To": "Jacob Tanenbaum <jtanenba@redhat.com>",
        "Cc": "dceara@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": "When ovn-monitor-all is set to false ovn-controller sets ovn-installed\non OVS interfaces too early. ovn-controller needs to wait for the\nresponse from the southbound database with the updates to the newly\nmonitored fields only then can it install flows and label the OVS\ninterface as installed.\n\nReported-at: https://redhat.atlassian.net/browse/FDP-2887\nSigned-off-by: Jacob Tanenbaum <jtanenba@redhat.com>\n\n---\nv7->v8\n* removed printing in the system testcases that shouldn't be there and\n  caused failure.\n\nv6->v7\n* added an sset that holds the uuid's of datapaths that are waiting for\n  sb updates\n* added back the the state OIF_WAITING_SB_COND to the if_mgr state\n  machine.\n* no longer hold if the datapath is updated in the local_datapaths\n  struct as that is generated each transaction and cannot be relied\n  upon.\n* removed some leftover logic from previous patch versions\n\nv5->v6\n* simplified the logic as requested, Ales saw that we did not need to\n  save the seqno if we checked before the engine run.\n* removing the extra state from the state machine\n* removing some leftover logic that was seen.\n\nv4->v5\n* corrected a sanitizer error: used bool update_seqno without\n  initializing\n\nv3->v4\n* Added state OIF_WAITING_SB_COND to the state machine that manages\n  the adding of interfaces. This state waits until the Southbound has\n  updated the ovn-controller of relevent information about ports related\n  to it\n* Addressed several nits\n\nv2->v3\n* adding the ld->monitor_updated required the additiona of checking for\n  monitor_all in update_sb_monitors. I didn't account for being able to\n  toggle on monitor_all\n\nv1->v2\n* if_status_mgr_run() will run everytime the conditional seqno is\n  changed so it should be safe to only skip when the expected_seqno and\n  seqno returned from ovn are strictly not equal, that way we do not\n  have to deal with overflow in the seqno. Additionally add a boolean to\n  the local_datapath in the event that the seqno wraps around at the\n  same time the datapath would go back into the state OIF_INSTALL_FLOWS.\n* remove setting the state to itself for OIF_INSTALL_FLOWS in\n  if_status_mgr_update()\n* added assert(pb) in if_status_mgr_run()\n* removed a manual loop looking for the local_datapath and replaced with\n  get_local_datapath() in if_status_mgr_run\n* remove a few nit spelling errors in the test case",
    "diff": "diff --git a/controller/if-status.c b/controller/if-status.c\nindex ee9337e63..34875d23e 100644\n--- a/controller/if-status.c\n+++ b/controller/if-status.c\n@@ -18,6 +18,7 @@\n #include \"binding.h\"\n #include \"if-status.h\"\n #include \"lib/ofctrl-seqno.h\"\n+#include \"local_data.h\"\n #include \"ovsport.h\"\n #include \"simap.h\"\n \n@@ -58,6 +59,11 @@ VLOG_DEFINE_THIS_MODULE(if_status);\n enum if_state {\n     OIF_CLAIMED,          /* Newly claimed interface. pb->chassis update not\n                              yet initiated. */\n+    OIF_WAITING_SB_COND,  /* Waiting for the Southbound database to update\n+                           * ovn-controller for a given datapath. We should\n+                           * only be waiting in this state when monitor_all\n+                           * is false AND it is the first time that we see\n+                           * a specific datapath. */\n     OIF_INSTALL_FLOWS,    /* Claimed interface with pb->chassis update sent to\n                            * SB (but update notification not confirmed, so the\n                            * update may be resent in any of the following\n@@ -87,6 +93,7 @@ enum if_state {\n \n static const char *if_state_names[] = {\n     [OIF_CLAIMED]          = \"CLAIMED\",\n+    [OIF_WAITING_SB_COND]  = \"WAITING_SB_COND\",\n     [OIF_INSTALL_FLOWS]    = \"INSTALL_FLOWS\",\n     [OIF_REM_OLD_OVN_INST] = \"REM_OLD_OVN_INST\",\n     [OIF_MARK_UP]          = \"MARK_UP\",\n@@ -114,7 +121,18 @@ static const char *if_state_names[] = {\n  * | |                 |  +--+                                           | | |\n  * | |                 |                                                 | | |\n  * | |                 | mgr_update(when sb is rw i.e. pb->chassis)      | | |\n- * | |                 |            has been updated                     | | |\n+ * | |                 V            has been updated                     | | |\n+ * | |   +----------------------+                                        | | |\n+ * | |   |                      |                                        | | |\n+ * | |   |    WAITING_SB_COND   |                                        | | |\n+ * | |   |                      |                                        | | |\n+ * | |   |                      |                                        | | |\n+ * | |   +----------------------+                                        | | |\n+ * | |                 |                                                 | | |\n+ * | |                 |                                                 | | |\n+ * | |                 |   mgr_update(when sb_cond_seqno == expected)    | | |\n+ * | |                 |   - request seqno                               | | |\n+ * | |                 |                                                 | | |\n  * | | release_iface   | - request seqno                                 | | |\n  * | |                 |                                                 | | |\n  * | |                 V                                                 | | |\n@@ -335,6 +353,7 @@ if_status_mgr_claim_iface(struct if_status_mgr *mgr,\n \n     switch (iface->state) {\n     case OIF_CLAIMED:\n+    case OIF_WAITING_SB_COND:\n     case OIF_INSTALL_FLOWS:\n     case OIF_REM_OLD_OVN_INST:\n     case OIF_MARK_UP:\n@@ -383,6 +402,7 @@ if_status_mgr_release_iface(struct if_status_mgr *mgr, const char *iface_id)\n \n     switch (iface->state) {\n     case OIF_CLAIMED:\n+    case OIF_WAITING_SB_COND:\n     case OIF_INSTALL_FLOWS:\n         /* Not yet fully installed interfaces:\n          * pb->chassis still need to be deleted.\n@@ -424,6 +444,7 @@ if_status_mgr_delete_iface(struct if_status_mgr *mgr, const char *iface_id,\n \n     switch (iface->state) {\n     case OIF_CLAIMED:\n+    case OIF_WAITING_SB_COND:\n     case OIF_INSTALL_FLOWS:\n         /* Not yet fully installed interfaces:\n          * pb->chassis still need to be deleted.\n@@ -500,6 +521,8 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n                      const struct sbrec_chassis *chassis_rec,\n                      const struct ovsrec_interface_table *iface_table,\n                      const struct sbrec_port_binding_table *pb_table,\n+                     const struct hmap *local_datapaths,\n+                     const struct sset *waiting_sb_update,\n                      bool ovs_readonly,\n                      bool sb_readonly)\n {\n@@ -622,9 +645,7 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n              * in if_status_handle_claims or if_status_mgr_claim_iface\n              */\n             if (iface->is_vif) {\n-                ovs_iface_set_state(mgr, iface, OIF_INSTALL_FLOWS);\n-                iface->install_seqno = mgr->iface_seqno + 1;\n-                new_ifaces = true;\n+                ovs_iface_set_state(mgr, iface, OIF_WAITING_SB_COND);\n             } else {\n                 ovs_iface_set_state(mgr, iface, OIF_MARK_UP);\n             }\n@@ -639,6 +660,32 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n         }\n     }\n \n+    if (!sb_readonly) {\n+        HMAPX_FOR_EACH_SAFE (node,\n+                             &mgr->ifaces_per_state[OIF_WAITING_SB_COND]) {\n+            struct ovs_iface *iface = node->data;\n+            if (local_datapaths) {\n+                const struct sbrec_port_binding *pb =\n+                    sbrec_port_binding_table_get_for_uuid(pb_table,\n+                                                          &iface->pb_uuid);\n+                ovs_assert(pb);\n+                struct local_datapath *ld =\n+                    get_local_datapath(local_datapaths,\n+                                       pb->datapath->tunnel_key);\n+                if (!ld) {\n+                    continue;\n+                }\n+                char *uuid = uuid_to_string(&ld->datapath->header_.uuid);\n+                if (!sset_contains(waiting_sb_update, uuid)) {\n+                    ovs_iface_set_state(mgr, iface, OIF_INSTALL_FLOWS);\n+                    iface->install_seqno = mgr->iface_seqno + 1;\n+                    new_ifaces = true;\n+                }\n+                free(uuid);\n+            }\n+        }\n+    }\n+\n     if (!sb_readonly) {\n         HMAPX_FOR_EACH_SAFE (node, &mgr->ifaces_per_state[OIF_UPDATE_PORT]) {\n             struct ovs_iface *iface = node->data;\ndiff --git a/controller/if-status.h b/controller/if-status.h\nindex d15ca3008..67018d113 100644\n--- a/controller/if-status.h\n+++ b/controller/if-status.h\n@@ -43,6 +43,8 @@ void if_status_mgr_update(struct if_status_mgr *, struct local_binding_data *,\n                           const struct sbrec_chassis *chassis,\n                           const struct ovsrec_interface_table *iface_table,\n                           const struct sbrec_port_binding_table *pb_table,\n+                          const struct hmap *local_datapaths,\n+                          const struct sset *waiting_sb_update,\n                           bool ovs_readonly,\n                           bool sb_readonly);\n void if_status_mgr_run(struct if_status_mgr *mgr, struct local_binding_data *,\ndiff --git a/controller/ovn-controller.c b/controller/ovn-controller.c\nindex da43051ed..a25892056 100644\n--- a/controller/ovn-controller.c\n+++ b/controller/ovn-controller.c\n@@ -1511,6 +1511,7 @@ en_runtime_data_clear_tracked_data(void *data_)\n }\n \n static void *\n+\n en_runtime_data_init(struct engine_node *node OVS_UNUSED,\n                      struct engine_arg *arg OVS_UNUSED)\n {\n@@ -7596,6 +7597,8 @@ main(int argc, char *argv[])\n     int ovs_txn_status = 1;\n     bool sb_monitor_all = false;\n     struct tracked_acl_ids *tracked_acl_ids = NULL;\n+    struct sset waiting_sb_update;\n+    sset_init(&waiting_sb_update);\n     while (!exit_args.exiting) {\n         ovsrcu_quiesce_end();\n \n@@ -7842,6 +7845,7 @@ main(int argc, char *argv[])\n \n                     bool recompute_allowed = (ovnsb_idl_txn &&\n                                               !ofctrl_has_backlog());\n+\n                     engine_run(recompute_allowed);\n                     tracked_acl_ids = engine_get_data(&en_acl_id);\n \n@@ -7951,6 +7955,9 @@ main(int argc, char *argv[])\n                                    sbrec_mirror_table_get(ovnsb_idl_loop.idl),\n                                    br_int,\n                                    &runtime_data->lbinding_data.bindings);\n+                        if (ovnsb_cond_seqno == ovnsb_expected_cond_seqno) {\n+                            sset_clear(&waiting_sb_update);\n+                        }\n                         /* Updating monitor conditions if runtime data or\n                          * logical datapath goups changed. */\n                         if (engine_node_changed(&en_runtime_data)\n@@ -7973,6 +7980,23 @@ main(int argc, char *argv[])\n                                  * a continuous reason for monitor updates. */\n                                 daemon_started_recently_countdown();\n                             }\n+\n+                            if (!sb_monitor_all && runtime_data) {\n+                                struct hmap *tracked_dp_bindings =\n+                                    &runtime_data->tracked_dp_bindings;\n+                                struct tracked_datapath *tdp;\n+                                HMAP_FOR_EACH_SAFE (tdp,\n+                                                    node,\n+                                                    tracked_dp_bindings) {\n+                                    char *uuid =\n+                                        uuid_to_string(&tdp->dp->header_.uuid);\n+                                    if (tdp->tracked_type ==\n+                                        TRACKED_RESOURCE_NEW) {\n+                                        sset_add(&waiting_sb_update, uuid);\n+                                    }\n+                                    free(uuid);\n+                                }\n+                            }\n                         }\n                         /* If there is no new expected seqno we have finished\n                          * loading all needed data from southbound. We then\n@@ -8017,6 +8041,10 @@ main(int argc, char *argv[])\n                                                     ovs_idl_loop.idl),\n                                          sbrec_port_binding_table_get(\n                                                     ovnsb_idl_loop.idl),\n+                                         runtime_data ?\n+                                               &runtime_data->local_datapaths\n+                                               : NULL,\n+                                         &waiting_sb_update,\n                                          !ovs_idl_txn,\n                                          !ovnsb_idl_txn);\n                     stopwatch_stop(IF_STATUS_MGR_UPDATE_STOPWATCH_NAME,\ndiff --git a/tests/ovn-controller.at b/tests/ovn-controller.at\nindex c98de9bc4..9dc7555ba 100644\n--- a/tests/ovn-controller.at\n+++ b/tests/ovn-controller.at\n@@ -3944,3 +3944,69 @@ OVN_CLEANUP([hv1], [hv2\n /already has encap ip.*cannot duplicate on/d])\n AT_CLEANUP\n ])\n+\n+OVN_FOR_EACH_NORTHD([\n+AT_SETUP([ovn-installed])\n+ovn_start\n+\n+net_add n1\n+sim_add hv1\n+\n+as hv1\n+ovs-vsctl add-br br-phys\n+ovn_attach n1 br-phys 192.168.0.1\n+ovn-appctl vlog/set dbg\n+ovs-vsctl add-port br-int vif1 -- \\\n+    set Interface vif1 external-ids:iface-id=lsp1\n+\n+check ovn-nbctl ls-add ls1\n+sleep_controller hv1\n+check ovn-nbctl --wait=sb lsp-add ls1 lsp1 -- \\\n+                          lsp-set-addresses lsp1 \"f0:00:00:00:00:01 10.0.0.1\"\n+\n+sleep_sb\n+wake_up_controller hv1\n+\n+# Wait for pflow for lsp1\n+OVS_WAIT_UNTIL([\n+    ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=vif1)\n+    echo \"vif1 port=$ofport\"\n+    test -n \"$ofport\" && test 1 -le $(as hv1 ovs-ofctl dump-flows br-int | grep -c in_port=$ofport)\n+])\n+\n+# If ovn-installed in ovs, all flows should be installed.\n+# In that case, there should be at least one flow with lsp1 address.\n+OVS_WAIT_UNTIL([\n+    ovn_installed=$(as hv1 ovs-vsctl get Interface vif1 external_ids:ovn-installed)\n+    echo $ovn_installed\n+    flow_count=$(as hv1 ovs-ofctl dump-flows br-int | grep -Fc \"10.0.0.1\")\n+    # for the monitor-all=true case the flow gets installed because ovn-controller is monitoring all\n+    # tables in OVN_SOUTHBOUND.\n+    if test -n \"$ovn_installed\"; then\n+        as hv1 ovs-ofctl dump-flows br-int > output\n+        test $flow_count -ge 1\n+    else\n+        true\n+    fi\n+])\n+\n+wake_up_sb\n+# After the southbound db has woken up and can send the update to the\n+# ovn-controller not monitoring all tables in the southbound db it\n+# should be able to install the interface.\n+OVS_WAIT_UNTIL([\n+    ovn_installed=$(as hv1 ovs-vsctl get Interface vif1 external_ids:ovn-installed)\n+    flow_count=$(as hv1 ovs-ofctl dump-flows br-int | grep -Fc \"10.0.0.1\")\n+    echo \"installed=$ovn_installed, count=$flow_count\"\n+    if test -n \"$ovn_installed\"; then\n+        as hv1 ovs-ofctl dump-flows br-int > output\n+        test $flow_count -ge 1\n+    else\n+        false\n+    fi\n+])\n+wait_for_ports_up\n+\n+OVN_CLEANUP([hv1])\n+AT_CLEANUP\n+])\n",
    "prefixes": [
        "ovs-dev",
        "v8"
    ]
}