)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8598495a626e22de3697817d7c159bed646430d8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"682c79ec_b08d0eaa","updated":"2025-09-16 14:42:37.000000000","message":"In many ways I was surprised these were the only places unittests were relying on the ability to create objects with the same timestamp over existing data files!","commit_id":"4bca5e6c853aa4e8a968c07427d2fd574f716f05"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b999c9da416726ebe61768dce80a535679ddd917","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"806dcda4_bb5674c7","updated":"2025-09-16 10:56:24.000000000","message":"re. test_auditor.py: +2 I assume a later patch in the chain caused these tests to fail, but the changes makes sense anyway.\n\nre. test_reconstructor.py: seems unrelated and unnecessary in isolation in this patch","commit_id":"4bca5e6c853aa4e8a968c07427d2fd574f716f05"}],"test/unit/obj/test_auditor.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b999c9da416726ebe61768dce80a535679ddd917","unresolved":true,"context_lines":[{"line_number":353,"context_line":""},{"line_number":354,"context_line":"        with self.disk_file.create() as writer:"},{"line_number":355,"context_line":"            writer.write(data)"},{"line_number":356,"context_line":"            writer.put(metadata)"},{"line_number":357,"context_line":"            writer.commit(ts2)"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        auditor_worker.object_audit("}],"source_content_type":"text/x-python","patch_set":1,"id":"53bc997e_48e8cbc7","line":356,"updated":"2025-09-16 10:56:24.000000000","message":"FWIW I prefer the way this is written at line 714 i.e. using a fresh metadata dict, because it avoids any confusing suggestion that IRL a second write to the same object somehow re-uses and updates existing metadata.","commit_id":"4bca5e6c853aa4e8a968c07427d2fd574f716f05"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8598495a626e22de3697817d7c159bed646430d8","unresolved":true,"context_lines":[{"line_number":353,"context_line":""},{"line_number":354,"context_line":"        with self.disk_file.create() as writer:"},{"line_number":355,"context_line":"            writer.write(data)"},{"line_number":356,"context_line":"            writer.put(metadata)"},{"line_number":357,"context_line":"            writer.commit(ts2)"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"        auditor_worker.object_audit("}],"source_content_type":"text/x-python","patch_set":1,"id":"5a154a42_c79de5e8","line":356,"in_reply_to":"53bc997e_48e8cbc7","updated":"2025-09-16 14:42:37.000000000","message":"sure, honestly it bit me at first to when I fixed writer.commit(ts2) and didn\u0027t update the metadata.","commit_id":"4bca5e6c853aa4e8a968c07427d2fd574f716f05"}],"test/unit/obj/test_reconstructor.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b999c9da416726ebe61768dce80a535679ddd917","unresolved":true,"context_lines":[{"line_number":259,"context_line":"                for obj_num in range(0, 3):"},{"line_number":260,"context_line":"                    fi \u003d scenarios[part_num](obj_num)"},{"line_number":261,"context_line":"                    if (part_num, fi) in created:"},{"line_number":262,"context_line":"                        continue"},{"line_number":263,"context_line":"                    df \u003d self._create_diskfile("},{"line_number":264,"context_line":"                        part\u003dpart_num, object_name\u003d\u0027o\u0027 + str(obj_set),"},{"line_number":265,"context_line":"                        policy\u003dpolicy, frag_index\u003dfi,"}],"source_content_type":"text/x-python","patch_set":1,"id":"00e241af_3abb2f9a","line":262,"updated":"2025-09-16 10:56:24.000000000","message":"maybe this has bled in from another patch in the chain - presumably some other change in another patch makes this necessary/correct, but I don\u0027t feel I can just consider it a \"drive-by\" in *this* patch.","commit_id":"4bca5e6c853aa4e8a968c07427d2fd574f716f05"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8598495a626e22de3697817d7c159bed646430d8","unresolved":true,"context_lines":[{"line_number":259,"context_line":"                for obj_num in range(0, 3):"},{"line_number":260,"context_line":"                    fi \u003d scenarios[part_num](obj_num)"},{"line_number":261,"context_line":"                    if (part_num, fi) in created:"},{"line_number":262,"context_line":"                        continue"},{"line_number":263,"context_line":"                    df \u003d self._create_diskfile("},{"line_number":264,"context_line":"                        part\u003dpart_num, object_name\u003d\u0027o\u0027 + str(obj_set),"},{"line_number":265,"context_line":"                        policy\u003dpolicy, frag_index\u003dfi,"}],"source_content_type":"text/x-python","patch_set":1,"id":"b9e866b4_3bb6010f","line":262,"in_reply_to":"00e241af_3abb2f9a","updated":"2025-09-16 14:42:37.000000000","message":"no i put it here on purpose - it\u0027s not a drive-by - it does exactly what the commit message says: \"do not create timestamp collision unnecessarily\"\n\nthis change comes after the \"static setup\" assertions - this continue doesn\u0027t change the outcome of the setup - it *just* avoids double work!\n\nFWIW 961370: tests: simplify TestGlobalSetupObjectReconstructor setUp | https://review.opendev.org/c/openstack/swift/+/961370 would have the same effect I like it quite a lot!","commit_id":"4bca5e6c853aa4e8a968c07427d2fd574f716f05"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9eafb667c1c1f353e7db150d7efcde33859d3478","unresolved":true,"context_lines":[{"line_number":259,"context_line":"                for obj_num in range(0, 3):"},{"line_number":260,"context_line":"                    fi \u003d scenarios[part_num](obj_num)"},{"line_number":261,"context_line":"                    if (part_num, fi) in created:"},{"line_number":262,"context_line":"                        continue"},{"line_number":263,"context_line":"                    df \u003d self._create_diskfile("},{"line_number":264,"context_line":"                        part\u003dpart_num, object_name\u003d\u0027o\u0027 + str(obj_set),"},{"line_number":265,"context_line":"                        policy\u003dpolicy, frag_index\u003dfi,"}],"source_content_type":"text/x-python","patch_set":1,"id":"c4289bbd_8aea2f9e","line":262,"in_reply_to":"b9e866b4_3bb6010f","updated":"2025-09-16 15:01:40.000000000","message":"yep, I see it now I spent some hours on the test_reconstructor setup, and having the realisation that it was creating the *same* fragment files over and over for no apparent reason","commit_id":"4bca5e6c853aa4e8a968c07427d2fd574f716f05"}]}
