)]}'
{"tests/unit/test_launcher.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"88c05bdf7a9a1172f5eb06d1ecab19a0ff6a5842","unresolved":true,"context_lines":[{"line_number":1228,"context_line":"        # Make the request cache max_zxid method controllable"},{"line_number":1229,"context_line":"        waiting_event \u003d threading.Event()"},{"line_number":1230,"context_line":"        go_event \u003d threading.Event()"},{"line_number":1231,"context_line":"        go_event.set()"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"        class MyCache(RequestCache):"},{"line_number":1234,"context_line":"            @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"ce4838de_9f241a67","line":1231,"updated":"2025-11-12 00:25:42.000000000","message":"Does this go_event.set() ensure the creation of the original request and node is able to proceed? I see we clear the go_event later so I expect this is the case. I half wonder if it would be simpler to patch things in after line 1262?","commit_id":"9f8171d00ab20294c62458f05c8db40ac0580631"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"907bdbf7a1ef793dcb096b68ad24087f88e7526b","unresolved":false,"context_lines":[{"line_number":1228,"context_line":"        # Make the request cache max_zxid method controllable"},{"line_number":1229,"context_line":"        waiting_event \u003d threading.Event()"},{"line_number":1230,"context_line":"        go_event \u003d threading.Event()"},{"line_number":1231,"context_line":"        go_event.set()"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"        class MyCache(RequestCache):"},{"line_number":1234,"context_line":"            @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"078c930c_2b3da8c5","line":1231,"in_reply_to":"ce4838de_9f241a67","updated":"2025-11-12 00:49:15.000000000","message":"Yes.  I like the idea of just being able to turn it on and off in the test.  This test has moved around a lot during development.","commit_id":"9f8171d00ab20294c62458f05c8db40ac0580631"}],"zuul/zk/cache.py":[{"author":{"_account_id":27582,"name":"Simon Westphahl","email":"simon.westphahl@bmw.de","username":"simon.westphahl"},"change_message_id":"afb4f4979d9d3ad7ea0a6e8d5a5384326503113c","unresolved":true,"context_lines":[{"line_number":91,"context_line":"        self._zk_context \u003d ZKContext(self.zk_client, None, None, self.log)"},{"line_number":92,"context_line":"        # The maximum zxid seen for any object creations or"},{"line_number":93,"context_line":"        # modifications.  This is not updated on delete transactions."},{"line_number":94,"context_line":"        self._max_zxid \u003d WatchedEvent.NO_ZXID"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        self.client.add_listener(self._sessionListener)"},{"line_number":97,"context_line":"        self._start()"}],"source_content_type":"text/x-python","patch_set":4,"id":"4277a384_5fb0ddad","line":94,"updated":"2025-11-12 13:14:12.000000000","message":"Are we not updating the max zxid on delete transactions because we don\u0027t get one with the event or what\u0027s the reason for only updating it on create/mod?","commit_id":"9f8171d00ab20294c62458f05c8db40ac0580631"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"14546406b067d8ea111a110ec3ea5a0b0af6a711","unresolved":true,"context_lines":[{"line_number":91,"context_line":"        self._zk_context \u003d ZKContext(self.zk_client, None, None, self.log)"},{"line_number":92,"context_line":"        # The maximum zxid seen for any object creations or"},{"line_number":93,"context_line":"        # modifications.  This is not updated on delete transactions."},{"line_number":94,"context_line":"        self._max_zxid \u003d WatchedEvent.NO_ZXID"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        self.client.add_listener(self._sessionListener)"},{"line_number":97,"context_line":"        self._start()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7cb44a27_5df49438","line":94,"in_reply_to":"4277a384_5fb0ddad","updated":"2025-11-12 14:57:43.000000000","message":"We do receive it on delete, but if we\u0027re recovering, we aren\u0027t going to see the mzxid of an object that wasn\u0027t there.  Since we\u0027re using this for synchronization (rather than it\u0027s original upstream use-case of distinguishing new events from recovery events), I wanted to make sure the treecache has the same max_zxid whether it has been running the whole time or just (re-)started and read all the data from zk directly.  That could avoid bugs where we try to wait for a transaction that will never arrive.\n\nI suspect we may also start to use this for the original use-case, and in that case, we would want to pay attention to that, but I would still not update this attribute as long as we use it for synchronization.","commit_id":"9f8171d00ab20294c62458f05c8db40ac0580631"},{"author":{"_account_id":27582,"name":"Simon Westphahl","email":"simon.westphahl@bmw.de","username":"simon.westphahl"},"change_message_id":"afb4f4979d9d3ad7ea0a6e8d5a5384326503113c","unresolved":true,"context_lines":[{"line_number":306,"context_line":"        if future:"},{"line_number":307,"context_line":"            try:"},{"line_number":308,"context_line":"                data, stat \u003d future.get()"},{"line_number":309,"context_line":"                zxid \u003d stat.mzxid"},{"line_number":310,"context_line":"                exists \u003d True"},{"line_number":311,"context_line":"            except kze.NoNodeError:"},{"line_number":312,"context_line":"                exists \u003d False"}],"source_content_type":"text/x-python","patch_set":4,"id":"a9dd50d0_d8ce08fb","line":309,"updated":"2025-11-12 13:14:12.000000000","message":"I think we should not use the mzxid of the object as that might introduce another race condition. E.g.\n\nEvents ZXIDs:\n\n1. create /foo\n2. create /bar\n3. modify /foo\n\nNow, if we start processing event 1. after 3. has already happened, we would set the max zxid to 3. without having processed event 2.","commit_id":"9f8171d00ab20294c62458f05c8db40ac0580631"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"d48390e442a68ac64b0856e3729693ad9f8c21e5","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        if future:"},{"line_number":307,"context_line":"            try:"},{"line_number":308,"context_line":"                data, stat \u003d future.get()"},{"line_number":309,"context_line":"                zxid \u003d stat.mzxid"},{"line_number":310,"context_line":"                exists \u003d True"},{"line_number":311,"context_line":"            except kze.NoNodeError:"},{"line_number":312,"context_line":"                exists \u003d False"}],"source_content_type":"text/x-python","patch_set":4,"id":"78be17b1_342218aa","line":309,"in_reply_to":"a9dd50d0_d8ce08fb","updated":"2025-11-12 16:00:43.000000000","message":"Oh I see this could be the case during normal runtime (not recovery) if we have a backlog.  We can correct that by changing line 329 to use the stat zxid only if there is no event zxid.","commit_id":"9f8171d00ab20294c62458f05c8db40ac0580631"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"14546406b067d8ea111a110ec3ea5a0b0af6a711","unresolved":true,"context_lines":[{"line_number":306,"context_line":"        if future:"},{"line_number":307,"context_line":"            try:"},{"line_number":308,"context_line":"                data, stat \u003d future.get()"},{"line_number":309,"context_line":"                zxid \u003d stat.mzxid"},{"line_number":310,"context_line":"                exists \u003d True"},{"line_number":311,"context_line":"            except kze.NoNodeError:"},{"line_number":312,"context_line":"                exists \u003d False"}],"source_content_type":"text/x-python","patch_set":4,"id":"870af4a2_d9942e2c","line":309,"in_reply_to":"a9dd50d0_d8ce08fb","updated":"2025-11-12 14:57:43.000000000","message":"The events arrive in order and are processed in order, so if we\u0027re processing events, we will set them in order.\n\nDuring recovery, something like this could happen (if event #3 is new and arrives while we are recovering; events 1 and 2 are old).  But we set the ready flag to false during recovery, and always return -1 during that time, so we won\u0027t start returning our real max_zxid until we have at least reached #2.  That means the zxid will be 2 if we haven\u0027t processed #3, or 3 if we have, which is correct.","commit_id":"9f8171d00ab20294c62458f05c8db40ac0580631"}]}
