)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ab9ca431378afe9de8732209b129e4bcaf8d1175","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"67d3e1dc_70a1d617","updated":"2026-01-08 08:17:11.000000000","message":"-1 for the question inline","commit_id":"a560db1cad0b4cdd5a9f8adb7486d64ccd7f9fd3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6a15dd5977383ced669747015a42b8b57ec4516b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"21e73835_c91833f9","updated":"2026-01-20 13:54:22.000000000","message":"Looks good, tested in the upper patch","commit_id":"8d590382cd9efe1499952e48e31184017a5ff9da"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c8d2ee2600be27308af79b666516d507412af79f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"4e37e51d_ef83d692","updated":"2026-01-16 23:50:57.000000000","message":"recheck I don\u0027t see any errors in the neutron-api log, see the network-changed events being sent. Looks like a timeout. Didn\u0027t see any bugs opened for it. And obviously it\u0027s an ovs-based test that failed and this is a bgp-ovn change.","commit_id":"8d590382cd9efe1499952e48e31184017a5ff9da"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"029459c68e124c0c45162cc47b0c378ca7145823","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"b384c0d6_fd343064","updated":"2026-01-16 20:10:07.000000000","message":"recheck bug 2101165 and bug 2079047","commit_id":"8d590382cd9efe1499952e48e31184017a5ff9da"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"b0344838084916456213cda4b8e04c9c09728187","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6332f16c_9b14f8e9","updated":"2026-01-26 16:51:12.000000000","message":"recheck tempest failure","commit_id":"8d590382cd9efe1499952e48e31184017a5ff9da"}],"neutron/tests/functional/services/bgp/test_ovn.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ab9ca431378afe9de8732209b129e4bcaf8d1175","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        self.assertTrue(self.nb_bgp_api2.has_lock)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Someone should get the lock but it could be either API"},{"line_number":157,"context_line":"        self.nb_bgp_api1.set_lock()"},{"line_number":158,"context_line":"        self.nb_bgp_api2.set_lock()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        def wait_for_lock():"},{"line_number":161,"context_line":"            return self.nb_bgp_api1.has_lock !\u003d self.nb_bgp_api2.has_lock"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Wait for the lock to be lost by one of the APIs"},{"line_number":164,"context_line":"        common_utils.wait_until_true("}],"source_content_type":"text/x-python","patch_set":1,"id":"19ef6282_f91b304a","line":161,"range":{"start_line":157,"start_character":9,"end_line":161,"end_character":73},"updated":"2026-01-08 08:17:11.000000000","message":"If we send the `set_lock` commands in order and the OVS DB has a queue for that (and these commands are sent in \"lock\" mode [1]), they should always be replied in this same order.\n\nI thought we were going to use `idl.has_lock` instead.\n\n[1]https://github.com/openvswitch/ovs/blob/c34c21bb0184fab6856ca332b2d678941fb691ba/ovsdb/server.c#L207","commit_id":"a560db1cad0b4cdd5a9f8adb7486d64ccd7f9fd3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"b02db5b4198c7fefeeec3a8f73acde7decafbb1b","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        self.assertTrue(self.nb_bgp_api2.has_lock)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Someone should get the lock but it could be either API"},{"line_number":157,"context_line":"        self.nb_bgp_api1.set_lock()"},{"line_number":158,"context_line":"        self.nb_bgp_api2.set_lock()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        def wait_for_lock():"},{"line_number":161,"context_line":"            return self.nb_bgp_api1.has_lock !\u003d self.nb_bgp_api2.has_lock"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Wait for the lock to be lost by one of the APIs"},{"line_number":164,"context_line":"        common_utils.wait_until_true("}],"source_content_type":"text/x-python","patch_set":1,"id":"e9814da4_fc8d0945","line":161,"range":{"start_line":157,"start_character":9,"end_line":161,"end_character":73},"in_reply_to":"17d60c96_cfc5cacf","updated":"2026-01-14 07:49:50.000000000","message":"Regardless of the APIs having different connections, we are issuing the commands serially. In the different logs we saw, always the first API obtained the lock while the second one was waiting.\n\nI\u0027m suggesting using `idl.has_lock` because, unlike `idl.is_lock_contended`, if a second `set_lock` command is sent by the client (something that I still don\u0027t understand why is happening), `idl.has_lock` keeps always the same value. `idl.is_lock_contended` is true in the second API after the first `set_lock` command, but it is set to false after the second `set_lock` command.\n\nIn other words, `idl.has_lock` truly reflects if the IDL has gained the lock or not.","commit_id":"a560db1cad0b4cdd5a9f8adb7486d64ccd7f9fd3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e243223ff66f1ffd0b2e5f116808c9e396b55fbf","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        self.assertTrue(self.nb_bgp_api2.has_lock)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Someone should get the lock but it could be either API"},{"line_number":157,"context_line":"        self.nb_bgp_api1.set_lock()"},{"line_number":158,"context_line":"        self.nb_bgp_api2.set_lock()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        def wait_for_lock():"},{"line_number":161,"context_line":"            return self.nb_bgp_api1.has_lock !\u003d self.nb_bgp_api2.has_lock"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Wait for the lock to be lost by one of the APIs"},{"line_number":164,"context_line":"        common_utils.wait_until_true("}],"source_content_type":"text/x-python","patch_set":1,"id":"f1bdefc2_416c56ec","line":161,"range":{"start_line":157,"start_character":9,"end_line":161,"end_character":73},"in_reply_to":"19ef6282_f91b304a","updated":"2026-01-08 14:46:31.000000000","message":"The commands could reach the server out of order already, couldn\u0027t they?","commit_id":"a560db1cad0b4cdd5a9f8adb7486d64ccd7f9fd3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"475b310d2aa63514c049a9087aa9fe01ebb5aa30","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        self.assertTrue(self.nb_bgp_api2.has_lock)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Someone should get the lock but it could be either API"},{"line_number":157,"context_line":"        self.nb_bgp_api1.set_lock()"},{"line_number":158,"context_line":"        self.nb_bgp_api2.set_lock()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        def wait_for_lock():"},{"line_number":161,"context_line":"            return self.nb_bgp_api1.has_lock !\u003d self.nb_bgp_api2.has_lock"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Wait for the lock to be lost by one of the APIs"},{"line_number":164,"context_line":"        common_utils.wait_until_true("}],"source_content_type":"text/x-python","patch_set":1,"id":"48420b44_e4f18dc6","line":161,"range":{"start_line":157,"start_character":9,"end_line":161,"end_character":73},"in_reply_to":"336b1fbf_1d58a1d2","updated":"2026-01-16 19:04:25.000000000","message":"Done","commit_id":"a560db1cad0b4cdd5a9f8adb7486d64ccd7f9fd3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8f837ac513a7009e7f7120670f2e5188fcfb1010","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        self.assertTrue(self.nb_bgp_api2.has_lock)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Someone should get the lock but it could be either API"},{"line_number":157,"context_line":"        self.nb_bgp_api1.set_lock()"},{"line_number":158,"context_line":"        self.nb_bgp_api2.set_lock()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        def wait_for_lock():"},{"line_number":161,"context_line":"            return self.nb_bgp_api1.has_lock !\u003d self.nb_bgp_api2.has_lock"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Wait for the lock to be lost by one of the APIs"},{"line_number":164,"context_line":"        common_utils.wait_until_true("}],"source_content_type":"text/x-python","patch_set":1,"id":"336b1fbf_1d58a1d2","line":161,"range":{"start_line":157,"start_character":9,"end_line":161,"end_character":73},"in_reply_to":"e9814da4_fc8d0945","updated":"2026-01-14 21:38:55.000000000","message":"To unblock the functional tests failure I think we should merge this and I\u0027ll deal with the locks here and the maintenance task as well.","commit_id":"a560db1cad0b4cdd5a9f8adb7486d64ccd7f9fd3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6a3e4e27185fc8bacf9ce462c7e1caaa06dbb0c5","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        self.assertTrue(self.nb_bgp_api2.has_lock)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Someone should get the lock but it could be either API"},{"line_number":157,"context_line":"        self.nb_bgp_api1.set_lock()"},{"line_number":158,"context_line":"        self.nb_bgp_api2.set_lock()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        def wait_for_lock():"},{"line_number":161,"context_line":"            return self.nb_bgp_api1.has_lock !\u003d self.nb_bgp_api2.has_lock"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Wait for the lock to be lost by one of the APIs"},{"line_number":164,"context_line":"        common_utils.wait_until_true("}],"source_content_type":"text/x-python","patch_set":1,"id":"17d60c96_cfc5cacf","line":161,"range":{"start_line":157,"start_character":9,"end_line":161,"end_character":73},"in_reply_to":"ecdf91a6_55ff3191","updated":"2026-01-12 18:55:38.000000000","message":"Right but because every IDL has its own connection you can\u0027t guarantee the order of the delivered commands.\n\nI can\u0027t see how `has_lock` solves the problem, the code would still be the same because of the above, just the asserts would be reversed:\n```\n        self.assertFalse(self.nb_bgp_api1.has_lock)\n        self.assertFalse(self.nb_bgp_api2.has_lock)\n\n        # Someone should get the lock but it could be either API\n        self.nb_bgp_api1.set_lock()\n        self.nb_bgp_api2.set_lock()\n\n        def wait_for_lock():\n            return self.nb_bgp_api1.has_lock !\u003d self.nb_bgp_api2.has_lock\n```\nor what am I missing?","commit_id":"a560db1cad0b4cdd5a9f8adb7486d64ccd7f9fd3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8cc5a1e4179e1da030f6b73791f4ea3b5b60b0fc","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        self.assertTrue(self.nb_bgp_api2.has_lock)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        # Someone should get the lock but it could be either API"},{"line_number":157,"context_line":"        self.nb_bgp_api1.set_lock()"},{"line_number":158,"context_line":"        self.nb_bgp_api2.set_lock()"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        def wait_for_lock():"},{"line_number":161,"context_line":"            return self.nb_bgp_api1.has_lock !\u003d self.nb_bgp_api2.has_lock"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        # Wait for the lock to be lost by one of the APIs"},{"line_number":164,"context_line":"        common_utils.wait_until_true("}],"source_content_type":"text/x-python","patch_set":1,"id":"ecdf91a6_55ff3191","line":161,"range":{"start_line":157,"start_character":9,"end_line":161,"end_character":73},"in_reply_to":"f1bdefc2_416c56ec","updated":"2026-01-09 08:00:48.000000000","message":"That\u0027s possible, but unlikely, because both API have different connections. But the requests are executed in order. The issue reported in the LP happens to be caused by the API2, that retries (I don\u0027t know why) the lock command and after the second call, `idl.is_lock_contended` is set to False. This is why I suggested to use `idl.hash_lock`, that should always inform about the correct lock status of the API.","commit_id":"a560db1cad0b4cdd5a9f8adb7486d64ccd7f9fd3"}]}
