On 6/6/25 5:48 PM, Aleksandr Smirnov wrote:
> Remove wait-before-clear option because lflow upload
> is delayed with that fix
> 'controller: Delay initial flow upload to OVS.'
> 
> Signed-off-by: Aleksandr Smirnov <alekssmirnov@k2.cloud>
> Acked-by: Numan Siddique <num...@ovn.org>
> ---

Hi Aleksandr,

> v3: Call daemon_started_recently() to detect
>     load completion.
> v2: Addressed Numan's comments.
> ---
>  NEWS                            |   3 +
>  controller/ofctrl.c             |  34 +---------
>  controller/ovn-controller.8.xml |  34 ----------
>  tests/ovn-controller.at         | 106 --------------------------------
>  4 files changed, 4 insertions(+), 173 deletions(-)
> 
> diff --git a/NEWS b/NEWS
> index 4d84a456a..34f85a598 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -26,6 +26,9 @@ Post v25.03.0
>     - Add a new logical switch option - enable-stateless-acl-lb with default
>       value of false. This option should be set to true for logical switches
>       with stateless ACL to work with load balancer.
> +   - An ovn-controller option wait-before-clear is no longer supported.

Nit: s/An ovn-controller option/The ovn-controller option/

I guess we should use the actual option name here.

> +     It will be ignored if used. An ovn-controller will automatically care
> +     about proper delay before clearing lflow.
>  

In general, I guess I'd rephrase this as follows:

   - The ovn-controller option ovn-ofctrl-wait-before-clear is no longer
     supported.  It will be ignored if used. ovn-controller will
     automatically care about proper delay before clearing lflow.

Both comments above are minor and can be addressed when merging the
patches so we probably don't need a v4.  Similar to patch 1/2 I'd like
to also hear from Numan on this before merging the patch.

In any case:
Acked-by: Dumitru Ceara <dce...@redhat.com>

Regards,
Dumitru

>  OVN v25.03.0 - 07 Mar 2025
>  --------------------------
> diff --git a/controller/ofctrl.c b/controller/ofctrl.c
> index 304b9bbc8..b0b051e77 100644
> --- a/controller/ofctrl.c
> +++ b/controller/ofctrl.c
> @@ -352,14 +352,6 @@ static enum ofctrl_state state;
>  /* Release wait before clear stage. */
>  static bool wait_before_clear_proceed = false;
>  
> -/* The time (ms) to stay in the state S_WAIT_BEFORE_CLEAR. Read from
> - * external_ids: ovn-ofctrl-wait-before-clear. */
> -static unsigned int wait_before_clear_time = 0;
> -
> -/* The time when the state S_WAIT_BEFORE_CLEAR should complete.
> - * If the timer is not started yet, it is set to 0. */
> -static long long int wait_before_clear_expire = 0;
> -
>  /* Transaction IDs for messages in flight to the switch. */
>  static ovs_be32 xid, xid2;
>  
> @@ -642,26 +634,9 @@ error:
>  static void
>  run_S_WAIT_BEFORE_CLEAR(void)
>  {
> -    if (wait_before_clear_time == 0) {
> -        if (wait_before_clear_proceed) {
> -            state = S_CLEAR_FLOWS;
> -        }
> -
> -        return;
> -    }
> -
> -    if (!wait_before_clear_time ||
> -        (wait_before_clear_expire &&
> -         time_msec() >= wait_before_clear_expire)) {
> +    if (wait_before_clear_proceed) {
>          state = S_CLEAR_FLOWS;
> -        return;
>      }
> -
> -    if (!wait_before_clear_expire) {
> -        /* Start the timer. */
> -        wait_before_clear_expire = time_msec() + wait_before_clear_time;
> -    }
> -    poll_timer_wait_until(wait_before_clear_expire);
>  }
>  
>  static void
> @@ -837,13 +812,6 @@ ofctrl_run(const char *conn_target, int probe_interval,
>      const struct ovsrec_open_vswitch *cfg =
>          ovsrec_open_vswitch_table_first(ovs_table);
>      ovs_assert(cfg);
> -    unsigned int _wait_before_clear_time =
> -        smap_get_uint(&cfg->external_ids, "ovn-ofctrl-wait-before-clear", 0);
> -    if (_wait_before_clear_time != wait_before_clear_time) {
> -        VLOG_INFO("ofctrl-wait-before-clear is now %u ms (was %u ms)",
> -                  _wait_before_clear_time, wait_before_clear_time);
> -        wait_before_clear_time = _wait_before_clear_time;
> -    }
>  
>      bool progress = true;
>      for (int i = 0; progress && i < 50; i++) {
> diff --git a/controller/ovn-controller.8.xml b/controller/ovn-controller.8.xml
> index 5007f5f80..3f2cf5bae 100644
> --- a/controller/ovn-controller.8.xml
> +++ b/controller/ovn-controller.8.xml
> @@ -294,40 +294,6 @@
>          The default value is considered false if this option is not defined.
>        </dd>
>  
> -      <dt><code>external_ids:ovn-ofctrl-wait-before-clear</code></dt>
> -      <dd>
> -        The time, in milliseconds, to wait before clearing flows in OVS after
> -        OpenFlow connection/reconnection during <code>ovn-controller</code>
> -        initialization. The purpose of this wait is to give time for
> -        <code>ovn-controller</code> to compute the new flows before clearing
> -        existing ones, to avoid data plane down time during
> -        <code>ovn-controller</code> restart/upgrade at large scale
> -        environments where recomputing the flows takes more than a few 
> seconds
> -        or even longer. It is difficult for <code>ovn-controller</code>
> -        to determine when the new flows computing is completed, because of 
> the
> -        dynamics in the cloud environments, which is why this configuration 
> is
> -        provided for users to adjust based on the scale of the environment. 
> By
> -        default, it is 0, which means clearing existing flows without 
> waiting.
> -        Not setting the value, or setting it too small, may result in data
> -        plane down time during upgrade/restart, while setting it too big may
> -        result in unnecessary extra control plane latency of applying new
> -        changes of CMS during upgrade/restart. In most cases, a slightly 
> bigger
> -        value is not harmful, because the extra control plane latency happens
> -        only once during the OpenFlow connection. To get a reasonable range 
> of
> -        the value setting, it is recommended to run the below commands on a
> -        node in the target environment and then set this configuration to 
> twice
> -        the value of <code>Maximum</code> shown in the output of the second
> -        command.
> -        <ul>
> -          <li>
> -            <code>ovn-appctl -t ovn-controller inc-engine/recompute</code>
> -          </li>
> -          <li>
> -            <code>ovn-appctl -t ovn-controller stopwatch/show 
> flow-generation</code>
> -          </li>
> -        </ul>
> -      </dd>
> -
>        <dt><code>external_ids:ovn-enable-lflow-cache</code></dt>
>        <dd>
>          The boolean flag indicates if <code>ovn-controller</code> should
> diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at
> index 2e7ea5cb8..1e34d7ddf 100644
> --- a/tests/ovn-controller.at
> +++ b/tests/ovn-controller.at
> @@ -2348,112 +2348,6 @@ OVS_WAIT_UNTIL([
>  OVN_CLEANUP([hv1])
>  AT_CLEANUP
>  
> -AT_SETUP([ovn-controller - ofctrl wait before clearing flows])
> -
> -ovn_start
> -
> -net_add n1
> -sim_add hv1
> -as hv1
> -check ovs-vsctl add-br br-phys
> -ovn_attach n1 br-phys 192.168.0.1
> -check ovs-vsctl -- add-port br-int hv1-vif1 -- \
> -    set interface hv1-vif1 external-ids:iface-id=ls1-lp1
> -
> -check ovn-nbctl ls-add ls1
> -
> -check ovn-nbctl lsp-add ls1 ls1-lp1 \
> --- lsp-set-addresses ls1-lp1 "f0:00:00:00:00:01 10.1.2.3"
> -
> -check ovn-nbctl lb-add lb1 1.1.1.1 10.1.2.3 \
> --- ls-lb-add ls1 lb1
> -
> -check ovn-nbctl lb-add lb2 2.2.2.2 10.1.2.4 \
> --- ls-lb-add ls1 lb2
> -
> -check ovn-nbctl --wait=hv sync
> -# There should be 2 group IDs allocated
> -AT_CHECK([ovn-appctl -t ovn-controller group-table-list | awk '{print $2}' | 
> sort | uniq | wc -l], [0], [2
> -])
> -
> -# Stop ovn-controller
> -OVS_APP_EXIT_AND_WAIT([ovn-controller])
> -
> -# Set 5 seconds wait time before clearing OVS flows.
> -check ovs-vsctl set open . external_ids:ovn-ofctrl-wait-before-clear=5000
> -
> -# The old OVS flows should remain (this is regardless of the configuration)
> -AT_CHECK([ovs-ofctl dump-flows br-int | grep -F 10.1.2.3], [0], [ignore])
> -
> -# We should have 2 flows with groups.
> -AT_CHECK([ovs-ofctl dump-flows br-int | grep group -c], [0], [2
> -])
> -
> -# Make a change to the ls1-lp1's IP
> -check ovn-nbctl --wait=sb lsp-set-addresses ls1-lp1 "f0:00:00:00:00:01 
> 10.1.2.4"
> -
> -# Start ovn-controller, which should compute new flows but not apply them
> -# until the wait time is completed.
> -start_daemon ovn-controller
> -
> -# Wait for octrl to run - it will handle the wait-before-clear
> -OVS_WAIT_UNTIL([grep -q 'wait-before-clear' hv1/ovn-controller.log])
> -
> -# Check that there is no flow using 10.1.2.4 except the lb one (using 
> 2.2.2.2)
> -OVS_WAIT_UNTIL([test 0 = $(ovs-ofctl dump-flows br-int | grep -F 10.1.2.4 | 
> grep -cvF 2.2.2.2)])
> -
> -# Check in the middle of the wait.
> -# Wait for ovn-controller to claim the port as it might cause some lflow_run.
> -OVS_WAIT_UNTIL([test 2 = $(grep -c 'Claiming lport ls1-lp1 for this chassis' 
> hv1/ovn-controller.log)])
> -
> -lflow_run_1=$(ovn-appctl -t ovn-controller coverage/read-counter lflow_run)
> -AT_CHECK([ovs-ofctl dump-flows br-int | grep -F 10.1.2.3], [0], [ignore])
> -
> -# We should have 2 flows with groups.
> -AT_CHECK([ovs-ofctl dump-flows br-int | grep group -c], [0], [2
> -])
> -
> -sleep 5
> -
> -# Check after the wait
> -OVS_WAIT_UNTIL([ovs-ofctl dump-flows br-int | grep -F 10.1.2.4 | grep -vF 
> 2.2.2.2])
> -
> -# We should have 2 flows with groups.
> -AT_CHECK([ovs-ofctl dump-flows br-int | grep group -c], [0], [2
> -])
> -lflow_run_2=$(ovn-appctl -t ovn-controller coverage/read-counter lflow_run)
> -
> -# Verify that the flow compute completed during the wait (after the wait it
> -# merely installs the new flows).
> -AT_CHECK_UNQUOTED([echo $lflow_run_1], [0], [$lflow_run_2
> -])
> -
> -# Restart OVS this time. Flows should be reinstalled without waiting.
> -# Set the wait-before-clear to a large value (60s) to make the test more 
> reliable.
> -check ovs-vsctl set open . external_ids:ovn-ofctrl-wait-before-clear=60000
> -check ovn-nbctl --wait=hv sync
> -
> -OVS_APP_EXIT_AND_WAIT([ovs-vswitchd])
> -start_daemon ovs-vswitchd --enable-dummy=system -vvconn -vofproto_dpif 
> -vunixctl
> -
> -# Flow should be installed without waiting for another 60s.
> -OVS_WAIT_UNTIL([ovs-ofctl dump-flows br-int | grep -F 10.1.2.4 | grep -vF 
> 2.2.2.2])
> -
> -check ovn-nbctl --wait=hv lb-add lb3 3.3.3.3 10.1.2.5 \
> --- ls-lb-add ls1 lb3
> -
> -# There should be 3 group IDs allocated (this is to ensure the group ID
> -# allocation is correct after ofctrl state reset.
> -AT_CHECK([ovn-appctl -t ovn-controller group-table-list | awk '{print $2}' | 
> sort | uniq | wc -l], [0], [3
> -])
> -
> -# We should have 3 flows with groups.
> -AT_CHECK([ovs-ofctl dump-flows br-int | grep group -c], [0], [3
> -])
> -
> -OVN_CLEANUP([hv1])
> -AT_CLEANUP
> -
>  OVN_FOR_EACH_NORTHD([
>  AT_SETUP([ovn-controller - ofctrl delay until all monitored updates come])
>  

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to