[{"id":3669619,"web_url":"http://patchwork.ozlabs.org/comment/3669619/","msgid":"<46e1e7ff-281a-4eff-a2fe-3d0a6b97a5b5@redhat.com>","list_archive_url":null,"date":"2026-03-26T10:36:13","subject":"Re: [ovs-dev] [Patch ovn v2] ovn-controller: Port up/ovn-installed\n reported too early.","submitter":{"id":76591,"url":"http://patchwork.ozlabs.org/api/people/76591/","name":"Dumitru Ceara","email":"dceara@redhat.com"},"content":"On 3/25/26 5:22 PM, Jacob Tanenbaum via dev wrote:\n> when ovn-monitor-all is set to false the ovn-controller sets\n> ovn-installed on OVS interfaces too early. ovn-controller needs to wait\n> for the response from the southbound database with the updates to the\n> newly monitored southbound fields and after that wait for flows to be\n> installed in OVS before labeling as installed.\n> \n> Reported-at: https://redhat.atlassian.net/browse/FDP-2887\n> Signed-off-by: Jacob Tanenbaum <jtanenba@redhat.com>\n> ---\n\nHi Jacob,\n\nThanks for the patch.  I didn't review it but it seems it causes quite a\nfew CI failures:\n\nhttps://github.com/ovsrobot/ovn/actions/runs/23552721612\n\nCould you please look into it and post a v3?\n\nThanks,\nDumitru\n\n> v1->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\n> \n> diff --git a/controller/if-status.c b/controller/if-status.c\n> index ee9337e63..d3383253b 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> @@ -590,12 +591,17 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n>          }\n>      }\n>  \n> +    bool update_seqno = false;\n>      /* Update pb->chassis in case it's not set (previous update still in fly\n>       * or pb->chassis was overwitten by another chassis.\n>       */\n>      if (!sb_readonly) {\n>          HMAPX_FOR_EACH_SAFE (node, &mgr->ifaces_per_state[OIF_INSTALL_FLOWS]) {\n>              struct ovs_iface *iface = node->data;\n> +            if (iface->is_vif) {\n> +                iface->install_seqno = mgr->iface_seqno + 1;\n> +                update_seqno = true;\n> +            }\n>              if (!local_bindings_pb_chassis_is_set(bindings, iface->id,\n>                  chassis_rec)) {\n>                  long long int now = time_msec();\n> @@ -614,7 +620,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> @@ -624,7 +629,7 @@ if_status_mgr_update(struct if_status_mgr *mgr,\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> +                update_seqno = true;\n>              } else {\n>                  ovs_iface_set_state(mgr, iface, OIF_MARK_UP);\n>              }\n> @@ -659,7 +664,7 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n>       * Request a seqno update when the flows for new interfaces have been\n>       * 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);\n> @@ -694,6 +699,8 @@ if_status_mgr_run(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> +                  unsigned int ovnsb_cond_seqno,\n>                    bool sb_readonly, bool ovs_readonly)\n>  {\n>      struct ofctrl_acked_seqnos *acked_seqnos =\n> @@ -703,10 +710,27 @@ if_status_mgr_run(struct if_status_mgr *mgr,\n>      /* Move interfaces from state OIF_INSTALL_FLOWS to OIF_MARK_UP if a\n>       * notification has been received aabout their flows being installed\n>       * in OVS.\n> +     *\n> +     * In the ovn-monitor-all=false case it is possible that we have not\n> +     * received the update that the southbound database is monitoring a new\n> +     *  datapath. Check for the update before continuing.\n>       */\n>      HMAPX_FOR_EACH_SAFE (node, &mgr->ifaces_per_state[OIF_INSTALL_FLOWS]) {\n>          struct ovs_iface *iface = node->data;\n>  \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, pb->datapath->tunnel_key);\n> +            if (!ld->monitor_updated &&\n> +                ld->expected_cond_seqno != ovnsb_cond_seqno) {\n> +                continue;\n> +            }\n> +            ld->monitor_updated = true;\n> +        }\n>          if (!ofctrl_acked_seqnos_contains(acked_seqnos,\n>                                            iface->install_seqno)) {\n>              continue;\n> diff --git a/controller/if-status.h b/controller/if-status.h\n> index d15ca3008..a877ebe2b 100644\n> --- a/controller/if-status.h\n> +++ b/controller/if-status.h\n> @@ -49,6 +49,8 @@ void if_status_mgr_run(struct if_status_mgr *mgr, struct local_binding_data *,\n>                         const struct sbrec_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 sb_readonly, bool ovs_readonly);\n>  void if_status_mgr_get_memory_usage(struct if_status_mgr *mgr,\n>                                      struct simap *usage);\n> diff --git a/controller/local_data.h b/controller/local_data.h\n> index 948c1a935..51dcca416 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 udpated 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(\n> diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c\n> index 4161fe2b3..89efb5e49 100644\n> --- a/controller/ovn-controller.c\n> +++ b/controller/ovn-controller.c\n> @@ -443,6 +443,15 @@ out:;\n>          expected_cond_seqno = MAX(expected_cond_seqno, cond_seqnos[i]);\n>      }\n>  \n> +    if (!monitor_all && local_datapaths) {\n> +        struct local_datapath *ld;\n> +        HMAP_FOR_EACH (ld, hmap_node, local_datapaths) {\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> @@ -7903,6 +7912,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>                                        !ovnsb_idl_txn, !ovs_idl_txn);\n>                      stopwatch_stop(IF_STATUS_MGR_RUN_STOPWATCH_NAME,\n>                                     time_msec());\n> diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at\n> index c98de9bc4..1d0c02290 100644\n> --- a/tests/ovn-controller.at\n> +++ b/tests/ovn-controller.at\n> @@ -3944,3 +3944,67 @@ 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 ovn-controller not monitoring all\n> +# tables in the southbound db it 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> +])","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=axQbphWr;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::136; helo=smtp3.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp3.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=axQbphWr","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=axQbphWr"],"Received":["from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136])\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 4fhKvH5vXnz1y1x\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 26 Mar 2026 21:36:27 +1100 (AEDT)","from localhost (localhost [127.0.0.1])\n\tby smtp3.osuosl.org (Postfix) with ESMTP id AA10260B02;\n\tThu, 26 Mar 2026 10:36:25 +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 WigpnLkJdUjH; Thu, 26 Mar 2026 10:36:23 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org\n [IPv6:2605:bc80:3010:104::8cd3:938])\n\tby smtp3.osuosl.org (Postfix) with ESMTPS id BAF9560AFE;\n\tThu, 26 Mar 2026 10:36:23 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id 94DC0C04E8;\n\tThu, 26 Mar 2026 10:36:23 +0000 (UTC)","from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 0428DC04E7\n for <dev@openvswitch.org>; Thu, 26 Mar 2026 10:36:22 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp4.osuosl.org (Postfix) with ESMTP id E6B8340AD9\n for <dev@openvswitch.org>; Thu, 26 Mar 2026 10:36:21 +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 S3HbPf5CtQor for <dev@openvswitch.org>;\n Thu, 26 Mar 2026 10:36:20 +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 8A3EB40AD6\n for <dev@openvswitch.org>; Thu, 26 Mar 2026 10:36:19 +0000 (UTC)","from mail-ed1-f69.google.com (mail-ed1-f69.google.com\n [209.85.208.69]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-507-g09tvXgGOdCTLC5F91pAtw-1; Thu, 26 Mar 2026 06:36:17 -0400","by mail-ed1-f69.google.com with SMTP id\n 4fb4d7f45d1cf-66a395904e9so662586a12.3\n for <dev@openvswitch.org>; Thu, 26 Mar 2026 03:36:16 -0700 (PDT)","from ?IPV6:2001:1c05:1417:d800:424b:bbb2:21aa:9c21?\n (2001-1c05-1417-d800-424b-bbb2-21aa-9c21.cable.dynamic.v6.ziggo.nl.\n [2001:1c05:1417:d800:424b:bbb2:21aa:9c21])\n by smtp.gmail.com with ESMTPSA id\n 4fb4d7f45d1cf-66ad6752daesm835910a12.19.2026.03.26.03.36.14\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Thu, 26 Mar 2026 03:36:14 -0700 (PDT)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections -\n client-ip=2605:bc80:3010:104::8cd3:938; helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp3.osuosl.org BAF9560AFE","OpenDKIM Filter v2.11.0 smtp4.osuosl.org 8A3EB40AD6"],"Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=170.10.129.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=dceara@redhat.com;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp4.osuosl.org 8A3EB40AD6","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1774521378;\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=gNM7Jqj3P6WM0TR4IKGgwYbOqPTITLJt669aP4ENSiU=;\n b=axQbphWr2Nk6bpaJ5LampBs6RJ9Z2etv/oxWCm2tVKFWw39VBWJWy2iZY/jZEd59v6kOIu\n P9hGS+l/KdPJuPvZ3PA10nWTludoveOf0OizWy/61RQLgvhrL/6t95lstcy5SFjpNsIfaN\n LIYx87Gp6i0RJUMA2c9x91VHCqhj1T4=","X-MC-Unique":"g09tvXgGOdCTLC5F91pAtw-1","X-Mimecast-MFC-AGG-ID":"g09tvXgGOdCTLC5F91pAtw_1774521376","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774521376; x=1775126176;\n h=content-transfer-encoding:in-reply-to:from:content-language\n :references:to:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=gNM7Jqj3P6WM0TR4IKGgwYbOqPTITLJt669aP4ENSiU=;\n b=R6okZc/Z3SQYku71xRQ2+hGVrZHeNDhZxWdXohEwApfLKIIIYRTjKuN9uUGnB75acI\n xhwmH09A8ilLSJJKPcUXv9RFl1rrbP/wcvk8AiWaAB8c2S3KMyo4Dkf4yrRdp7YNKDlM\n ZNczRzHt7CFDqdX2BQv9Fq7OPVXORGq9KTlCl89+WEK+Qlkl0Sc4KqynX+w8nlBdIlc3\n GduVGiDWKSU+X8pNXoiKxs8JNiUt/jL1WZWqr1lm6EMth/gbg7/P7AK+B7jDptGJHSKg\n 6mA2alCRfaKJHqhkjEa+krTW93P4OsGOT9VqJF1ODVFQeW3a2Gf7ypWRlx0bQkDKxvdW\n Vg+A==","X-Forwarded-Encrypted":"i=1;\n AJvYcCWWzXtfDrdOhBkSWVAx7fJqmQ23UOovQ/hjXZTEXWvSeHoQx9+7164/RIEEpvypXj0Og7A=@openvswitch.org","X-Gm-Message-State":"AOJu0YxFLZKzpN15AFHRjvHAn4cy6JJS2DgJZX2Q6MHldiZxskjD7Tyb\n xgr77nZxsYOBD73qhHa/i7F7sRVUfeuvFHOixzdk+6sGVmfmGQQBSFXS7oqQ6nJL77oSBLgPO3F\n 7D+8PPwBxLyMy/F/NAWQLo/qqrvTKIz5mxjJgjgzAa3LbR29NpI3EIu58VQ/eLA==","X-Gm-Gg":"ATEYQzyA2QRqAHDF0K6cbkI2mbSTSbfCCsl4/7XsAWer9vSSBRYaF82WADcCvcf1I+B\n QLjcr1CFkf6YgBT9Un1p2R2Y3MNz2Jm+Z3C+UHh8D3nG3l4wFEpP0I2fTMwcEyB1uWl4x6tprtJ\n uHXsPqyL+NXoC4uvWDTnsHtOA8kfRKPTlOGRK+4KWTvL/S4zOJQsSJqKP8ZCrsAp/rfkIbO5en3\n WdH8Dv7GaaNVQOI2pluAxbampjZvn38cexHgZY4c6M3GFIXaZGTplVpQesaiXY5suS4evOXKdWp\n EuPs4/oom3bRRZfk1TZ1+95n/1FOo5ZAWkZr8k4ym7YLlIA8+f/xBd/pvGMvAU0rg8nz3Spq63Q\n FxKKf8ts2nuAgQy00n9BXVUd1Ur4mXSyqnsh6+23DM7TfgW8IZ5A0S9ljMNz4OgysimzjwL2iNt\n Be73vlxh8mGV+sdZkp8UBCmL6jS2O96qdeE00FHTB6d09JOQv/lAP7xdaDPFl6tQuvc8J7FRPl","X-Received":["by 2002:a05:6402:34cf:b0:66a:16ed:46cb with SMTP id\n 4fb4d7f45d1cf-66a826e284fmr4512811a12.26.1774521375537;\n Thu, 26 Mar 2026 03:36:15 -0700 (PDT)","by 2002:a05:6402:34cf:b0:66a:16ed:46cb with SMTP id\n 4fb4d7f45d1cf-66a826e284fmr4512792a12.26.1774521374997;\n Thu, 26 Mar 2026 03:36:14 -0700 (PDT)"],"Message-ID":"<46e1e7ff-281a-4eff-a2fe-3d0a6b97a5b5@redhat.com>","Date":"Thu, 26 Mar 2026 11:36:13 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","To":"Jacob Tanenbaum <jtanenba@redhat.com>, dev@openvswitch.org","References":"<20260325162250.2832324-1-jtanenba@redhat.com>","In-Reply-To":"<20260325162250.2832324-1-jtanenba@redhat.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"DM5pO2Llue07pIp2sTewI38J5NT4aeqyvc4a40E1Wk4_1774521376","X-Mimecast-Originator":"redhat.com","Content-Language":"en-US","Subject":"Re: [ovs-dev] [Patch ovn v2] 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":"Dumitru Ceara via dev <ovs-dev@openvswitch.org>","Reply-To":"Dumitru Ceara <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>"}},{"id":3669869,"web_url":"http://patchwork.ozlabs.org/comment/3669869/","msgid":"<CACDpfc48aX7cd1Z60WpGVH7thaoUWZJ6=8Le0KxoPYhsHMv7=g@mail.gmail.com>","list_archive_url":null,"date":"2026-03-26T17:45:29","subject":"Re: [ovs-dev] [Patch ovn v2] ovn-controller: Port up/ovn-installed\n reported too early.","submitter":{"id":88238,"url":"http://patchwork.ozlabs.org/api/people/88238/","name":"Jacob Tanenbaum","email":"jtanenba@redhat.com"},"content":"Sorry I looked at it, and added a check to solve one potential  problem\nbetween v1 and v2 and caused another without running all the tests. Sorry\nfor not rerunning the tests.\n\nJacob\n\nOn Thu, Mar 26, 2026 at 6:36 AM Dumitru Ceara <dceara@redhat.com> wrote:\n\n> On 3/25/26 5:22 PM, Jacob Tanenbaum via dev wrote:\n> > when ovn-monitor-all is set to false the ovn-controller sets\n> > ovn-installed on OVS interfaces too early. ovn-controller needs to wait\n> > for the response from the southbound database with the updates to the\n> > newly monitored southbound fields and after that wait for flows to be\n> > installed in OVS before labeling as installed.\n> >\n> > Reported-at: https://redhat.atlassian.net/browse/FDP-2887\n> > Signed-off-by: Jacob Tanenbaum <jtanenba@redhat.com>\n> > ---\n>\n> Hi Jacob,\n>\n> Thanks for the patch.  I didn't review it but it seems it causes quite a\n> few CI failures:\n>\n> https://github.com/ovsrobot/ovn/actions/runs/23552721612\n>\n> Could you please look into it and post a v3?\n>\n> Thanks,\n> Dumitru\n>\n> > v1->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\n> >\n> > diff --git a/controller/if-status.c b/controller/if-status.c\n> > index ee9337e63..d3383253b 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> > @@ -590,12 +591,17 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n> >          }\n> >      }\n> >\n> > +    bool update_seqno = false;\n> >      /* Update pb->chassis in case it's not set (previous update still\n> in fly\n> >       * or pb->chassis was overwitten by another chassis.\n> >       */\n> >      if (!sb_readonly) {\n> >          HMAPX_FOR_EACH_SAFE (node,\n> &mgr->ifaces_per_state[OIF_INSTALL_FLOWS]) {\n> >              struct ovs_iface *iface = node->data;\n> > +            if (iface->is_vif) {\n> > +                iface->install_seqno = mgr->iface_seqno + 1;\n> > +                update_seqno = true;\n> > +            }\n> >              if (!local_bindings_pb_chassis_is_set(bindings, iface->id,\n> >                  chassis_rec)) {\n> >                  long long int now = time_msec();\n> > @@ -614,7 +620,6 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n> >\n> >      /* Move newly claimed interfaces from OIF_CLAIMED to\n> 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> {\n> >              struct ovs_iface *iface = node->data;\n> > @@ -624,7 +629,7 @@ if_status_mgr_update(struct if_status_mgr *mgr,\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> > +                update_seqno = true;\n> >              } else {\n> >                  ovs_iface_set_state(mgr, iface, OIF_MARK_UP);\n> >              }\n> > @@ -659,7 +664,7 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n> >       * Request a seqno update when the flows for new interfaces have\n> been\n> >       * 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);\n> > @@ -694,6 +699,8 @@ if_status_mgr_run(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> > +                  unsigned int ovnsb_cond_seqno,\n> >                    bool sb_readonly, bool ovs_readonly)\n> >  {\n> >      struct ofctrl_acked_seqnos *acked_seqnos =\n> > @@ -703,10 +710,27 @@ if_status_mgr_run(struct if_status_mgr *mgr,\n> >      /* Move interfaces from state OIF_INSTALL_FLOWS to OIF_MARK_UP if a\n> >       * notification has been received aabout their flows being installed\n> >       * in OVS.\n> > +     *\n> > +     * In the ovn-monitor-all=false case it is possible that we have not\n> > +     * received the update that the southbound database is monitoring a\n> new\n> > +     *  datapath. Check for the update before continuing.\n> >       */\n> >      HMAPX_FOR_EACH_SAFE (node,\n> &mgr->ifaces_per_state[OIF_INSTALL_FLOWS]) {\n> >          struct ovs_iface *iface = node->data;\n> >\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->monitor_updated &&\n> > +                ld->expected_cond_seqno != ovnsb_cond_seqno) {\n> > +                continue;\n> > +            }\n> > +            ld->monitor_updated = true;\n> > +        }\n> >          if (!ofctrl_acked_seqnos_contains(acked_seqnos,\n> >                                            iface->install_seqno)) {\n> >              continue;\n> > diff --git a/controller/if-status.h b/controller/if-status.h\n> > index d15ca3008..a877ebe2b 100644\n> > --- a/controller/if-status.h\n> > +++ b/controller/if-status.h\n> > @@ -49,6 +49,8 @@ void if_status_mgr_run(struct if_status_mgr *mgr,\n> struct local_binding_data *,\n> >                         const struct sbrec_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 sb_readonly, bool ovs_readonly);\n> >  void if_status_mgr_get_memory_usage(struct if_status_mgr *mgr,\n> >                                      struct simap *usage);\n> > diff --git a/controller/local_data.h b/controller/local_data.h\n> > index 948c1a935..51dcca416 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 udpated for this\n> 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(\n> > diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c\n> > index 4161fe2b3..89efb5e49 100644\n> > --- a/controller/ovn-controller.c\n> > +++ b/controller/ovn-controller.c\n> > @@ -443,6 +443,15 @@ out:;\n> >          expected_cond_seqno = MAX(expected_cond_seqno, cond_seqnos[i]);\n> >      }\n> >\n> > +    if (!monitor_all && local_datapaths) {\n> > +        struct local_datapath *ld;\n> > +        HMAP_FOR_EACH (ld, hmap_node, local_datapaths) {\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> > @@ -7903,6 +7912,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> > +\n> &runtime_data->local_datapaths\n> > +                                            : NULL,\n> > +                                      ovnsb_cond_seqno,\n> >                                        !ovnsb_idl_txn, !ovs_idl_txn);\n> >                      stopwatch_stop(IF_STATUS_MGR_RUN_STOPWATCH_NAME,\n> >                                     time_msec());\n> > diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at\n> > index c98de9bc4..1d0c02290 100644\n> > --- a/tests/ovn-controller.at\n> > +++ b/tests/ovn-controller.at\n> > @@ -3944,3 +3944,67 @@ 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\n> 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\n> name=vif1)\n> > +    echo \"vif1 port=$ofport\"\n> > +    test -n \"$ofport\" && test 1 -le $(as hv1 ovs-ofctl dump-flows\n> 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\n> external_ids:ovn-installed)\n> > +    flow_count=$(as hv1 ovs-ofctl dump-flows br-int | grep -Fc\n> \"10.0.0.1\")\n> > +    # for the monitor-all=true case the flow gets installed because\n> 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\n> > +# tables in the southbound db it should be able to install the\n> interface.\n> > +OVS_WAIT_UNTIL([\n> > +    ovn_installed=$(as hv1 ovs-vsctl get Interface vif1\n> external_ids:ovn-installed)\n> > +    flow_count=$(as hv1 ovs-ofctl dump-flows br-int | grep -Fc\n> \"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>\n>","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=ITK/0ZVQ;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::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=ITK/0ZVQ","smtp2.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com"],"Received":["from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::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 4fhWQv0WShz1y1x\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 04:45:58 +1100 (AEDT)","from localhost (localhost [127.0.0.1])\n\tby smtp2.osuosl.org (Postfix) with ESMTP id 19DB34060F;\n\tThu, 26 Mar 2026 17:45:57 +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 o8UBsqNHwGAM; Thu, 26 Mar 2026 17:45:56 +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 040CC4058B;\n\tThu, 26 Mar 2026 17:45:56 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id DDAC8C04E8;\n\tThu, 26 Mar 2026 17:45:55 +0000 (UTC)","from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 611FDC04E7\n for <dev@openvswitch.org>; Thu, 26 Mar 2026 17:45:54 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp2.osuosl.org (Postfix) with ESMTP id 5EE02405E3\n for <dev@openvswitch.org>; Thu, 26 Mar 2026 17:45:54 +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 R0sqtSFfhfaB for <dev@openvswitch.org>;\n Thu, 26 Mar 2026 17:45:53 +0000 (UTC)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by smtp2.osuosl.org (Postfix) with ESMTPS id CD59F4058B\n for <dev@openvswitch.org>; Thu, 26 Mar 2026 17:45:52 +0000 (UTC)","from mail-yx1-f70.google.com (mail-yx1-f70.google.com\n [74.125.224.70]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-502-9hwI7zV1NjipRqGmD85Tzg-1; Thu, 26 Mar 2026 13:45:43 -0400","by mail-yx1-f70.google.com with SMTP id\n 956f58d0204a3-649df163c11so2341482d50.1\n for <dev@openvswitch.org>; Thu, 26 Mar 2026 10:45:43 -0700 (PDT)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections -\n client-ip=2605:bc80:3010:104::8cd3:938; helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp2.osuosl.org 040CC4058B","OpenDKIM Filter v2.11.0 smtp2.osuosl.org CD59F4058B"],"Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=170.10.133.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=jtanenba@redhat.com;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp2.osuosl.org CD59F4058B","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1774547151;\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 in-reply-to:in-reply-to:references:references;\n bh=Ge75tL+HA6X/ynd0MJa1i0TuEN8KvJcwvA43JAbwggs=;\n b=ITK/0ZVQ5WG/X93MBQnFAiN+6qHvfeWC6i5nrlsjxoSzcLS+97+cWLIzcLF9hz/0tWiaXX\n bkkzIQOuIdbTexv95yDlNFzBZIbG2M+w6Sl1VspplLmkz9QnnqqbQWD+K0VUfepFRw5ny9\n +dKqzgw4OlqfZ2YuOABXL6o4xPKoB3E=","X-MC-Unique":"9hwI7zV1NjipRqGmD85Tzg-1","X-Mimecast-MFC-AGG-ID":"9hwI7zV1NjipRqGmD85Tzg_1774547143","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774547143; x=1775151943;\n h=cc:to:subject:message-id:date:from:in-reply-to:references\n :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=Ge75tL+HA6X/ynd0MJa1i0TuEN8KvJcwvA43JAbwggs=;\n b=cqpSPkMt5bSUYL4sbK4rTnLclqkA81L5Vhuz76nbfATYa9cWjaJp23i5cxxpPj2sRN\n A/XpY38zYqdTHlAhNwLK2GQ+z+d3ACgRCB8NPgxbmo4eqCteG6g8UgkFDBd0QyxCmigi\n Zc9SxaAUvfEBwEd9JN6oKCDSXiX6psK/efNtL2dMHNwwMQ6j3Hu9zhyvnu+he6xZ5wxv\n xGwX+VQq77s/8v/IExiquYU/w305c6qsgTaM/N36qBiLV5YfWf6kT7gu0uKoEhzEjvr0\n AJ5c4fTQbAmdc3mo5gjRoU3xs0HXpIcC6XDhhyCogLipcmMa7ZC9w+FFaM/WIxXwj+sa\n gclg==","X-Gm-Message-State":"AOJu0YzXBLzAP5qXBzIBPFV77EHQGq+rdWDWMyENHmJnCnhQntPn+B+H\n oyIDiTWtJbGTxwcI3KTkTBr9sa9rfe/XdBH3kOhbiJjjcydqwQPRr8/Ur/rT9RuJ3oNmEY86AMI\n piXIHw08mh0oJMKO1UtkT9xpdmVweu2ss9rUkU4c0ljswvsQTztNb4bEx8DJGKWRhyH9i1nHmKi\n HixP3MWdPbweFhv62AUxMJrbch5U0b","X-Gm-Gg":"ATEYQzxuR/YfrJBoGs6XxVyKKpEfsvmH0PXtS6iWTdjKYudRVWOL+3oA4/yHelJmDIE\n zN99dVaS6nkCSPfFo9tQ+AgQtN5HucnuEoJ8JFrACPLiooPWxghpuATVBo5bxuODYfKsniQ0R5i\n ExBqh5wZigYzuwJoVGUKum4VFIap+2JLlG2FfZzM0/QBzlQD+dkyKvvLsU3vMHiKhWqaa3Otyi5\n +QECXJ3MvsJcOVF0gU86q6AEm3adVt07pZPSfw=","X-Received":["by 2002:a05:690e:4187:b0:64e:efc7:b1b6 with SMTP id\n 956f58d0204a3-64eefc7bc8cmr5549500d50.36.1774547142727;\n Thu, 26 Mar 2026 10:45:42 -0700 (PDT)","by 2002:a05:690e:4187:b0:64e:efc7:b1b6 with SMTP id\n 956f58d0204a3-64eefc7bc8cmr5549465d50.36.1774547142113; Thu, 26 Mar 2026\n 10:45:42 -0700 (PDT)"],"MIME-Version":"1.0","References":"<20260325162250.2832324-1-jtanenba@redhat.com>\n <46e1e7ff-281a-4eff-a2fe-3d0a6b97a5b5@redhat.com>","In-Reply-To":"<46e1e7ff-281a-4eff-a2fe-3d0a6b97a5b5@redhat.com>","Date":"Thu, 26 Mar 2026 13:45:29 -0400","X-Gm-Features":"AQROBzCacunMiwKSk7CXOC91_359g9R7QAjDHiPXK6HVM7pv8uzAca6py0r1FGE","Message-ID":"\n <CACDpfc48aX7cd1Z60WpGVH7thaoUWZJ6=8Le0KxoPYhsHMv7=g@mail.gmail.com>","To":"Dumitru Ceara <dceara@redhat.com>","Cc":"dev@openvswitch.org","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"1od4Ee7A8vRJOAcua8j_lAVRPTy-Jkwfpd4pTVGZzKc_1774547143","X-Mimecast-Originator":"redhat.com","X-Content-Filtered-By":"Mailman/MimeDel 2.1.30","Subject":"Re: [ovs-dev] [Patch ovn v2] 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>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"ovs-dev-bounces@openvswitch.org","Sender":"\"dev\" <ovs-dev-bounces@openvswitch.org>"}},{"id":3670165,"web_url":"http://patchwork.ozlabs.org/comment/3670165/","msgid":"<7568f930-ff9f-4c0d-ab36-7b8e06f9fd2a@redhat.com>","list_archive_url":null,"date":"2026-03-27T09:40:13","subject":"Re: [ovs-dev] [Patch ovn v2] ovn-controller: Port up/ovn-installed\n reported too early.","submitter":{"id":76591,"url":"http://patchwork.ozlabs.org/api/people/76591/","name":"Dumitru Ceara","email":"dceara@redhat.com"},"content":"Hi Jacob,\n\nOn 3/26/26 6:45 PM, Jacob Tanenbaum wrote:\n> Sorry I looked at it, and added a check to solve one potential  problem\n> between v1 and v2 and caused another without running all the tests. Sorry\n> for not rerunning the tests.\n> \n\nNo worries, it can happen, that's why we have CI. :)\n\nRegards,\nDumitru\n\n> Jacob\n> \n> On Thu, Mar 26, 2026 at 6:36 AM Dumitru Ceara <dceara@redhat.com> wrote:\n> \n>> On 3/25/26 5:22 PM, Jacob Tanenbaum via dev wrote:\n>>> when ovn-monitor-all is set to false the ovn-controller sets\n>>> ovn-installed on OVS interfaces too early. ovn-controller needs to wait\n>>> for the response from the southbound database with the updates to the\n>>> newly monitored southbound fields and after that wait for flows to be\n>>> installed in OVS before labeling as installed.\n>>>\n>>> Reported-at: https://redhat.atlassian.net/browse/FDP-2887\n>>> Signed-off-by: Jacob Tanenbaum <jtanenba@redhat.com>\n>>> ---\n>>\n>> Hi Jacob,\n>>\n>> Thanks for the patch.  I didn't review it but it seems it causes quite a\n>> few CI failures:\n>>\n>> https://github.com/ovsrobot/ovn/actions/runs/23552721612\n>>\n>> Could you please look into it and post a v3?\n>>\n>> Thanks,\n>> Dumitru\n>>\n>>> v1->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\n>>>\n>>> diff --git a/controller/if-status.c b/controller/if-status.c\n>>> index ee9337e63..d3383253b 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>>> @@ -590,12 +591,17 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n>>>          }\n>>>      }\n>>>\n>>> +    bool update_seqno = false;\n>>>      /* Update pb->chassis in case it's not set (previous update still\n>> in fly\n>>>       * or pb->chassis was overwitten by another chassis.\n>>>       */\n>>>      if (!sb_readonly) {\n>>>          HMAPX_FOR_EACH_SAFE (node,\n>> &mgr->ifaces_per_state[OIF_INSTALL_FLOWS]) {\n>>>              struct ovs_iface *iface = node->data;\n>>> +            if (iface->is_vif) {\n>>> +                iface->install_seqno = mgr->iface_seqno + 1;\n>>> +                update_seqno = true;\n>>> +            }\n>>>              if (!local_bindings_pb_chassis_is_set(bindings, iface->id,\n>>>                  chassis_rec)) {\n>>>                  long long int now = time_msec();\n>>> @@ -614,7 +620,6 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n>>>\n>>>      /* Move newly claimed interfaces from OIF_CLAIMED to\n>> 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>> {\n>>>              struct ovs_iface *iface = node->data;\n>>> @@ -624,7 +629,7 @@ if_status_mgr_update(struct if_status_mgr *mgr,\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>>> +                update_seqno = true;\n>>>              } else {\n>>>                  ovs_iface_set_state(mgr, iface, OIF_MARK_UP);\n>>>              }\n>>> @@ -659,7 +664,7 @@ if_status_mgr_update(struct if_status_mgr *mgr,\n>>>       * Request a seqno update when the flows for new interfaces have\n>> been\n>>>       * 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);\n>>> @@ -694,6 +699,8 @@ if_status_mgr_run(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>>> +                  unsigned int ovnsb_cond_seqno,\n>>>                    bool sb_readonly, bool ovs_readonly)\n>>>  {\n>>>      struct ofctrl_acked_seqnos *acked_seqnos =\n>>> @@ -703,10 +710,27 @@ if_status_mgr_run(struct if_status_mgr *mgr,\n>>>      /* Move interfaces from state OIF_INSTALL_FLOWS to OIF_MARK_UP if a\n>>>       * notification has been received aabout their flows being installed\n>>>       * in OVS.\n>>> +     *\n>>> +     * In the ovn-monitor-all=false case it is possible that we have not\n>>> +     * received the update that the southbound database is monitoring a\n>> new\n>>> +     *  datapath. Check for the update before continuing.\n>>>       */\n>>>      HMAPX_FOR_EACH_SAFE (node,\n>> &mgr->ifaces_per_state[OIF_INSTALL_FLOWS]) {\n>>>          struct ovs_iface *iface = node->data;\n>>>\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->monitor_updated &&\n>>> +                ld->expected_cond_seqno != ovnsb_cond_seqno) {\n>>> +                continue;\n>>> +            }\n>>> +            ld->monitor_updated = true;\n>>> +        }\n>>>          if (!ofctrl_acked_seqnos_contains(acked_seqnos,\n>>>                                            iface->install_seqno)) {\n>>>              continue;\n>>> diff --git a/controller/if-status.h b/controller/if-status.h\n>>> index d15ca3008..a877ebe2b 100644\n>>> --- a/controller/if-status.h\n>>> +++ b/controller/if-status.h\n>>> @@ -49,6 +49,8 @@ void if_status_mgr_run(struct if_status_mgr *mgr,\n>> struct local_binding_data *,\n>>>                         const struct sbrec_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 sb_readonly, bool ovs_readonly);\n>>>  void if_status_mgr_get_memory_usage(struct if_status_mgr *mgr,\n>>>                                      struct simap *usage);\n>>> diff --git a/controller/local_data.h b/controller/local_data.h\n>>> index 948c1a935..51dcca416 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 udpated for this\n>> 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(\n>>> diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c\n>>> index 4161fe2b3..89efb5e49 100644\n>>> --- a/controller/ovn-controller.c\n>>> +++ b/controller/ovn-controller.c\n>>> @@ -443,6 +443,15 @@ out:;\n>>>          expected_cond_seqno = MAX(expected_cond_seqno, cond_seqnos[i]);\n>>>      }\n>>>\n>>> +    if (!monitor_all && local_datapaths) {\n>>> +        struct local_datapath *ld;\n>>> +        HMAP_FOR_EACH (ld, hmap_node, local_datapaths) {\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>>> @@ -7903,6 +7912,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>>> +\n>> &runtime_data->local_datapaths\n>>> +                                            : NULL,\n>>> +                                      ovnsb_cond_seqno,\n>>>                                        !ovnsb_idl_txn, !ovs_idl_txn);\n>>>                      stopwatch_stop(IF_STATUS_MGR_RUN_STOPWATCH_NAME,\n>>>                                     time_msec());\n>>> diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at\n>>> index c98de9bc4..1d0c02290 100644\n>>> --- a/tests/ovn-controller.at\n>>> +++ b/tests/ovn-controller.at\n>>> @@ -3944,3 +3944,67 @@ 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\n>> 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\n>> name=vif1)\n>>> +    echo \"vif1 port=$ofport\"\n>>> +    test -n \"$ofport\" && test 1 -le $(as hv1 ovs-ofctl dump-flows\n>> 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\n>> external_ids:ovn-installed)\n>>> +    flow_count=$(as hv1 ovs-ofctl dump-flows br-int | grep -Fc\n>> \"10.0.0.1\")\n>>> +    # for the monitor-all=true case the flow gets installed because\n>> 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\n>>> +# tables in the southbound db it should be able to install the\n>> interface.\n>>> +OVS_WAIT_UNTIL([\n>>> +    ovn_installed=$(as hv1 ovs-vsctl get Interface vif1\n>> external_ids:ovn-installed)\n>>> +    flow_count=$(as hv1 ovs-ofctl dump-flows br-int | grep -Fc\n>> \"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>>\n>>\n>","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=QqQhkgGd;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::138; helo=smtp1.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp1.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key)\n header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=QqQhkgGd","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=QqQhkgGd"],"Received":["from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fhwc96VlSz1y1j\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 20:40:25 +1100 (AEDT)","from localhost (localhost [127.0.0.1])\n\tby smtp1.osuosl.org (Postfix) with ESMTP id 339BE8267F;\n\tFri, 27 Mar 2026 09:40:24 +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 NAx0qxMGh79d; Fri, 27 Mar 2026 09:40:23 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56])\n\tby smtp1.osuosl.org (Postfix) with ESMTPS id 12DDB8098C;\n\tFri, 27 Mar 2026 09:40:23 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id CBFABC04E8;\n\tFri, 27 Mar 2026 09:40:22 +0000 (UTC)","from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 7C394C04E7\n for <dev@openvswitch.org>; Fri, 27 Mar 2026 09:40:21 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp4.osuosl.org (Postfix) with ESMTP id 5F6EE4056A\n for <dev@openvswitch.org>; Fri, 27 Mar 2026 09:40:21 +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 p5BRe-t5nRy9 for <dev@openvswitch.org>;\n Fri, 27 Mar 2026 09:40:20 +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 1600340562\n for <dev@openvswitch.org>; Fri, 27 Mar 2026 09:40:19 +0000 (UTC)","from mail-ed1-f71.google.com (mail-ed1-f71.google.com\n [209.85.208.71]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-553-V3SRYq7gMmyUq88eBO11ew-1; Fri, 27 Mar 2026 05:40:17 -0400","by mail-ed1-f71.google.com with SMTP id\n 4fb4d7f45d1cf-66aab34ff9cso2329445a12.0\n for <dev@openvswitch.org>; Fri, 27 Mar 2026 02:40:16 -0700 (PDT)","from ?IPV6:2001:1c05:1417:d800:424b:bbb2:21aa:9c21?\n (2001-1c05-1417-d800-424b-bbb2-21aa-9c21.cable.dynamic.v6.ziggo.nl.\n [2001:1c05:1417:d800:424b:bbb2:21aa:9c21])\n by smtp.gmail.com with ESMTPSA id\n 4fb4d7f45d1cf-66ad6a58cb0sm1952591a12.25.2026.03.27.02.40.13\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Fri, 27 Mar 2026 02:40:13 -0700 (PDT)"],"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 smtp1.osuosl.org 12DDB8098C","OpenDKIM Filter v2.11.0 smtp4.osuosl.org 1600340562"],"Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=170.10.129.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=dceara@redhat.com;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp4.osuosl.org 1600340562","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1774604418;\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 in-reply-to:in-reply-to:references:references;\n bh=NdYlnbuX3J2H0vDsmMhCoSjXYvjOJW+ozI7uEJYvwUk=;\n b=QqQhkgGdgdrCdpJncyBlQSvrHGZfILmA4+dd1FY8j+DTNZYNuXEei7bJkC0pahuVBjgkDH\n gOZu4RzQXExbZIsW/0/AWo1vhXxBhY2gMEVVoDS2wnx/lhsYQ6Ot4NSdfvXpCV0TdRx+BN\n 6DgqjKRHTq/rWmhAsAlqwuk3ScHMYfA=","X-MC-Unique":"V3SRYq7gMmyUq88eBO11ew-1","X-Mimecast-MFC-AGG-ID":"V3SRYq7gMmyUq88eBO11ew_1774604416","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1774604415; x=1775209215;\n h=content-transfer-encoding:in-reply-to:content-language:from\n :references:cc:to:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=NdYlnbuX3J2H0vDsmMhCoSjXYvjOJW+ozI7uEJYvwUk=;\n b=YtJZdFN/s3pDs4Z2kXjcBJp2p2vPBTMS7A7SLD5v8J2vf0zE5qNG1w+E8iXDg7V5Io\n lLg1G24wzCAFp5epcWVAXH1oZJzgl+Z6DAeqU32Xuta6K0aHonHInhl9x/3Bz+qyBe6A\n PufNs3klaorBgAZ4HEh8c/LdOgKURtgdQPrALoHzWAw7BB5Qwbb0SF8F1I3XmW8ntPc3\n Ybb6p59FpfHTnimTHHXj9AjWld6T/Q5t2KplxFbePtq0YA+62WOWFBx5TNWOo95+wF/l\n ugPjKsYle5tJXaMthYT9iVnfAdiQWrepbK4tcV6fNvnGIRzxTSa4ypcQjJspINp8CYtx\n aiGw==","X-Gm-Message-State":"AOJu0Yz4jylwRRMP9AkUba2ZPjgV0Nmcy/c4GIhfUEoOOGyaeFIza1Rh\n Ap+t0nYKMyso5lbYtTvUS9RWFhpV2nDO2cp5l2RfL/pfIOeyh6zdqWENt7dkkSFkOYpDFIxZZTI\n 0gXZYAO3OUciG7LxemPWRNTRGE2mO6AEL1GY4i5xOqe2J5+UbgX3rm6dZvkIZ0A==","X-Gm-Gg":"ATEYQzzPWZSxqUjQa4IyhP6/p+/vGhzoCc2gBqjENGQQVEJoyD35FqVPraDWBYVRP9f\n RKxFcX62c7EMRUdop5UyXUSvlTsLW5yql1D9io2G+6pM8hTqQoXjmODT7gORJBAazg7kkkmveaO\n pRbXMwCEyAQNFC1yP4Z7l14GToznY5un419BunOHYflkI35+CNyz9aX9hFgautlSyYQCByt27/0\n Qjop46J+IEUD3FKrBd5OMTegk1lkL5KQuReCIEZg3fDwOiEVMDMIxqPzf4bpN+u8HoLyvPt9n42\n Jh4xXa+o5sZzSkqnJ80IrA+mgqeoD/02j/WeAOSFX5o9lLdV2l7KkUE791NynV8EMPEc+ILOJfG\n BdMMxgYimqwMFymEwTVlvEjqRBkS1nrvWDEXBkrrw583qGdBDRfsBqee3+xuCPNlvjCr7N+7wR/\n IdXhp4XM7c0SAMSOH6gidSN9RU+tO1kQ1VIeQvHoBUTlb8DSYFwEeFOSwewnKlTny1gJ442Zmv","X-Received":["by 2002:a05:6402:5385:b0:662:bd98:890a with SMTP id\n 4fb4d7f45d1cf-66b28f7d930mr1107866a12.25.1774604415039;\n Fri, 27 Mar 2026 02:40:15 -0700 (PDT)","by 2002:a05:6402:5385:b0:662:bd98:890a with SMTP id\n 4fb4d7f45d1cf-66b28f7d930mr1107845a12.25.1774604414437;\n Fri, 27 Mar 2026 02:40:14 -0700 (PDT)"],"Message-ID":"<7568f930-ff9f-4c0d-ab36-7b8e06f9fd2a@redhat.com>","Date":"Fri, 27 Mar 2026 10:40:13 +0100","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","To":"Jacob Tanenbaum <jtanenba@redhat.com>","Cc":"dev@openvswitch.org","References":"<20260325162250.2832324-1-jtanenba@redhat.com>\n <46e1e7ff-281a-4eff-a2fe-3d0a6b97a5b5@redhat.com>\n <CACDpfc48aX7cd1Z60WpGVH7thaoUWZJ6=8Le0KxoPYhsHMv7=g@mail.gmail.com>","In-Reply-To":"\n <CACDpfc48aX7cd1Z60WpGVH7thaoUWZJ6=8Le0KxoPYhsHMv7=g@mail.gmail.com>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"o-V1huOgguz7Vbpk0j-GmJNwe5u1Exjsr3a4_UcWrwU_1774604416","X-Mimecast-Originator":"redhat.com","Content-Language":"en-US","Subject":"Re: [ovs-dev] [Patch ovn v2] 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":"Dumitru Ceara via dev <ovs-dev@openvswitch.org>","Reply-To":"Dumitru Ceara <dceara@redhat.com>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"ovs-dev-bounces@openvswitch.org","Sender":"\"dev\" <ovs-dev-bounces@openvswitch.org>"}}]