)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bde40c2a415272cbc3435f3ced021b9e912f6743","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"76394ac6_b9885716","updated":"2026-07-30 12:38:34.000000000","message":"check experimental","commit_id":"3e1f88d5e14a3ea525712e12e7f29dd9ae7ae6d6"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"24229fd5314ccc819abcc37c5391e4782c6dcce7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"2787468b_f6a03285","updated":"2026-07-31 01:35:23.000000000","message":"just some thoughts about corner cases, but overall lgtm","commit_id":"3e1f88d5e14a3ea525712e12e7f29dd9ae7ae6d6"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"aa22360e83ff8a2c8d67b07d2ba5355a9674eb36","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"08c69811_62b45222","updated":"2026-07-31 20:29:17.000000000","message":"Functional tests failing\nhttps://zuul.opendev.org/t/openstack/build/4a1c07fc50714a5985393d4d4fa8bb77","commit_id":"4a2d3abbf26d3c3b13960129e5f4784765d9eee3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"619d23b32562e36fc118b76d3c683aaafc845769","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"fcb5fff8_c0bc1e8a","in_reply_to":"08c69811_62b45222","updated":"2026-08-04 20:11:32.000000000","message":"That\u0027s because https://review.opendev.org/c/openstack/neutron/+/998767 got merged in the meantime and now the chassis attribute is not available in the tests.","commit_id":"4a2d3abbf26d3c3b13960129e5f4784765d9eee3"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"9fd6cb2b6858fe6b6b752e8b65d4bb1c1baa5966","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"2aefa3b8_059de4a4","updated":"2026-08-05 13:53:52.000000000","message":"One question I have is, should we just not store this data in a non-durable location to begin with?","commit_id":"69fa5ba2bbbe1ad6877d31242567acceebcb78f1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"070299536319eb8c41dc56321d403927e50466f6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"c93e5b23_ffa4abe2","updated":"2026-08-06 12:18:41.000000000","message":"There are changes here that should have gone to the previous patch","commit_id":"69fa5ba2bbbe1ad6877d31242567acceebcb78f1"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"163101f9166b07f30460fe394ea4dbf4bf13c2e3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"3360daab_91c22b07","in_reply_to":"2aefa3b8_059de4a4","updated":"2026-08-05 13:54:51.000000000","message":".","commit_id":"69fa5ba2bbbe1ad6877d31242567acceebcb78f1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"35078a552efb9767bc310efa37148a1fb7d817e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"9b86c9e4_70d7ecdf","updated":"2026-08-11 11:48:25.000000000","message":"recheck - cover job timed out","commit_id":"1f32453ac9a098decb571b3e4382f4fb69f5fbd8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9ceb087e4c6d53ef81f70beef6aa986c4851de03","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"5f605c56_77c94651","updated":"2026-08-10 20:54:27.000000000","message":"recheck - dependency merged","commit_id":"1f32453ac9a098decb571b3e4382f4fb69f5fbd8"}],"neutron/agent/ovn/extensions/bgp/events.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"24229fd5314ccc819abcc37c5391e4782c6dcce7","unresolved":true,"context_lines":[{"line_number":378,"context_line":"class ChassisPrivateCreateEvent(BGPAgentEvent):"},{"line_number":379,"context_line":"    \"\"\"Re-set BGP bridges on Chassis_Private after ovn-controller restart."},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    When ovn-controller restarts, it creates a new Chassis_Private row"},{"line_number":382,"context_line":"    and the previously set external_ids (including the BGP bridges key)"},{"line_number":383,"context_line":"    are lost. This event detects the re-creation and re-applies the"},{"line_number":384,"context_line":"    configuration."}],"source_content_type":"text/x-python","patch_set":1,"id":"954f3050_a0106c90","line":381,"range":{"start_line":381,"start_character":4,"end_line":381,"end_character":34},"updated":"2026-07-31 01:35:23.000000000","message":"If I understand correctly, this patch is mostly concerned about a simple ovn-controller restart but what about if ovn-controller was first stopped(for whatever reason) and then started sometimes later...\nDuring the stop period, the user would update bgp_bridges [here](https://opendev.org/openstack/neutron/src/branch/master/neutron/agent/ovn/extensions/bgp/events.py#L119) but, since Chassis_Private record does not exists at this point, it would just log some \"Row not found\" error. This is a nit, but maybe we could handle that more nicely in the `LocalOVSEvent.run`?\n\nSimilar \"what if\", during this stop period, bridges were removed and then ovn-controller was started? I dont see opposite of [NewBgpBrigeEvent](https://opendev.org/openstack/neutron/src/branch/master/neutron/agent/ovn/extensions/bgp/events.py#L142), i.e. `DeleteBgpBridgeEvent`. That means that when the ovn-controller is started, your new `ChassisPrivateCreateEvent` will kick in, but it would write whatever is currently in memory `self.self.bgp_agent.bgp_bridges.keys()` which is stale because you dont have any Bridge removed event handler.","commit_id":"3e1f88d5e14a3ea525712e12e7f29dd9ae7ae6d6"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"dfc880ec326ac0ae2c6b7641dc67a4a07e11dbe7","unresolved":true,"context_lines":[{"line_number":378,"context_line":"class ChassisPrivateCreateEvent(BGPAgentEvent):"},{"line_number":379,"context_line":"    \"\"\"Re-set BGP bridges on Chassis_Private after ovn-controller restart."},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    When ovn-controller restarts, it creates a new Chassis_Private row"},{"line_number":382,"context_line":"    and the previously set external_ids (including the BGP bridges key)"},{"line_number":383,"context_line":"    are lost. This event detects the re-creation and re-applies the"},{"line_number":384,"context_line":"    configuration."}],"source_content_type":"text/x-python","patch_set":1,"id":"bc856a01_08295cb5","line":381,"range":{"start_line":381,"start_character":4,"end_line":381,"end_character":34},"in_reply_to":"954f3050_a0106c90","updated":"2026-07-31 12:40:19.000000000","message":"good point, so I think we should not craft the `bridge_names` based on the `bgp_bridges` which are an abstraction for local OVS bridges but rather the set external_ids - that way the chassis_private data always reflect the local OVS settings.\n\nAs for OVS bridge deletion goes, I think that could be a different bug as that may happen even while everything is up and running.","commit_id":"3e1f88d5e14a3ea525712e12e7f29dd9ae7ae6d6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"9fd6cb2b6858fe6b6b752e8b65d4bb1c1baa5966","unresolved":true,"context_lines":[{"line_number":378,"context_line":"class ChassisPrivateCreateEvent(BGPAgentEvent):"},{"line_number":379,"context_line":"    \"\"\"Re-set BGP bridges on Chassis_Private after ovn-controller restart."},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    When ovn-controller restarts, it creates a new Chassis_Private row"},{"line_number":382,"context_line":"    and the previously set external_ids (including the BGP bridges key)"},{"line_number":383,"context_line":"    are lost. This event detects the re-creation and re-applies the"},{"line_number":384,"context_line":"    configuration."}],"source_content_type":"text/x-python","patch_set":1,"id":"f33114a4_273a1a5c","line":381,"range":{"start_line":381,"start_character":4,"end_line":381,"end_character":34},"in_reply_to":"bc856a01_08295cb5","updated":"2026-08-05 13:53:52.000000000","message":"The RowNotFound in LocalOVSEvent.run() would get caught and log the exception. Some error handling would probably be good.","commit_id":"3e1f88d5e14a3ea525712e12e7f29dd9ae7ae6d6"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8a93060b6a65f91426b00aaa95d34ecd99200ce8","unresolved":false,"context_lines":[{"line_number":378,"context_line":"class ChassisPrivateCreateEvent(BGPAgentEvent):"},{"line_number":379,"context_line":"    \"\"\"Re-set BGP bridges on Chassis_Private after ovn-controller restart."},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    When ovn-controller restarts, it creates a new Chassis_Private row"},{"line_number":382,"context_line":"    and the previously set external_ids (including the BGP bridges key)"},{"line_number":383,"context_line":"    are lost. This event detects the re-creation and re-applies the"},{"line_number":384,"context_line":"    configuration."}],"source_content_type":"text/x-python","patch_set":1,"id":"de858850_50d98177","line":381,"range":{"start_line":381,"start_character":4,"end_line":381,"end_character":34},"in_reply_to":"f33114a4_273a1a5c","updated":"2026-08-06 19:12:41.000000000","message":"Done","commit_id":"3e1f88d5e14a3ea525712e12e7f29dd9ae7ae6d6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"9fd6cb2b6858fe6b6b752e8b65d4bb1c1baa5966","unresolved":true,"context_lines":[{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def run(self, event, row, old):"},{"line_number":410,"context_line":"        ovs_idl \u003d self.agent_api.ovs_idl.idl"},{"line_number":411,"context_line":"        ovs_row \u003d next(iter(ovs_idl.tables[\u0027Open_vSwitch\u0027].rows.values()))"},{"line_number":412,"context_line":"        bridge_names \u003d sorted(_get_bgp_peer_bridges(ovs_row))"},{"line_number":413,"context_line":"        if not bridge_names:"},{"line_number":414,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":3,"id":"3413ecec_c0188e37","line":411,"updated":"2026-08-05 13:53:52.000000000","message":"Technically, manually iterating tables should not be done in events--it is outside the connection thread and should only be done inside Command.run_idl(). This particular row, neutron accesses this way a lot, so it\u0027s not a big deal--it\u0027s just \"technically wrong\" and should be a db_list_rows() or something.","commit_id":"69fa5ba2bbbe1ad6877d31242567acceebcb78f1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8a93060b6a65f91426b00aaa95d34ecd99200ce8","unresolved":false,"context_lines":[{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def run(self, event, row, old):"},{"line_number":410,"context_line":"        ovs_idl \u003d self.agent_api.ovs_idl.idl"},{"line_number":411,"context_line":"        ovs_row \u003d next(iter(ovs_idl.tables[\u0027Open_vSwitch\u0027].rows.values()))"},{"line_number":412,"context_line":"        bridge_names \u003d sorted(_get_bgp_peer_bridges(ovs_row))"},{"line_number":413,"context_line":"        if not bridge_names:"},{"line_number":414,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fc842ec_cd17f139","line":411,"in_reply_to":"3413ecec_c0188e37","updated":"2026-08-06 19:12:41.000000000","message":"Done","commit_id":"69fa5ba2bbbe1ad6877d31242567acceebcb78f1"}]}
