get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2220157,
    "url": "http://patchwork.ozlabs.org/api/patches/2220157/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/ovn/patch/20260406143639.3639225-1-jtanenba@redhat.com/",
    "project": {
        "id": 68,
        "url": "http://patchwork.ozlabs.org/api/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": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260406143639.3639225-1-jtanenba@redhat.com>",
    "list_archive_url": null,
    "date": "2026-04-06T14:36:39",
    "name": "[ovs-dev,v4] ovn-controller: Port up/ovn-installed reported too early.",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "e461aa7fea6bea3d09f50b1e20ca92cfde774989",
    "submitter": {
        "id": 88238,
        "url": "http://patchwork.ozlabs.org/api/people/88238/?format=api",
        "name": "Jacob Tanenbaum",
        "email": "jtanenba@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/ovn/patch/20260406143639.3639225-1-jtanenba@redhat.com/mbox/",
    "series": [
        {
            "id": 498862,
            "url": "http://patchwork.ozlabs.org/api/series/498862/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/ovn/list/?series=498862",
            "date": "2026-04-06T14:36:39",
            "name": "[ovs-dev,v4] ovn-controller: Port up/ovn-installed reported too early.",
            "version": 4,
            "mbox": "http://patchwork.ozlabs.org/series/498862/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2220157/comments/",
    "check": "fail",
    "checks": "http://patchwork.ozlabs.org/api/patches/2220157/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=dd2Smw83;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)",
            "smtp4.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=dd2Smw83",
            "smtp1.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com",
            "smtp1.osuosl.org; dkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=dd2Smw83"
        ],
        "Received": [
            "from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\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 4fqBjh1Ktnz1xy1\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 07 Apr 2026 00:36:56 +1000 (AEST)",
            "from localhost (localhost [127.0.0.1])\n\tby smtp4.osuosl.org (Postfix) with ESMTP id ACC1E408D5;\n\tMon,  6 Apr 2026 14:36:54 +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 FDE1iIMwpVy6; Mon,  6 Apr 2026 14:36:53 +0000 (UTC)",
            "from lists.linuxfoundation.org (lf-lists.osuosl.org\n [IPv6:2605:bc80:3010:104::8cd3:938])\n\tby smtp4.osuosl.org (Postfix) with ESMTPS id 26FDD4088A;\n\tMon,  6 Apr 2026 14:36:53 +0000 (UTC)",
            "from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id 17E70C04FB;\n\tMon,  6 Apr 2026 14:36:53 +0000 (UTC)",
            "from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 531B8C04FA\n for <dev@openvswitch.org>; Mon,  6 Apr 2026 14:36:51 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n by smtp1.osuosl.org (Postfix) with ESMTP id 4569580EA4\n for <dev@openvswitch.org>; Mon,  6 Apr 2026 14:36:51 +0000 (UTC)",
            "from smtp1.osuosl.org ([127.0.0.1])\n by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id m6oJ9ICNfsmA for <dev@openvswitch.org>;\n Mon,  6 Apr 2026 14:36:50 +0000 (UTC)",
            "from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by smtp1.osuosl.org (Postfix) with ESMTPS id CF54280E87\n for <dev@openvswitch.org>; Mon,  6 Apr 2026 14:36:49 +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-221-fMQ1kjnuOqahcLgklu1BpQ-1; Mon,\n 06 Apr 2026 10:36:46 -0400",
            "from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4])\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 9F157195605B\n for <dev@openvswitch.org>; Mon,  6 Apr 2026 14:36:45 +0000 (UTC)",
            "from jtanenba-thinkpadp16vgen1.boston.csb (unknown [10.22.81.101])\n by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id A57D6300019F; Mon,  6 Apr 2026 14:36:43 +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 smtp4.osuosl.org 26FDD4088A",
            "OpenDKIM Filter v2.11.0 smtp1.osuosl.org CF54280E87"
        ],
        "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 smtp1.osuosl.org CF54280E87",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1775486207;\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=jXyNESg8b72p1Csc+Q20vQy2kKEcW/atXGO8rT2npkk=;\n b=dd2Smw83q7Z2Au6+SrDCcsM0535OFM6a0c/b4I6/MkCBriXaIizRBmsbYgYwELzbc1+Yh/\n HPW8LZJvkIxUC31QsJgKGlN2ZIxTjCBt9xhsHGFpHY6lE0GICumWfdtrFFKWUUt5vqvpGp\n bnJ1wtAH20EwEENHMcdsSZGO/hbYxx0=",
        "X-MC-Unique": "fMQ1kjnuOqahcLgklu1BpQ-1",
        "X-Mimecast-MFC-AGG-ID": "fMQ1kjnuOqahcLgklu1BpQ_1775486205",
        "To": "dev@openvswitch.org",
        "Date": "Mon,  6 Apr 2026 10:36:39 -0400",
        "Message-ID": "<20260406143639.3639225-1-jtanenba@redhat.com>",
        "MIME-Version": "1.0",
        "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.4",
        "X-Mimecast-Spam-Score": "0",
        "X-Mimecast-MFC-PROC-ID": "dlLNc39LtCpGTvHiNZ5Bo5iaWSM9GGl02Jif1ZyFODs_1775486205",
        "X-Mimecast-Originator": "redhat.com",
        "Subject": "[ovs-dev] [Patch ovn v4] 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 the ovn-controller sets\novn-installed on OVS interfaces too early. ovn-controller needs to wait\nfor the response from the southbound database with the updates to the\nnewly monitored southbound fields and after that wait for flows to be\ninstalled in OVS before labeling as installed.\n\nReported-at: https://redhat.atlassian.net/browse/FDP-2887\nSigned-off-by: Jacob Tanenbaum <jtanenba@redhat.com>\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..a8a1b3b46 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,9 @@ 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 SB updates for a given datapath\n+                           *\n+                           */\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 +91,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@@ -103,19 +108,35 @@ static const char *if_state_names[] = {\n  * | |   +----------------------+\n  * | |     ^ release_iface   | claim_iface()\n  * | |     |                 V - sbrec_update_chassis(if sb is rw)\n- * | |   +----------------------+\n- * | |   |                      | <------------------------------------------+\n- * | |   |       CLAIMED        | <----------------------------------------+ |\n- * | |   |                      | <--------------------------------------+ | |\n+ * | | | +----------------------+\n+ * | | | |                      | <------------------------------------------+\n+ * | | | |       CLAIMED        | <----------------------------------------+ |\n+ * | | | |                      | <--------------------------------------+ | |\n+ * | | | +----------------------+                                        | | |\n+ * | | |               |  V  ^                                           | | |\n+ * | | |               |  |  | handle_claims()                           | | |\n+ * | | |               |  |  | - sbrec_update_chassis(if sb is rw)       | | |\n+ * | | |               |  +--+                                           | | |\n+ * | | |               |                                                 | | |\n+ * | | |               | mgr_update(when sb is rw i.e. pb->chassis)      | | |\n+ * | | |               |            has been updated                     | | |\n+ * | | | release_iface |                                                 | | |\n+ * | | |               |                                                 | | |\n+ * | | |               V                                                 | | |\n+ * | | | +----------------------+                                        | | |\n+ * | | +-|                      |                                        | | |\n+ * | |   |    WAITING_SB_COND   |                                        | | |\n+ * | |   |                      |                                        | | |\n+ * | |   |                      |                                        | | |\n  * | |   +----------------------+                                        | | |\n- * | |                 |  V  ^                                           | | |\n- * | |                 |  |  | handle_claims()                           | | |\n- * | |                 |  |  | - sbrec_update_chassis(if sb is rw)       | | |\n- * | |                 |  +--+                                           | | |\n  * | |                 |                                                 | | |\n- * | |                 | mgr_update(when sb is rw i.e. pb->chassis)      | | |\n- * | |                 |            has been updated                     | | |\n- * | | release_iface   | - request seqno                                 | | |\n+ * | |                 |                                                 | | |\n+ * | |                 |                                                 | | |\n+ * | |                 |   mgr_update(when sb_cond_seqno == expected)    | | |\n+ * | |                 |   - request seqno                               | | |\n+ * | |                 |                                                 | | |\n+ * | |                 |                                                 | | |\n+ * | | release_iface   |                                                 | | |\n  * | |                 |                                                 | | |\n  * | |                 V                                                 | | |\n  * | |   +----------------------+                                        | | |\n@@ -335,6 +356,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 +405,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 +447,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 +524,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 unsigned int ovnsb_cond_seqno,\n                      bool ovs_readonly,\n                      bool sb_readonly)\n {\n@@ -614,7 +640,6 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n \n     /* Move newly claimed interfaces from OIF_CLAIMED to OIF_INSTALL_FLOWS.\n      */\n-    bool new_ifaces = false;\n     if (!sb_readonly) {\n         HMAPX_FOR_EACH_SAFE (node, &mgr->ifaces_per_state[OIF_CLAIMED]) {\n             struct ovs_iface *iface = node->data;\n@@ -622,9 +647,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@@ -654,12 +677,42 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n                          iface->id);\n         }\n     }\n+    /* Check the WAITING_SB_COND nodes after transitioning nodes from CLAIMED\n+     * as condition could already be satisfied to move to INSTALL_FLOWS.\n+     */\n+    bool update_seqno;\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+                if (ld->monitor_updated ||\n+                    ld->expected_cond_seqno == ovnsb_cond_seqno) {\n+\n+                    ovs_iface_set_state(mgr, iface, OIF_INSTALL_FLOWS);\n+                    iface->install_seqno = mgr->iface_seqno + 1;\n+                    update_seqno = true;\n+                }\n+            }\n+        }\n+    }\n+\n     /* Register for a notification about flows being installed in OVS for all\n-     * newly claimed interfaces for which pb->chassis has been updated.\n-     * Request a seqno update when the flows for new interfaces have been\n-     * installed in OVS.\n+     * newly claimed interfaces for which pb->chassis has been updated and all\n+     * updates have been received from SB. Request a seqno update when the\n+     * flows for new interfaces have been installed in OVS.\n      */\n-    if (new_ifaces) {\n+    if (update_seqno) {\n         mgr->iface_seqno++;\n         ofctrl_seqno_update_create(mgr->iface_seq_type_pb_cfg,\n                                    mgr->iface_seqno);\ndiff --git a/controller/if-status.h b/controller/if-status.h\nindex d15ca3008..08aa4faf6 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 unsigned int ovnsb_cond_seqno,\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/local_data.h b/controller/local_data.h\nindex 948c1a935..3ec14c30c 100644\n--- a/controller/local_data.h\n+++ b/controller/local_data.h\n@@ -65,6 +65,11 @@ struct local_datapath {\n \n     struct shash external_ports;\n     struct shash multichassis_ports;\n+\n+    /* The expected seqno from the sb to be fully updated for this datapath. */\n+    unsigned int expected_cond_seqno;\n+    /* If the monitor has been updated for this datapath. */\n+    bool monitor_updated;\n };\n \n struct local_datapath *local_datapath_alloc(\ndiff --git a/controller/ovn-controller.c b/controller/ovn-controller.c\nindex 4161fe2b3..dc8f7c0cc 100644\n--- a/controller/ovn-controller.c\n+++ b/controller/ovn-controller.c\n@@ -443,6 +443,18 @@ out:;\n         expected_cond_seqno = MAX(expected_cond_seqno, cond_seqnos[i]);\n     }\n \n+    if (local_datapaths) {\n+        struct local_datapath *ld;\n+        HMAP_FOR_EACH (ld, hmap_node, local_datapaths) {\n+            if (monitor_all) {\n+                ld->monitor_updated = true;\n+            }\n+            if (!ld->monitor_updated) {\n+                ld->expected_cond_seqno = expected_cond_seqno;\n+            }\n+        }\n+    }\n+\n     ovsdb_idl_condition_destroy(&pb);\n     ovsdb_idl_condition_destroy(&lf);\n     ovsdb_idl_condition_destroy(&ldpg);\n@@ -7862,6 +7874,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+                                         ovnsb_cond_seqno,\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..d8db9c345 100644\n--- a/tests/ovn-controller.at\n+++ b/tests/ovn-controller.at\n@@ -3944,3 +3944,68 @@ 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+    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",
        "v4"
    ]
}