)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":20178,"name":"Tore Anderson","email":"tore@fud.no","username":"tore"},"change_message_id":"77e206d9d82151c563e1b0bbba33c7ead3e8a025","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"70b36e57_49a547ef","updated":"2026-07-22 10:53:24.000000000","message":"recheck","commit_id":"0f1d65239d19f6ad46d39b789d4f69ba93e8f310"},{"author":{"_account_id":20178,"name":"Tore Anderson","email":"tore@fud.no","username":"tore"},"change_message_id":"3f72c01c60ca26dc86c332258c27c1f7b80df7e1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b3489c87_ec874ad2","updated":"2026-07-22 13:00:43.000000000","message":"recheck","commit_id":"0f1d65239d19f6ad46d39b789d4f69ba93e8f310"},{"author":{"_account_id":20178,"name":"Tore Anderson","email":"tore@fud.no","username":"tore"},"change_message_id":"d302d06b299490c39a062bf714d14d921e2f0dfb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"48859c70_df5e0d66","updated":"2026-07-23 07:19:04.000000000","message":"recheck - as it looks like it\u0027s random tests/modules that are failing on each attempt, and on IRC people are saying the CI itself is flaky.","commit_id":"0f1d65239d19f6ad46d39b789d4f69ba93e8f310"},{"author":{"_account_id":20178,"name":"Tore Anderson","email":"tore@fud.no","username":"tore"},"change_message_id":"64c6e35d1e8c97ca282a403a1b7b68029818f572","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7f356b2d_b4babd08","updated":"2026-07-23 12:46:36.000000000","message":"recheck OK, so every single test Zuul performs has succeeded at least once, so clearly nothing is wrong with the change itself. I guess I\u0027ll just have to retry and retry and retry. *sigh*","commit_id":"0f1d65239d19f6ad46d39b789d4f69ba93e8f310"},{"author":{"_account_id":20178,"name":"Tore Anderson","email":"tore@fud.no","username":"tore"},"change_message_id":"5c513d2a03a0bb4d6128e9aa3e7e1c4c27b8ff12","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8f28fd86_30df6965","updated":"2026-07-27 08:12:13.000000000","message":"recheck again","commit_id":"0f1d65239d19f6ad46d39b789d4f69ba93e8f310"},{"author":{"_account_id":20178,"name":"Tore Anderson","email":"tore@fud.no","username":"tore"},"change_message_id":"ed6be52e6fd0e8e7e2202da3d9ff90fe2a175cfa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"afa42392_c08da0a3","updated":"2026-07-23 10:51:53.000000000","message":"recheck again","commit_id":"0f1d65239d19f6ad46d39b789d4f69ba93e8f310"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"0479f111a17c308f5253aa74f317a522512b5d95","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6a94fee1_c03aadf0","updated":"2026-07-30 11:49:38.000000000","message":"recheck https://review.opendev.org/c/openstack/requirements/+/999181 got merged","commit_id":"0f1d65239d19f6ad46d39b789d4f69ba93e8f310"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"b96186eebd8ea235474236089ee8d1f0f56eaeb2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"717af361_1b0aee35","updated":"2026-09-04 14:57:41.000000000","message":"recheck failure is not related to the patch","commit_id":"cd9be2950d02e30532ac01b0ae621f5d036791d9"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"6005d6c3249e841e984291f1851e80108006705a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"dc4bd032_e44eee27","updated":"2026-09-04 15:36:07.000000000","message":"the neutron-tempest-plugin-designate-scenario broke recently (it passed 2 days ago), but meanwhile, I left some comments inline. Thanks for suggesting this patch","commit_id":"cd9be2950d02e30532ac01b0ae621f5d036791d9"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"4381028105936e9ceb967bc76fb61b0477f83324","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3853dd8b_b284a17b","updated":"2026-09-07 09:32:04.000000000","message":"LGTM","commit_id":"e92b2e8a4d1e05e769d46b5e208145da3217ecd1"},{"author":{"_account_id":22623,"name":"Erik Olof Gunnar Andersson","email":"eandersson@blizzard.com","username":"eoandersson"},"change_message_id":"9c32a5ec3f89ee7bde2cc63ec90a764a4a686816","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"68fb8c66_2380b222","updated":"2026-09-08 09:57:21.000000000","message":"LGTM, can we tie a bug to this as well?","commit_id":"e92b2e8a4d1e05e769d46b5e208145da3217ecd1"},{"author":{"_account_id":20178,"name":"Tore Anderson","email":"tore@fud.no","username":"tore"},"change_message_id":"5d16dd66fad2d73b6011e80d29229f6f40a6e96b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"5014b664_47dfdf11","in_reply_to":"68fb8c66_2380b222","updated":"2026-09-08 10:36:20.000000000","message":"Done: https://bugs.launchpad.net/designate/+bug/2166759","commit_id":"a14d7d1b238e0bb1cb8e91e3e5a57a822301a07f"}],"designate/central/service.py":[{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"6005d6c3249e841e984291f1851e80108006705a","unresolved":true,"context_lines":[{"line_number":1364,"context_line":"            \u0027tenant_id\u0027: context.project_id,"},{"line_number":1365,"context_line":"        }"},{"line_number":1366,"context_line":""},{"line_number":1367,"context_line":"        policy.check(\u0027pool_move_zone\u0027, context, target)"},{"line_number":1368,"context_line":""},{"line_number":1369,"context_line":"        # Get the destination pool"},{"line_number":1370,"context_line":"        zone \u003d self.storage.get_zone(context, zone_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d61cba27_23fe42aa","line":1367,"range":{"start_line":1367,"start_character":8,"end_line":1367,"end_character":55},"updated":"2026-09-04 15:36:07.000000000","message":"create_zone/update_zone/delete_zone/share_zone/create_recordset/delete_recordset all call _enforce_catalog_zone_policy() to prevent direct mutation of catalog zones. pool_move_zone() doesn\u0027t, so a catalog zone can be moved between pools directly — and when it is, both of the new serial-bump calls just no-op (they check the moved zone\u0027s own type and return early on ZONE_CATALOG), so the exact catalog-zone-consistency scenario this patch targets is the one case it doesn\u0027t cover. Should pool_move_zone also be guarded?","commit_id":"0f1d65239d19f6ad46d39b789d4f69ba93e8f310"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"6005d6c3249e841e984291f1851e80108006705a","unresolved":true,"context_lines":[{"line_number":1426,"context_line":"        # task could pick up the source pool\u0027s catalog zone and NOTIFY"},{"line_number":1427,"context_line":"        # secondaries of a new serial before the zone has actually left"},{"line_number":1428,"context_line":"        # that pool."},{"line_number":1429,"context_line":"        self._ensure_catalog_zone_serial_increment("},{"line_number":1430,"context_line":"            context, zone, pool_id\u003dorig_pool_id)"},{"line_number":1431,"context_line":"        self._ensure_catalog_zone_serial_increment(context, zone)"},{"line_number":1432,"context_line":""},{"line_number":1433,"context_line":"        zone.refresh \u003d self._generate_soa_refresh_interval()"}],"source_content_type":"text/x-python","patch_set":2,"id":"6cbb1aea_85405dd2","line":1430,"range":{"start_line":1429,"start_character":8,"end_line":1430,"end_character":48},"updated":"2026-09-04 15:36:07.000000000","message":"These new _ensure_catalog_zone_serial_increment() calls run after the zone\u0027s pool_id change is already committed to storage but before self.worker_api.update_zone(context, zone) dispatches the actual backend move. There\u0027s no try/except here and no surrounding transaction — if either call raises (e.g. PoolNotFound, or a transient storage error), the method aborts before the worker is ever notified. The zone\u0027s pool_id/action\u003dUPDATE/status\u003dPENDING are already persisted, so the zone gets stuck in PENDING indefinitely with nothing to retry the worker dispatch.\n\nCould we either (a) wrap these calls so a failure here doesn\u0027t prevent the worker dispatch that must follow, or (b) move them to a point where failure doesn\u0027t leave the zone half-migrated?","commit_id":"0f1d65239d19f6ad46d39b789d4f69ba93e8f310"},{"author":{"_account_id":31664,"name":"Omer Schwartz","email":"oschwart@redhat.com","username":"oschwart"},"change_message_id":"6005d6c3249e841e984291f1851e80108006705a","unresolved":true,"context_lines":[{"line_number":3068,"context_line":"            return"},{"line_number":3069,"context_line":""},{"line_number":3070,"context_line":"        pool_id \u003d pool_id or zone.pool_id"},{"line_number":3071,"context_line":"        pool \u003d self.storage.find_pool(context, criterion\u003d{\u0027id\u0027: pool_id})"},{"line_number":3072,"context_line":""},{"line_number":3073,"context_line":"        try:"},{"line_number":3074,"context_line":"            catalog_zone \u003d self.storage.get_catalog_zone(context, pool)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d93b9c86_7301934c","line":3071,"range":{"start_line":3071,"start_character":8,"end_line":3071,"end_character":73},"updated":"2026-09-04 15:36:07.000000000","message":"This find_pool() call is outside the try/except that only catches ZoneNotFound. If the pool being looked up (source or destination) is deleted concurrently — plausible given the window between committing the zone\u0027s new pool_id and this lookup by orig_pool_id in pool_move_zone — PoolNotFound propagates uncaught. Combined with the point above, this both fails the API call and leaves the zone move half-applied. Should PoolNotFound be caught here too (treated the same as \"nothing to do\"), or is failing loudly intentional?","commit_id":"0f1d65239d19f6ad46d39b789d4f69ba93e8f310"},{"author":{"_account_id":20178,"name":"Tore Anderson","email":"tore@fud.no","username":"tore"},"change_message_id":"79ac1a301b5b0472ddb5ad15392b3f4e5e1325ba","unresolved":false,"context_lines":[{"line_number":1364,"context_line":"            \u0027tenant_id\u0027: context.project_id,"},{"line_number":1365,"context_line":"        }"},{"line_number":1366,"context_line":""},{"line_number":1367,"context_line":"        policy.check(\u0027pool_move_zone\u0027, context, target)"},{"line_number":1368,"context_line":""},{"line_number":1369,"context_line":"        # Get the destination pool"},{"line_number":1370,"context_line":"        zone \u003d self.storage.get_zone(context, zone_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"82b2639e_e2d0b525","line":1367,"in_reply_to":"d61cba27_23fe42aa","updated":"2026-09-07 05:59:01.000000000","message":"Done, guarded the same way the other zone-mutating methods are.","commit_id":"e92b2e8a4d1e05e769d46b5e208145da3217ecd1"},{"author":{"_account_id":20178,"name":"Tore Anderson","email":"tore@fud.no","username":"tore"},"change_message_id":"79ac1a301b5b0472ddb5ad15392b3f4e5e1325ba","unresolved":false,"context_lines":[{"line_number":1427,"context_line":"        zone.status \u003d constants.PENDING"},{"line_number":1428,"context_line":"        self.worker_api.update_zone(context, zone)"},{"line_number":1429,"context_line":""},{"line_number":1430,"context_line":"        # The move is now committed and dispatched to the worker: bump the"},{"line_number":1431,"context_line":"        # source pool\u0027s catalog zone serial (it has lost a zone) and the"},{"line_number":1432,"context_line":"        # destination pool\u0027s (it has gained one). Doing this only now,"},{"line_number":1433,"context_line":"        # rather than before the move is committed, avoids a race where"}],"source_content_type":"text/x-python","patch_set":4,"id":"4d5a565d_694b5baa","line":1430,"in_reply_to":"6cbb1aea_85405dd2","updated":"2026-09-07 05:59:01.000000000","message":"Done, reordered so the worker dispatch happens first.","commit_id":"e92b2e8a4d1e05e769d46b5e208145da3217ecd1"},{"author":{"_account_id":20178,"name":"Tore Anderson","email":"tore@fud.no","username":"tore"},"change_message_id":"79ac1a301b5b0472ddb5ad15392b3f4e5e1325ba","unresolved":false,"context_lines":[{"line_number":3068,"context_line":"            return self.storage.create_service_status("},{"line_number":3069,"context_line":"                context, service_status)"},{"line_number":3070,"context_line":""},{"line_number":3071,"context_line":"    def _ensure_catalog_zone_serial_increment(self, context, zone,"},{"line_number":3072,"context_line":"                                              pool_id\u003dNone):"},{"line_number":3073,"context_line":"        if zone.type \u003d\u003d constants.ZONE_CATALOG:"},{"line_number":3074,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":4,"id":"9e02a94d_d3108c34","line":3071,"in_reply_to":"d93b9c86_7301934c","updated":"2026-09-07 05:59:01.000000000","message":"Done, caught alongside the existing ZoneNotFound. Thank you for the review!","commit_id":"e92b2e8a4d1e05e769d46b5e208145da3217ecd1"}]}
