)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"669c8bd9e9a4d38b3a70800beafa5b1d7d25ca30","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b2f6a57b_721274f0","updated":"2026-08-21 19:41:51.000000000","message":"I think is overall good to move out behavior that is specific to checksums into the controller to handle them.\n\nIn the future I think the MPU controller we end up doing mostly the same kind of thing, and good thing the helper functions will be able to filter out sysmeta we don\u0027t want in the final response, so we won\u0027t have to worry about whats actually inside `req.checksum_sysmeta_headers` which is good too. I think this is moving us in the same direction with MPUs which I like, thanks for this @alistairncoles@gmail.com, I\u0027ll squash it in!","commit_id":"6d8820223168d4a0d0bddd5107ed78fcd041fed7"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"cc5f1a98b099d6adc9ba32c887d50d2b3ebb5959","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b3cf16fd_a2687729","updated":"2026-08-21 20:19:32.000000000","message":"Squashed in 991516: s3api: Checksum Persistence for Full Object Upload PUTs | https://review.opendev.org/c/openstack/swift/+/991516\nTried to abandon... but I don\u0027t think I can","commit_id":"196a7b42bb1e9ee80bf7b62434437e9bb63f6ef6"}],"swift/common/middleware/s3api/controllers/obj.py":[{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"669c8bd9e9a4d38b3a70800beafa5b1d7d25ca30","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        checksum_mode \u003d normalize_checksum_mode("},{"line_number":123,"context_line":"            req.headers.get(\u0027x-amz-checksum-mode\u0027))"},{"line_number":124,"context_line":"        if (checksum_mode \u003d\u003d \u0027ENABLED\u0027"},{"line_number":125,"context_line":"                and \u0027range\u0027 not in req.headers"},{"line_number":126,"context_line":"                and part_number is None"},{"line_number":127,"context_line":"                and resp.status_int \u003d\u003d HTTP_OK):"},{"line_number":128,"context_line":"            resp.headers.update("}],"source_content_type":"text/x-python","patch_set":1,"id":"57bd9ef2_f2caedbd","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":46},"updated":"2026-08-21 19:41:51.000000000","message":"Will probably end up putting this in a helper","commit_id":"6d8820223168d4a0d0bddd5107ed78fcd041fed7"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1b789a5fcab69137a1bb835715aae9fb350d1d84","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        # req.persist_request_checksum was called."},{"line_number":205,"context_line":"        if req.checksum_sysmeta_headers:"},{"line_number":206,"context_line":"            resp.headers.update("},{"line_number":207,"context_line":"                checksum_sysmeta_to_response_headers(req.checksum_sysmeta_headers))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        if \u0027X-Amz-Copy-Source\u0027 in req.headers:"},{"line_number":210,"context_line":"            last_modified_ts \u003d S3Timestamp("}],"source_content_type":"text/x-python","patch_set":1,"id":"89a919c5_a48a40f7","line":207,"updated":"2026-08-21 17:24:22.000000000","message":"pep8: E501 line too long (83 \u003e 79 characters)","commit_id":"6d8820223168d4a0d0bddd5107ed78fcd041fed7"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"6e4ea49d7e83523f6693e5419601e5ad7aa3e02f","unresolved":true,"context_lines":[{"line_number":200,"context_line":"        resp \u003d req.get_response(self.app)"},{"line_number":201,"context_line":"        # Swift does not echo newly persisted sysmeta headers in PUT responses,"},{"line_number":202,"context_line":"        # so inject the checksum response headers based on the sysmeta sent"},{"line_number":203,"context_line":"        # with the request. The request will only have this sysmeta if"},{"line_number":204,"context_line":"        # req.persist_request_checksum was called."},{"line_number":205,"context_line":"        if req.checksum_sysmeta_headers:"},{"line_number":206,"context_line":"            resp.headers.update("}],"source_content_type":"text/x-python","patch_set":2,"id":"c2babe46_4c764527","line":203,"range":{"start_line":203,"start_character":28,"end_line":203,"end_character":67},"updated":"2026-08-21 21:10:42.000000000","message":"Actually, there is a case where this is NOT true. For instance, if we have a MPU that is not checksum-aware (when the client did not specify a checksum on Create) then Uploaded parts still echo the checksum headers, which with this kind of approach would have to either been obtained from `req.checksum_sysmeta.headers` or injected manually (which not too sure we want to have 2 patterns of getting request sysmeta)\n\nI could see in future patches that the attribute `req.checksum_sysmeta_headers` starts returning sysmeta based on `ChecksummingInput` (which aligns with how UploadPart might do it)\n\nTl;dr, might be good to not outright assert this and maybe just say `The request will have this sysmeta if req.persist_request_checksum was called.","commit_id":"196a7b42bb1e9ee80bf7b62434437e9bb63f6ef6"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"nmartes@NVIDIA.com","username":"nmartes"},"change_message_id":"26dc429d9722c1e391d6d194b77111703b93d310","unresolved":true,"context_lines":[{"line_number":200,"context_line":"        resp \u003d req.get_response(self.app)"},{"line_number":201,"context_line":"        # Swift does not echo newly persisted sysmeta headers in PUT responses,"},{"line_number":202,"context_line":"        # so inject the checksum response headers based on the sysmeta sent"},{"line_number":203,"context_line":"        # with the request. The request will only have this sysmeta if"},{"line_number":204,"context_line":"        # req.persist_request_checksum was called."},{"line_number":205,"context_line":"        if req.checksum_sysmeta_headers:"},{"line_number":206,"context_line":"            resp.headers.update("}],"source_content_type":"text/x-python","patch_set":2,"id":"d8e1092a_601c9503","line":203,"range":{"start_line":203,"start_character":28,"end_line":203,"end_character":67},"in_reply_to":"c2babe46_4c764527","updated":"2026-08-21 21:11:17.000000000","message":"I know this does not stricly pertain to the `ObjectController` but I think it is still valuable to fix","commit_id":"196a7b42bb1e9ee80bf7b62434437e9bb63f6ef6"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"90e2c37904f29047aa0fa7d6a54c1f2288d1fc5b","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        # req.persist_request_checksum was called."},{"line_number":205,"context_line":"        if req.checksum_sysmeta_headers:"},{"line_number":206,"context_line":"            resp.headers.update("},{"line_number":207,"context_line":"                checksum_sysmeta_to_response_headers(req.checksum_sysmeta_headers))"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        if \u0027X-Amz-Copy-Source\u0027 in req.headers:"},{"line_number":210,"context_line":"            last_modified_ts \u003d S3Timestamp("}],"source_content_type":"text/x-python","patch_set":2,"id":"0e8f4b13_3e762bc6","line":207,"updated":"2026-08-21 21:26:24.000000000","message":"pep8: E501 line too long (83 \u003e 79 characters)","commit_id":"196a7b42bb1e9ee80bf7b62434437e9bb63f6ef6"}]}
