)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"f6236a1c51222a936fe938447b1e2d1b66632e7a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ea6305df_fb1380ef","updated":"2026-09-02 14:50:21.000000000","message":"I like this!","commit_id":"c3d5f7a7c4681da53e85c9624fbce6f3325414af"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f021977d7429d58fd530478077bb0601521c97a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"70ae5251_c6ddab08","updated":"2026-09-02 21:15:28.000000000","message":"i think this quarantine change is too broad/permissive - i\u0027m more pessemistic about UID mishaps or the `user \u003d swift` getting dropped from a foreground job.  IDK, you could argue it\u0027s paranoid... s8k had a whole ssnoded subsystem to chown data dirs as necessary!","commit_id":"e47db34d78afb28171b3fed214168ad1f09358af"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"89407bf95636def737ef4d4b075145107d9258ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c4d851c7_d6ecfaeb","updated":"2026-09-02 19:41:55.000000000","message":"recheck\n\n\u003e Error: Failed to update project openstack/glance","commit_id":"e47db34d78afb28171b3fed214168ad1f09358af"},{"author":{"_account_id":38767,"name":"Wael Halbawi","display_name":"Wael Halbawi","email":"whalbawi@nvidia.com","username":"whalbawi"},"change_message_id":"0465f256dacdca07d1df49a368be921eddc4ac94","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"209abd3a_8474ba36","updated":"2026-09-10 23:28:51.000000000","message":"LGTM!","commit_id":"be191cf7d452c852995b21b1e6584727bc729388"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"77df01a67471df4f6a4464458856552f7c0e8f13","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5b45d9ea_adb60ac5","updated":"2026-09-11 07:28:51.000000000","message":"LGTM.","commit_id":"be191cf7d452c852995b21b1e6584727bc729388"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"25de595c47084d9eb3d3863a57438536392c8ffb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"637b2b29_d039e0ec","updated":"2026-09-10 16:13:12.000000000","message":"the idea is solid, the implementation looks correct to me\n\nthe cleanup is nice, this looks like a solid improvement over the previous patch set","commit_id":"be191cf7d452c852995b21b1e6584727bc729388"}],"swift/obj/replicator.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f021977d7429d58fd530478077bb0601521c97a","unresolved":true,"context_lines":[{"line_number":584,"context_line":"                        # replicated though."},{"line_number":585,"context_line":"                        self.logger.info(\"Removing %s objects\","},{"line_number":586,"context_line":"                                         len(delete_objs))"},{"line_number":587,"context_line":"                        _junk, error_paths \u003d self.delete_handoff_objs("},{"line_number":588,"context_line":"                            job, delete_objs)"},{"line_number":589,"context_line":"                        # error_paths will have stuff that successfully"},{"line_number":590,"context_line":"                        # replicated but whose suffix couldn\u0027t be deleted."}],"source_content_type":"text/x-python","patch_set":2,"id":"6147311f_28584e85","side":"PARENT","line":587,"updated":"2026-09-02 21:15:28.000000000","message":"IIUC these were the only consumers of this helpers return value\n\n138342: Enable Object Replicator\u0027s failure count in recon | https://review.opendev.org/c/openstack/swift/+/138342","commit_id":"422a842dd39d0d91f4b38285776b677cc99e1c6b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d7fb60f11d21d492ecef6f479553d773ff670d74","unresolved":false,"context_lines":[{"line_number":584,"context_line":"                        # replicated though."},{"line_number":585,"context_line":"                        self.logger.info(\"Removing %s objects\","},{"line_number":586,"context_line":"                                         len(delete_objs))"},{"line_number":587,"context_line":"                        _junk, error_paths \u003d self.delete_handoff_objs("},{"line_number":588,"context_line":"                            job, delete_objs)"},{"line_number":589,"context_line":"                        # error_paths will have stuff that successfully"},{"line_number":590,"context_line":"                        # replicated but whose suffix couldn\u0027t be deleted."}],"source_content_type":"text/x-python","patch_set":2,"id":"7e1cd9c7_16258f57","side":"PARENT","line":587,"in_reply_to":"6147311f_28584e85","updated":"2026-09-03 17:31:19.000000000","message":"I should\u0027ve looked at the history! I\u0027d assumed that the `_junk` was us changing how we use the return and not wanting to break some other place that still needed `success_paths` -- nope, we just *never* needed to track that!","commit_id":"422a842dd39d0d91f4b38285776b677cc99e1c6b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d7fb60f11d21d492ecef6f479553d773ff670d74","unresolved":true,"context_lines":[{"line_number":619,"context_line":"            if e.errno not in (errno.ENOENT, errno.ENOTEMPTY, errno.ENODATA,"},{"line_number":620,"context_line":"                               EUCLEAN):"},{"line_number":621,"context_line":"                # Don\u0027t worry if there was a race to create or delete,"},{"line_number":622,"context_line":"                # or some disk corruption that happened after the sync"},{"line_number":623,"context_line":"                raise"},{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    def delete_handoff_objs(self, job, delete_objs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"539aeda0_df986b85","line":622,"range":{"start_line":622,"start_character":21,"end_line":622,"end_character":41},"updated":"2026-09-03 17:31:19.000000000","message":"Well now I wonder if we should be doing some quarantining here, too...\n\nGets messier though, since we don\u0027t really know where in the FS tree popped the error, so we don\u0027t know the appropriate level to quarantine.","commit_id":"e47db34d78afb28171b3fed214168ad1f09358af"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f021977d7429d58fd530478077bb0601521c97a","unresolved":true,"context_lines":[{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    def delete_handoff_objs(self, job, delete_objs):"},{"line_number":626,"context_line":"        success_paths \u003d []"},{"line_number":627,"context_line":"        error_paths \u003d []"},{"line_number":628,"context_line":"        for object_hash in delete_objs:"},{"line_number":629,"context_line":"            object_path \u003d storage_directory(job[\u0027obj_path\u0027], job[\u0027partition\u0027],"},{"line_number":630,"context_line":"                                            object_hash)"}],"source_content_type":"text/x-python","patch_set":2,"id":"de4952b2_584d4fa2","line":627,"updated":"2026-09-02 21:15:28.000000000","message":"I think the accumulators should be removed","commit_id":"e47db34d78afb28171b3fed214168ad1f09358af"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d7fb60f11d21d492ecef6f479553d773ff670d74","unresolved":false,"context_lines":[{"line_number":624,"context_line":""},{"line_number":625,"context_line":"    def delete_handoff_objs(self, job, delete_objs):"},{"line_number":626,"context_line":"        success_paths \u003d []"},{"line_number":627,"context_line":"        error_paths \u003d []"},{"line_number":628,"context_line":"        for object_hash in delete_objs:"},{"line_number":629,"context_line":"            object_path \u003d storage_directory(job[\u0027obj_path\u0027], job[\u0027partition\u0027],"},{"line_number":630,"context_line":"                                            object_hash)"}],"source_content_type":"text/x-python","patch_set":2,"id":"83bedcba_13dcd11a","line":627,"in_reply_to":"de4952b2_584d4fa2","updated":"2026-09-03 17:31:19.000000000","message":"Done","commit_id":"e47db34d78afb28171b3fed214168ad1f09358af"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8f021977d7429d58fd530478077bb0601521c97a","unresolved":true,"context_lines":[{"line_number":638,"context_line":"                    continue"},{"line_number":639,"context_line":"                self.logger.error(\u0027Failed to delete %r (%s); quarantining.\u0027,"},{"line_number":640,"context_line":"                                  suffix_dir, e)"},{"line_number":641,"context_line":"                quarantine_dir_renamer(dirname(job[\u0027obj_path\u0027]), suffix_dir)"},{"line_number":642,"context_line":"        return success_paths, error_paths"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"    def update(self, job):"}],"source_content_type":"text/x-python","patch_set":2,"id":"a6d8c352_a76c83b7","line":641,"updated":"2026-09-02 21:15:28.000000000","message":"meh, I think by convention we should prefer to white list the errors we want to quarantine here, e.g.\n\ncurrent convention would quarantine on `(ENOTDIR, ENODATA, EUCLEAN)`\n\n\u003e ENOTDIR quarantines the malformed directory.\n\u003e ENODATA / EUCLEAN—known unreadable/corrupt-storage conditions\n\nfor `EACCES, EPERM`, TBD, etc - I think we keep the existing traceback logging until we observe corruption that fails in that manor.","commit_id":"e47db34d78afb28171b3fed214168ad1f09358af"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d7fb60f11d21d492ecef6f479553d773ff670d74","unresolved":false,"context_lines":[{"line_number":638,"context_line":"                    continue"},{"line_number":639,"context_line":"                self.logger.error(\u0027Failed to delete %r (%s); quarantining.\u0027,"},{"line_number":640,"context_line":"                                  suffix_dir, e)"},{"line_number":641,"context_line":"                quarantine_dir_renamer(dirname(job[\u0027obj_path\u0027]), suffix_dir)"},{"line_number":642,"context_line":"        return success_paths, error_paths"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"    def update(self, job):"}],"source_content_type":"text/x-python","patch_set":2,"id":"766ab817_184e5733","line":641,"in_reply_to":"a6d8c352_a76c83b7","updated":"2026-09-03 17:31:19.000000000","message":"Done","commit_id":"e47db34d78afb28171b3fed214168ad1f09358af"},{"author":{"_account_id":38767,"name":"Wael Halbawi","display_name":"Wael Halbawi","email":"whalbawi@nvidia.com","username":"whalbawi"},"change_message_id":"0465f256dacdca07d1df49a368be921eddc4ac94","unresolved":true,"context_lines":[{"line_number":637,"context_line":"                    self.logger.error("},{"line_number":638,"context_line":"                        \u0027Failed to delete %r (%s); quarantining.\u0027,"},{"line_number":639,"context_line":"                        suffix_dir, e)"},{"line_number":640,"context_line":"                    quarantine_dir_renamer(dirname(job[\u0027obj_path\u0027]),"},{"line_number":641,"context_line":"                                           suffix_dir)"},{"line_number":642,"context_line":"                else:"},{"line_number":643,"context_line":"                    self.logger.exception("}],"source_content_type":"text/x-python","patch_set":3,"id":"94b174e3_0d7ad078","line":640,"updated":"2026-09-10 23:28:51.000000000","message":"This might throw because of the underlying `os.rename`. The agents and I think that may discard a bunch of revert jobs in this cycle, which I guess is not a big deal because they can be handled in the next cycle.","commit_id":"be191cf7d452c852995b21b1e6584727bc729388"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"77df01a67471df4f6a4464458856552f7c0e8f13","unresolved":true,"context_lines":[{"line_number":637,"context_line":"                    self.logger.error("},{"line_number":638,"context_line":"                        \u0027Failed to delete %r (%s); quarantining.\u0027,"},{"line_number":639,"context_line":"                        suffix_dir, e)"},{"line_number":640,"context_line":"                    quarantine_dir_renamer(dirname(job[\u0027obj_path\u0027]),"},{"line_number":641,"context_line":"                                           suffix_dir)"},{"line_number":642,"context_line":"                else:"},{"line_number":643,"context_line":"                    self.logger.exception("}],"source_content_type":"text/x-python","patch_set":3,"id":"11899e7e_297fcd06","line":640,"in_reply_to":"94b174e3_0d7ad078","updated":"2026-09-11 07:28:51.000000000","message":"That\u0027s a good point - looks like this is addressed in your patch 1005145: sq? replicator: Continue handoff cleanup after quarantine failures | https://review.opendev.org/c/openstack/swift/+/1005145\n\nLet\u0027s merge that one after CI issues are fixed as well.","commit_id":"be191cf7d452c852995b21b1e6584727bc729388"}]}
