)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"0146c3ae0081fd855473138f3059b7ebb4ce712c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"98f63f76_4a1593ee","updated":"2026-10-15 14:03:49.000000000","message":"Thanks for the patch and also the python-OVS patch fixing the poller. I\u0027m trying to find time to review it as well (I can\u0027t approve it, but I can review and test).","commit_id":"857b5bcfe0389823195323592621aa5d74dc4fa8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"514c8c7b3b0c35c92c6e7ec6cc07c4e016e99501","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b4208630_68de29e6","updated":"2026-10-26 21:55:35.000000000","message":"lgtm, thanks a lot!","commit_id":"379bffe640ac425edb8dad15a9454e65139244b9"}],"ovsdbapp/backend/ovs_idl/connection.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"504ae6d64ad4241001f7269246465d6b7e7df639","unresolved":true,"context_lines":[{"line_number":131,"context_line":"                # full\", as would every later transaction in this process,"},{"line_number":132,"context_line":"                # until it is restarted. Hand the caller the real error"},{"line_number":133,"context_line":"                # instead."},{"line_number":134,"context_line":"                self._fail_queued_txn(e)"},{"line_number":135,"context_line":"                continue"},{"line_number":136,"context_line":"            txn \u003d self.txns.get_nowait()"},{"line_number":137,"context_line":"            if txn is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"f143cc7b_b6939da0","line":134,"range":{"start_line":134,"start_character":0,"end_line":134,"end_character":2},"updated":"2026-09-25 09:55:56.000000000","message":"So I have a question about this. So if we have an exception, for example `Idl.notify()` or `notify_lock` failure, before this patch the transaction stays queued and is committed in the next successful loop. With this patch, that fails immediately.\n\nI\u0027m sure this is not an expected behavior. But I would prefer Terry to review this patch and provide feedback, as he is the father of this code.","commit_id":"857b5bcfe0389823195323592621aa5d74dc4fa8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"0146c3ae0081fd855473138f3059b7ebb4ce712c","unresolved":true,"context_lines":[{"line_number":131,"context_line":"                # full\", as would every later transaction in this process,"},{"line_number":132,"context_line":"                # until it is restarted. Hand the caller the real error"},{"line_number":133,"context_line":"                # instead."},{"line_number":134,"context_line":"                self._fail_queued_txn(e)"},{"line_number":135,"context_line":"                continue"},{"line_number":136,"context_line":"            txn \u003d self.txns.get_nowait()"},{"line_number":137,"context_line":"            if txn is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ab4fa24_94bd772e","line":134,"range":{"start_line":134,"start_character":0,"end_line":134,"end_character":2},"in_reply_to":"6bf6edb2_52d6b691","updated":"2026-10-15 14:03:49.000000000","message":"The intended behavior is that once we recover, the transaction is picked up and committed as long as it hasn\u0027t timed out. We already have a Transaction.timeout which is what should determine whether a transaction is aborted, or retried. Our current handling of that timeout is not great--it looks like there are serveral ways we can exceed it, e.g. getting stuck in commit_block(). For this particular issue where there is an exception in idl.run() or poller.block(), I think we can probably better track the time in Transaction.commit() and maybe store the last error/exception in Connection.run().\n\nFixes for the timeout in general, e.g. if commit_block() just blocked forever would probably involve getting rid of commit_block() usage, similar to what I tried in the async PoC https://review.opendev.org/c/openstack/ovsdbapp/+/990589/2/ovsdbapp/backend/ovs_idl/async_connection.py which is out of scope for this particular fix.","commit_id":"857b5bcfe0389823195323592621aa5d74dc4fa8"},{"author":{"_account_id":36716,"name":"Kyuyeong Lee","display_name":"Kyuyeong Lee","email":"kyu0.lee@samsung.com","username":"kyu0"},"change_message_id":"9506c9be8cafce25db5fbf140fef9ae07f14a96f","unresolved":true,"context_lines":[{"line_number":131,"context_line":"                # full\", as would every later transaction in this process,"},{"line_number":132,"context_line":"                # until it is restarted. Hand the caller the real error"},{"line_number":133,"context_line":"                # instead."},{"line_number":134,"context_line":"                self._fail_queued_txn(e)"},{"line_number":135,"context_line":"                continue"},{"line_number":136,"context_line":"            txn \u003d self.txns.get_nowait()"},{"line_number":137,"context_line":"            if txn is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fb6b727e_78ff3278","line":134,"range":{"start_line":134,"start_character":0,"end_line":134,"end_character":2},"in_reply_to":"9ab4fa24_94bd772e","updated":"2026-10-23 06:48:48.000000000","message":"Thanks, that makes sense.\nI\u0027ll rework it along those lines: track a single deadline in Transaction.commit() across queueing and waiting for the result, keep the last exception from Connection.run() and report it when a transaction times out, and skip a queued transaction that has already timed out once the connection recovers instead of committing it.\ncommit_block() stays as is.","commit_id":"857b5bcfe0389823195323592621aa5d74dc4fa8"},{"author":{"_account_id":36716,"name":"Kyuyeong Lee","display_name":"Kyuyeong Lee","email":"kyu0.lee@samsung.com","username":"kyu0"},"change_message_id":"ac2a43ae03557cd8049b8085135553d2e0ffceab","unresolved":true,"context_lines":[{"line_number":131,"context_line":"                # full\", as would every later transaction in this process,"},{"line_number":132,"context_line":"                # until it is restarted. Hand the caller the real error"},{"line_number":133,"context_line":"                # instead."},{"line_number":134,"context_line":"                self._fail_queued_txn(e)"},{"line_number":135,"context_line":"                continue"},{"line_number":136,"context_line":"            txn \u003d self.txns.get_nowait()"},{"line_number":137,"context_line":"            if txn is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"6bf6edb2_52d6b691","line":134,"range":{"start_line":134,"start_character":0,"end_line":134,"end_character":2},"in_reply_to":"f143cc7b_b6939da0","updated":"2026-09-28 09:51:03.000000000","message":"You\u0027re right, thanks. A transient Idl.run() failure currently just delays the queued transaction to the next loop, and this patch would turn it into a failure instead. That was not intended.\n\nThe case I\u0027m after is only the persistent one, where Idl.run() raises on every iteration and the queue never drains. I think failing the queued transaction only after N consecutive failures, reset on the first successful run, would keep the transient case as it is today.\n\nI\u0027ll wait for Terry\u0027s view before sending a new patch set.","commit_id":"857b5bcfe0389823195323592621aa5d74dc4fa8"},{"author":{"_account_id":36716,"name":"Kyuyeong Lee","display_name":"Kyuyeong Lee","email":"kyu0.lee@samsung.com","username":"kyu0"},"change_message_id":"98b2f271a1dfc711e56a3465eca5e73a1e9cc710","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                # full\", as would every later transaction in this process,"},{"line_number":132,"context_line":"                # until it is restarted. Hand the caller the real error"},{"line_number":133,"context_line":"                # instead."},{"line_number":134,"context_line":"                self._fail_queued_txn(e)"},{"line_number":135,"context_line":"                continue"},{"line_number":136,"context_line":"            txn \u003d self.txns.get_nowait()"},{"line_number":137,"context_line":"            if txn is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"a5f8cbfd_e89bca9a","line":134,"range":{"start_line":134,"start_character":0,"end_line":134,"end_character":2},"in_reply_to":"fb6b727e_78ff3278","updated":"2026-10-23 07:02:15.000000000","message":"Done in PS2.","commit_id":"857b5bcfe0389823195323592621aa5d74dc4fa8"}]}
