)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"a30532e28f5d3fa6682fcdb88bff745de88b0287","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Some changes to Kazoo are needed to support persistent recursive"},{"line_number":10,"context_line":"watches.  Until those merge upstream, vendor and update the parts"},{"line_number":11,"context_line":"of Kazoo we need."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Upstream PR: https://github.com/python-zk/kazoo/pull/715"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"d11f5d9c_34f13f84","line":11,"updated":"2023-04-10 21:11:08.000000000","message":"To be clear this change isn\u0027t switching to persistent watches. It is merely adding support for them. A followup is necessary to take advantage of the new functionality?","commit_id":"1a3703e3f9d2736604011559024b3ec79fcd3959"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1896a0b70530b5fc49c52df9da626c61b3559995","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Some changes to Kazoo are needed to support persistent recursive"},{"line_number":10,"context_line":"watches.  Until those merge upstream, vendor and update the parts"},{"line_number":11,"context_line":"of Kazoo we need."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Upstream PR: https://github.com/python-zk/kazoo/pull/715"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"c5692a3c_0e69e872","line":11,"in_reply_to":"d11f5d9c_34f13f84","updated":"2023-04-10 21:40:56.000000000","message":"Correct.  For reviewability, this change is ~\u003d to the upstream change.","commit_id":"1a3703e3f9d2736604011559024b3ec79fcd3959"}],"nodepool/zk/vendor/connection.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"a30532e28f5d3fa6682fcdb88bff745de88b0287","unresolved":true,"context_lines":[{"line_number":51,"context_line":"        watchers \u003d []"},{"line_number":52,"context_line":"        for count in range(len(parts)):"},{"line_number":53,"context_line":"            candidate \u003d \"/\".join(parts[: count + 1])"},{"line_number":54,"context_line":"            if not candidate:"},{"line_number":55,"context_line":"                continue"},{"line_number":56,"context_line":"            watchers.extend("},{"line_number":57,"context_line":"                self.client._persistent_recursive_watchers.get(candidate, [])"}],"source_content_type":"text/x-python","patch_set":4,"id":"0f63e42b_144c15cc","line":54,"updated":"2023-04-10 21:11:08.000000000","message":"I think this manipulation of paths means that you won\u0027t see a persistent recursive watch set on /:\n\n```\n\u003e\u003e\u003e path \u003d \u0027/foo/bar\u0027\n\u003e\u003e\u003e path.split(\u0027/\u0027)\n[\u0027\u0027, \u0027foo\u0027, \u0027bar\u0027]\n\u003e\u003e\u003e \u0027/\u0027.join(path.split(\u0027/\u0027)[:1])\n\u0027\u0027\n```","commit_id":"1a3703e3f9d2736604011559024b3ec79fcd3959"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1896a0b70530b5fc49c52df9da626c61b3559995","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        watchers \u003d []"},{"line_number":52,"context_line":"        for count in range(len(parts)):"},{"line_number":53,"context_line":"            candidate \u003d \"/\".join(parts[: count + 1])"},{"line_number":54,"context_line":"            if not candidate:"},{"line_number":55,"context_line":"                continue"},{"line_number":56,"context_line":"            watchers.extend("},{"line_number":57,"context_line":"                self.client._persistent_recursive_watchers.get(candidate, [])"}],"source_content_type":"text/x-python","patch_set":4,"id":"60abf4a5_e6d5cf1f","line":54,"in_reply_to":"0f63e42b_144c15cc","updated":"2023-04-10 21:40:56.000000000","message":"Will fix in a followup.","commit_id":"1a3703e3f9d2736604011559024b3ec79fcd3959"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"a30532e28f5d3fa6682fcdb88bff745de88b0287","unresolved":true,"context_lines":[{"line_number":169,"context_line":"                        client._child_watchers.pop(request.path, None)"},{"line_number":170,"context_line":"                    elif request.watcher_type \u003d\u003d 2:"},{"line_number":171,"context_line":"                        client._data_watchers.pop(request.path, None)"},{"line_number":172,"context_line":"                    elif request.watcher_type \u003d\u003d 3:"},{"line_number":173,"context_line":"                        client._child_watchers.pop(request.path, None)"},{"line_number":174,"context_line":"                        client._data_watchers.pop(request.path, None)"},{"line_number":175,"context_line":"                        client._persistent_watchers.pop(request.path, None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5291cc5c_22288520","line":172,"updated":"2023-04-10 21:11:08.000000000","message":"I\u0027m guessing the hardcoded values here of 1, 2, and 3 come from upstream. Would probably make this a lot more readable to use constants.\n\nAlso, should we have a remove persistent watch and remove persistent recursive watch watcher_type values too?","commit_id":"1a3703e3f9d2736604011559024b3ec79fcd3959"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1896a0b70530b5fc49c52df9da626c61b3559995","unresolved":false,"context_lines":[{"line_number":169,"context_line":"                        client._child_watchers.pop(request.path, None)"},{"line_number":170,"context_line":"                    elif request.watcher_type \u003d\u003d 2:"},{"line_number":171,"context_line":"                        client._data_watchers.pop(request.path, None)"},{"line_number":172,"context_line":"                    elif request.watcher_type \u003d\u003d 3:"},{"line_number":173,"context_line":"                        client._child_watchers.pop(request.path, None)"},{"line_number":174,"context_line":"                        client._data_watchers.pop(request.path, None)"},{"line_number":175,"context_line":"                        client._persistent_watchers.pop(request.path, None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"c04a34fa_5421e3a0","line":172,"in_reply_to":"5291cc5c_22288520","updated":"2023-04-10 21:40:56.000000000","message":"Can switch to constants.  I\u0027ll do that in a followup.\n\nAs for the additional types -- that\u0027s not really our call.  This is the ZooKeeper design, and we just get to match server behavior.","commit_id":"1a3703e3f9d2736604011559024b3ec79fcd3959"},{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"479457826d7ba2bea06d5cbb027dfff68241abc5","unresolved":true,"context_lines":[{"line_number":53,"context_line":"        parts \u003d path.split(\"/\")"},{"line_number":54,"context_line":"        watchers \u003d []"},{"line_number":55,"context_line":"        for count in range(len(parts)):"},{"line_number":56,"context_line":"            candidate \u003d \"/\".join(parts[: count + 1])"},{"line_number":57,"context_line":"            watchers.extend("},{"line_number":58,"context_line":"                self.client._persistent_recursive_watchers.get(candidate, [])"},{"line_number":59,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":6,"id":"f0d5b74c_73f78d23","line":56,"updated":"2023-04-10 22:52:23.000000000","message":"Candidate would be just \"\" if it was the root. Do we need a check like:\n\n```\nif not candidate:\n    candidate \u003d \u0027/\u0027\n```","commit_id":"0542fd94ce01b2aae5cf760bc13dd33b320a162a"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"6bcc3481e2ce0e418766b68d64da2b25b3e2ede2","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        parts \u003d path.split(\"/\")"},{"line_number":54,"context_line":"        watchers \u003d []"},{"line_number":55,"context_line":"        for count in range(len(parts)):"},{"line_number":56,"context_line":"            candidate \u003d \"/\".join(parts[: count + 1])"},{"line_number":57,"context_line":"            watchers.extend("},{"line_number":58,"context_line":"                self.client._persistent_recursive_watchers.get(candidate, [])"},{"line_number":59,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":6,"id":"b1eb04f4_6ba058dc","line":56,"in_reply_to":"f0d5b74c_73f78d23","updated":"2023-04-10 22:56:04.000000000","message":"That probably makes the most sense.","commit_id":"0542fd94ce01b2aae5cf760bc13dd33b320a162a"}],"nodepool/zk/vendor/states.py":[{"author":{"_account_id":4146,"name":"Clark Boylan","email":"cboylan@sapwetik.org","username":"cboylan"},"change_message_id":"a30532e28f5d3fa6682fcdb88bff745de88b0287","unresolved":true,"context_lines":[{"line_number":23,"context_line":"        paths underneath the supplied path as well."},{"line_number":24,"context_line":"    \"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    PERSISTENT \u003d 0"},{"line_number":27,"context_line":"    PERSISTENT_RECURSIVE \u003d 1"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"47e7cf34_4e0b2615","line":26,"updated":"2023-04-10 21:11:08.000000000","message":"Should zero be the default which is non persistent non recursive? Then 1 for persistent and 3 (or 2 depending on whether not this is bitwise) for persistent recursive?","commit_id":"1a3703e3f9d2736604011559024b3ec79fcd3959"},{"author":{"_account_id":1,"name":"James E. Blair","email":"jim@acmegating.com","username":"corvus"},"change_message_id":"1896a0b70530b5fc49c52df9da626c61b3559995","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        paths underneath the supplied path as well."},{"line_number":24,"context_line":"    \"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    PERSISTENT \u003d 0"},{"line_number":27,"context_line":"    PERSISTENT_RECURSIVE \u003d 1"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a9e70ae_9b5a5c00","line":26,"in_reply_to":"47e7cf34_4e0b2615","updated":"2023-04-10 21:40:56.000000000","message":"This is set by the ZK protocol, so not our choice.","commit_id":"1a3703e3f9d2736604011559024b3ec79fcd3959"}]}
