)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dbf5d5267c52cb9a975b1b5e9f4b939a60e9e8dd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"151aceeb_e24c8f0e","updated":"2026-08-24 14:24:50.000000000","message":"I like the thought that SLO does its own clean up. I\u0027m not sure what that should exactly look like. The propagation of request environs is a little mind-bending.","commit_id":"afbc3c6f9ecdecace34f9456e647d04a5d44de76"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"74a9a2189a0d5f5cef2066baf2292da776412a54","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"52064988_7f87c5d3","updated":"2026-09-18 23:52:14.000000000","message":"Are we at all worried about SLO sysmeta getting copied around after removing SLO from the pipeline? Like, ops have it enabled, users are using it, then they turn it off (maybe accidentally?), there are some copies, and then it gets turned back on...","commit_id":"71e43b790e47708549ea2322f663a97f0353cd7f"}],"swift/common/middleware/copy.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dbf5d5267c52cb9a975b1b5e9f4b939a60e9e8dd","unresolved":true,"context_lines":[{"line_number":551,"context_line":"        # environ. Let both inspect or modify the PUT that receives the source"},{"line_number":552,"context_line":"        # response body, with the source hook first."},{"line_number":553,"context_line":"        copy_source_hooks \u003d ("},{"line_number":554,"context_line":"            source_resp.environ.get(\u0027swift.callback.copy_source_hook\u0027),"},{"line_number":555,"context_line":"            sink_req.environ.get(\u0027swift.callback.copy_source_hook\u0027),"},{"line_number":556,"context_line":"        )"},{"line_number":557,"context_line":"        if any(copy_source_hooks):"}],"source_content_type":"text/x-python","patch_set":2,"id":"c3a55706_30325ffe","line":554,"updated":"2026-08-24 14:24:50.000000000","message":"IIUC this works because:\n\n* copy mw makes a new subrequest for the source GET, which does NOT inherit the s3api request environ.\n\n* swob.Request.get_response() called by copy mw passes the subreq to the swob.Response instance, so source_resp.environ  IS subreq environ\n\n* SLO gets the subreq, installs its copy_hook in the *request* environ, which makes it visible to copy mw source_resp.\n\nI wonder if it would be clearer if the source *request* environ was available here, just to avoid having to understand that the source_resp environ happens to be the same thing.\n\nBut I also wonder if it\u0027s all moot if there\u0027s no reason for SLO to ever expose its sysmeta to leftwards middlewares.","commit_id":"afbc3c6f9ecdecace34f9456e647d04a5d44de76"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"natemartes09@gmail.com","username":"nmartes"},"change_message_id":"32f0c57a4275082bde1bbff41f6cdbcd35b33793","unresolved":true,"context_lines":[{"line_number":551,"context_line":"        # environ. Let both inspect or modify the PUT that receives the source"},{"line_number":552,"context_line":"        # response body, with the source hook first."},{"line_number":553,"context_line":"        copy_source_hooks \u003d ("},{"line_number":554,"context_line":"            source_resp.environ.get(\u0027swift.callback.copy_source_hook\u0027),"},{"line_number":555,"context_line":"            sink_req.environ.get(\u0027swift.callback.copy_source_hook\u0027),"},{"line_number":556,"context_line":"        )"},{"line_number":557,"context_line":"        if any(copy_source_hooks):"}],"source_content_type":"text/x-python","patch_set":2,"id":"0e1bcfba_048806ab","line":554,"in_reply_to":"c3a55706_30325ffe","updated":"2026-08-28 00:46:32.000000000","message":"I also wonder if it could be better if the request environ was just seen here, many hoops to jump through IMHO 😵‍💫","commit_id":"afbc3c6f9ecdecace34f9456e647d04a5d44de76"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"74a9a2189a0d5f5cef2066baf2292da776412a54","unresolved":true,"context_lines":[{"line_number":493,"context_line":"            # First copy existing sysmeta, user meta and other headers from the"},{"line_number":494,"context_line":"            # source to the sink, apart from headers that are conditionally"},{"line_number":495,"context_line":"            # copied below and timestamps."},{"line_number":496,"context_line":"            exclude_headers \u003d (\u0027x-static-large-object\u0027, \u0027x-object-manifest\u0027,"},{"line_number":497,"context_line":"                               \u0027etag\u0027, \u0027content-type\u0027, \u0027x-timestamp\u0027,"},{"line_number":498,"context_line":"                               \u0027x-backend-timestamp\u0027)"},{"line_number":499,"context_line":"            copy_header_subset(source_resp, sink_req,"}],"source_content_type":"text/x-python","patch_set":5,"id":"697bb67c_454be6cd","line":496,"range":{"start_line":496,"start_character":31,"end_line":496,"end_character":54},"updated":"2026-09-18 23:52:14.000000000","message":"Should we move this over to SLO\u0027s copy hook?\n\nShould we do something similar in DLO to have it remove `x-object-manifest` via its own hook?","commit_id":"71e43b790e47708549ea2322f663a97f0353cd7f"}],"swift/common/middleware/slo.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"dbf5d5267c52cb9a975b1b5e9f4b939a60e9e8dd","unresolved":true,"context_lines":[{"line_number":1886,"context_line":"        try:"},{"line_number":1887,"context_line":"            if (req.method in (\u0027GET\u0027, \u0027HEAD\u0027) and"},{"line_number":1888,"context_line":"                    req.environ.get(\u0027swift.source\u0027) \u003d\u003d \u0027SSC\u0027):"},{"line_number":1889,"context_line":"                install_copy_hook(req.environ)"},{"line_number":1890,"context_line":"            if req.method \u003d\u003d \u0027PUT\u0027 and \\"},{"line_number":1891,"context_line":"                    req.params.get(\u0027multipart-manifest\u0027) \u003d\u003d \u0027put\u0027:"},{"line_number":1892,"context_line":"                return self.handle_multipart_put(req, start_response)"}],"source_content_type":"text/x-python","patch_set":2,"id":"6d08d8d4_10fc73dd","line":1889,"updated":"2026-08-24 14:24:50.000000000","message":"do we ever want slo to leak its symeta in GET/HEAD? could we just have it purge all responses of slo sysmeta?","commit_id":"afbc3c6f9ecdecace34f9456e647d04a5d44de76"}],"test/probe/test_s3api_copy_sysmeta.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ac94cd36d73b2130404599366e13e435cbbe3aac","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        source \u003d self._make_name(\u0027swift-slo-source-\u0027).decode()"},{"line_number":155,"context_line":"        destination \u003d self._make_name(\u0027swift-slo-copy-\u0027).decode()"},{"line_number":156,"context_line":"        self._make_swift_slo(source)"},{"line_number":157,"context_line":"        source_headers \u003d self._assert_source_has_slo_sysmeta("},{"line_number":158,"context_line":"            source)"},{"line_number":159,"context_line":"        self._swift_copy(source, destination)"},{"line_number":160,"context_line":"        swift_copy_headers \u003d self.internal_client.get_object_metadata("}],"source_content_type":"text/x-python","patch_set":1,"id":"1d50239d_1c34045b","line":157,"updated":"2026-08-22 01:07:59.000000000","message":"pep8: F841 local variable \u0027source_headers\u0027 is assigned to but never used","commit_id":"e1ef370a864c5c60dcb8acb97a9560c3e39f576c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"ac94cd36d73b2130404599366e13e435cbbe3aac","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        source \u003d self._make_name(\u0027mpu-source-\u0027).decode()"},{"line_number":193,"context_line":"        destination \u003d self._make_name(\u0027mpu-copy-\u0027).decode()"},{"line_number":194,"context_line":"        self._make_s3_mpu(source)"},{"line_number":195,"context_line":"        source_headers \u003d self._assert_source_is_s3_mpu(source)"},{"line_number":196,"context_line":"        self._swift_copy(source, destination)"},{"line_number":197,"context_line":"        copy_headers \u003d self.internal_client.get_object_metadata("},{"line_number":198,"context_line":"            self.account, self.container, destination)"}],"source_content_type":"text/x-python","patch_set":1,"id":"0c56fdf2_9d75c54b","line":195,"updated":"2026-08-22 01:07:59.000000000","message":"pep8: F841 local variable \u0027source_headers\u0027 is assigned to but never used","commit_id":"e1ef370a864c5c60dcb8acb97a9560c3e39f576c"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"acb2e57f9588ef34f1d9d2fcf7d68a75b699340f","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        source \u003d self._make_name(\u0027swift-slo-source-\u0027).decode()"},{"line_number":123,"context_line":"        destination \u003d self._make_name(\u0027swift-slo-copy-\u0027).decode()"},{"line_number":124,"context_line":"        self._make_swift_slo(source)"},{"line_number":125,"context_line":"        source_headers \u003d self._assert_source_has_slo_sysmeta("},{"line_number":126,"context_line":"            source)"},{"line_number":127,"context_line":"        self._swift_copy(source, destination)"},{"line_number":128,"context_line":"        swift_copy_headers \u003d self.internal_client.get_object_metadata("}],"source_content_type":"text/x-python","patch_set":2,"id":"dcf2a207_86f4fe14","line":125,"updated":"2026-08-22 04:27:13.000000000","message":"pep8: F841 local variable \u0027source_headers\u0027 is assigned to but never used","commit_id":"afbc3c6f9ecdecace34f9456e647d04a5d44de76"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"acb2e57f9588ef34f1d9d2fcf7d68a75b699340f","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        source \u003d self._make_name(\u0027mpu-source-\u0027).decode()"},{"line_number":161,"context_line":"        destination \u003d self._make_name(\u0027mpu-copy-\u0027).decode()"},{"line_number":162,"context_line":"        self._make_s3_mpu(source)"},{"line_number":163,"context_line":"        source_headers \u003d self._assert_source_is_s3_mpu(source)"},{"line_number":164,"context_line":"        self._swift_copy(source, destination)"},{"line_number":165,"context_line":"        copy_headers \u003d self.internal_client.get_object_metadata("},{"line_number":166,"context_line":"            self.account, self.container, destination)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3126d638_e14cfbd2","line":163,"updated":"2026-08-22 04:27:13.000000000","message":"pep8: F841 local variable \u0027source_headers\u0027 is assigned to but never used","commit_id":"afbc3c6f9ecdecace34f9456e647d04a5d44de76"}]}
