As I mentioned in my reply to the cover letter, this patch is acked.
However, there is a typo in the subject line.

s/ocn-ic/ovn-ic/

On Wed, Jun 17, 2026 at 12:21 PM Xavier Simonart via dev
<[email protected]> wrote:
>
> When ovn-ic is paused, it releases the ISB lock (if it was held), but
> does not cancel an outstanding/contended lock request.
> This means a paused instance can acquire the ISB lock after
> another AZ releases it, even though the paused instance cannot use it.
>
> When then handling the "locked" event, it might not unlock it, as
> the check of the lock state is done before ovsdb_idl_run.
> Finally, it goes to sleep (holding the ISB lock) until something else
> wakes it up.
>
> Fix this by also checking ovsdb_idl_is_lock_contended() before
> releasing, matching the pattern already used for the SB lock.
>
> Fixes: 052a298bb90e ("ovn-ic: Use dual IC-SB connections to prevent 
> constraint violations.")
> Signed-off-by: Xavier Simonart <[email protected]>
> ---
>  ic/ovn-ic.c     |  3 ++-
>  tests/ovn-ic.at | 39 +++++++++++++++++++++++++++++++++++++++
>  2 files changed, 41 insertions(+), 1 deletion(-)
>
> diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c
> index b197ceeab..4f7e33da3 100644
> --- a/ic/ovn-ic.c
> +++ b/ic/ovn-ic.c
> @@ -4062,7 +4062,8 @@ main(int argc, char *argv[])
>               *      copy will be out of sync.
>               *    - but we don't want to create any txns.
>               * */
> -            if (ovsdb_idl_has_lock(ovnisb_idl_loop.idl)) {
> +            if (ovsdb_idl_has_lock(ovnisb_idl_loop.idl) ||
> +                ovsdb_idl_is_lock_contended(ovnisb_idl_loop.idl)) {
>                  VLOG_INFO("This ovn-ic instance is now paused. "
>                            "Removing IC-SB lock.");
>                  ovsdb_idl_set_lock(ovnisb_idl_loop.idl, NULL);
> diff --git a/tests/ovn-ic.at b/tests/ovn-ic.at
> index 0826632e9..9b6a58acd 100644
> --- a/tests/ovn-ic.at
> +++ b/tests/ovn-ic.at
> @@ -5061,3 +5061,42 @@ OVN_CLEANUP_IC([az1], [az2])
>
>  AT_CLEANUP
>  ])
> +
> +OVN_FOR_EACH_NORTHD([
> +AT_SETUP([ovn-ic  - pause])
> +ovn_init_ic_db
> +net_add n1
> +
> +check ovn-ic-nbctl ts-add ts1
> +ovn_start az1
> +OVS_WAIT_UNTIL([test "x$(as az1 ovn-appctl -t ic/ovn-ic status)" = "xStatus: 
> active"])
> +OVS_WAIT_UNTIL([grep -q "OVN ISB lock acquired" az1/ic/ovn-ic.log])
> +
> +ovn_start az2
> +
> +AS_BOX([az2 paused])
> +check as az2 ovn-appctl -t ic/ovn-ic pause
> +OVS_WAIT_UNTIL([test "x$(as az2 ovn-appctl -t ic/ovn-ic status)" = "xStatus: 
> paused"])
> +n1_lock_notif=$(grep -c 'send notification, method="locked"' 
> ovn-ic-sb/ovsdb-server.log)
> +
> +AS_BOX([az1 paused])
> +check as az1 ovn-appctl -t ic/ovn-ic pause
> +OVS_WAIT_UNTIL([test "x$(as az1 ovn-appctl -t ic/ovn-ic status)" = "xStatus: 
> paused"])
> +n2_lock_notif=$(grep -c 'send notification, method="locked"' 
> ovn-ic-sb/ovsdb-server.log)
> +
> +# Pausing az1 should not cause az2 to own the lock: az2 is paused.
> +echo "$n1_lock_notif before and $n2_lock_notif after pausing az1"
> +AT_CHECK([test $n1_lock_notif -eq $n2_lock_notif])
> +
> +n1_lock_acquired=$(grep -c 'OVN ISB lock acquired' az1/ic/ovn-ic.log)
> +AS_BOX([az1 resumed])
> +check as az1 ovn-appctl -t ic/ovn-ic resume
> +n2_lock_acquired=$(grep -c 'OVN ISB lock acquired' az1/ic/ovn-ic.log)
> +echo "$n1_lock_acquired before and $n2_lock_acquired after resuming az1"
> +OVS_WAIT_UNTIL([test $n1_lock_acquired -ne $n2_lock_acquired])
> +
> +OVN_CLEANUP_IC([az1], [az2])
> +
> +AT_CLEANUP
> +])
> +
> --
> 2.47.1
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to