)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a100ba2e949434576f431245932f25ea85f7141b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"37bab352_310e5511","updated":"2026-08-24 14:25:54.000000000","message":"second thoughts...I\u0027m pushing a squash for this patch and suggesting we might treat the combination of squashes as a separate follow-on clean up patch?","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b61cb4f4d2dd308dc6f2806b6662e86df1c24205","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e302684c_e8cc4111","updated":"2026-08-24 11:48:47.000000000","message":"will squash","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6c093a4fb178fee5be2e36e56ae79c0c7dae116b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"808ba49b_28215779","updated":"2026-08-24 19:56:17.000000000","message":"we should squash in the rest and take it further","commit_id":"50dda879f4a9d916b87157bca6164094b3c97fca"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"052b90341d1fa116616060d3b1700c8b399dbf43","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"0dd7254a_997f6437","updated":"2026-08-25 16:50:51.000000000","message":"Clean refactoring, LGTM. One comment inline.","commit_id":"f53d6f7a7f7e702608480ebc21110fa089d3f78e"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"ff66957438141683090529defc3fc50d6128691d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"6f4ce4fc_3f4bf3bb","updated":"2026-08-25 16:58:29.000000000","message":"LGTM","commit_id":"21709787c9faf63fca57e6e13b2cd52cb473c6da"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bc9a705cead9df1d454999eeb1ac0bee3f61cfc0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"51da95aa_8cf78977","updated":"2026-09-17 18:38:23.000000000","message":"https://review.opendev.org/c/openstack/swift/+/1006096 as a follow-up","commit_id":"21709787c9faf63fca57e6e13b2cd52cb473c6da"},{"author":{"_account_id":39146,"name":"Nathaniel Martes","display_name":"Nate Martes","email":"natemartes09@gmail.com","username":"nmartes"},"change_message_id":"6ac8b8750b1a789b2e3df8d65f6ab187ebbe9e50","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"efdf3279_404c8481","updated":"2026-08-25 20:11:30.000000000","message":"recheck, these seem mostly unrelated","commit_id":"21709787c9faf63fca57e6e13b2cd52cb473c6da"}],"swift/common/middleware/s3api/s3response.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b61cb4f4d2dd308dc6f2806b6662e86df1c24205","unresolved":true,"context_lines":[{"line_number":141,"context_line":"                if is_swift3_sysmeta(_server_type, key):"},{"line_number":142,"context_line":"                    # To be compatible with older swift3, translate swift3"},{"line_number":143,"context_line":"                    # sysmeta to s3api sysmeta here"},{"line_number":144,"context_line":"                    key \u003d sysmeta_prefix(_server_type) + \\"},{"line_number":145,"context_line":"                        key[len(\u0027x-%s-sysmeta-swift3-\u0027 % _server_type):]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"                    if key not in s3_sysmeta_headers:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f40060f_94032b67","side":"PARENT","line":144,"range":{"start_line":144,"start_character":26,"end_line":144,"end_character":40},"updated":"2026-08-24 11:48:47.000000000","message":"this was so potentially confusing","commit_id":"8c3f615c9f9b3d361e7e6f14552f7717376f1081"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c3f8907281d8799d5b7494644d14d14c321aaf6d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                if is_swift3_sysmeta(_server_type, key):"},{"line_number":142,"context_line":"                    # To be compatible with older swift3, translate swift3"},{"line_number":143,"context_line":"                    # sysmeta to s3api sysmeta here"},{"line_number":144,"context_line":"                    key \u003d sysmeta_prefix(_server_type) + \\"},{"line_number":145,"context_line":"                        key[len(\u0027x-%s-sysmeta-swift3-\u0027 % _server_type):]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"                    if key not in s3_sysmeta_headers:"}],"source_content_type":"text/x-python","patch_set":1,"id":"c99c2597_3a1e4f1d","side":"PARENT","line":144,"range":{"start_line":144,"start_character":26,"end_line":144,"end_character":40},"in_reply_to":"7f40060f_94032b67","updated":"2026-08-25 16:50:59.000000000","message":"Acknowledged","commit_id":"8c3f615c9f9b3d361e7e6f14552f7717376f1081"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b61cb4f4d2dd308dc6f2806b6662e86df1c24205","unresolved":true,"context_lines":[{"line_number":130,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":131,"context_line":"        swob.Response.__init__(self, *args, **kwargs)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        s3api_sysmeta_headers \u003d swob.HeaderKeyDict()"},{"line_number":134,"context_line":"        sw_headers \u003d swob.HeaderKeyDict()"},{"line_number":135,"context_line":"        headers \u003d HeaderKeyDict()"},{"line_number":136,"context_line":"        self.is_slo \u003d False"}],"source_content_type":"text/x-python","patch_set":1,"id":"eef8b525_e8b63da2","line":133,"updated":"2026-08-24 11:48:47.000000000","message":"thanks","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c3f8907281d8799d5b7494644d14d14c321aaf6d","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":131,"context_line":"        swob.Response.__init__(self, *args, **kwargs)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        s3api_sysmeta_headers \u003d swob.HeaderKeyDict()"},{"line_number":134,"context_line":"        sw_headers \u003d swob.HeaderKeyDict()"},{"line_number":135,"context_line":"        headers \u003d HeaderKeyDict()"},{"line_number":136,"context_line":"        self.is_slo \u003d False"}],"source_content_type":"text/x-python","patch_set":1,"id":"445e6a3d_5ff10811","line":133,"in_reply_to":"eef8b525_e8b63da2","updated":"2026-08-25 16:50:59.000000000","message":"Done","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b61cb4f4d2dd308dc6f2806b6662e86df1c24205","unresolved":true,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        # Used for pure swift header handling at the request layer"},{"line_number":194,"context_line":"        self.sw_headers \u003d sw_headers"},{"line_number":195,"context_line":"        self.sysmeta_headers \u003d s3api_sysmeta_headers"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    @classmethod"},{"line_number":198,"context_line":"    def from_swift_resp(cls, sw_resp):"}],"source_content_type":"text/x-python","patch_set":1,"id":"c2fa2b1d_103eeb88","line":195,"updated":"2026-08-24 11:48:47.000000000","message":"I\u0027d love to go one step further and rename the class variable to ``s3api_sysmeta_headers``. We could keep an alias for backwards compat and those who like to live with ambiguity.","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c3f8907281d8799d5b7494644d14d14c321aaf6d","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        # Used for pure swift header handling at the request layer"},{"line_number":194,"context_line":"        self.sw_headers \u003d sw_headers"},{"line_number":195,"context_line":"        self.sysmeta_headers \u003d s3api_sysmeta_headers"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    @classmethod"},{"line_number":198,"context_line":"    def from_swift_resp(cls, sw_resp):"}],"source_content_type":"text/x-python","patch_set":1,"id":"b7a3a65e_3e994771","line":195,"in_reply_to":"c2fa2b1d_103eeb88","updated":"2026-08-25 16:50:59.000000000","message":"Done","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bc9a705cead9df1d454999eeb1ac0bee3f61cfc0","unresolved":true,"context_lines":[{"line_number":130,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":131,"context_line":"        swob.Response.__init__(self, *args, **kwargs)"},{"line_number":132,"context_line":"        self.s3api_sysmeta_headers \u003d swob.HeaderKeyDict()"},{"line_number":133,"context_line":"        self.sysmeta_headers \u003d self.s3api_sysmeta_headers  # backwards compat"},{"line_number":134,"context_line":"        # Used for pure swift header handling at the request layer"},{"line_number":135,"context_line":"        self.sw_headers \u003d swob.HeaderKeyDict()"},{"line_number":136,"context_line":"        s3_headers \u003d HeaderKeyDict()  # note: this is not a swob.HeaderKeyDict"}],"source_content_type":"text/x-python","patch_set":7,"id":"67c83c7a_0f87b2fa","line":133,"range":{"start_line":133,"start_character":61,"end_line":133,"end_character":77},"updated":"2026-09-17 18:38:23.000000000","message":"For whom? I don\u0027t think anyone outside of s3api is instantiating `S3Response`s...","commit_id":"21709787c9faf63fca57e6e13b2cd52cb473c6da"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8f2fe47098ae90910e4bbb0942b12ba583e935f5","unresolved":true,"context_lines":[{"line_number":130,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":131,"context_line":"        swob.Response.__init__(self, *args, **kwargs)"},{"line_number":132,"context_line":"        self.s3api_sysmeta_headers \u003d swob.HeaderKeyDict()"},{"line_number":133,"context_line":"        self.sysmeta_headers \u003d self.s3api_sysmeta_headers  # backwards compat"},{"line_number":134,"context_line":"        # Used for pure swift header handling at the request layer"},{"line_number":135,"context_line":"        self.sw_headers \u003d swob.HeaderKeyDict()"},{"line_number":136,"context_line":"        s3_headers \u003d HeaderKeyDict()  # note: this is not a swob.HeaderKeyDict"}],"source_content_type":"text/x-python","patch_set":7,"id":"a5dec2e0_58b2ebca","line":133,"range":{"start_line":133,"start_character":61,"end_line":133,"end_character":77},"in_reply_to":"67c83c7a_0f87b2fa","updated":"2026-09-18 08:29:02.000000000","message":"we just don\u0027t know about 3rd party code? e.g. we have an s3api controller for bucket inventory that isn\u0027t merged\n\nI don\u0027t feel I have good framework for deciding when we preserve interfaces and when we don\u0027t","commit_id":"21709787c9faf63fca57e6e13b2cd52cb473c6da"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bc9a705cead9df1d454999eeb1ac0bee3f61cfc0","unresolved":true,"context_lines":[{"line_number":133,"context_line":"        self.sysmeta_headers \u003d self.s3api_sysmeta_headers  # backwards compat"},{"line_number":134,"context_line":"        # Used for pure swift header handling at the request layer"},{"line_number":135,"context_line":"        self.sw_headers \u003d swob.HeaderKeyDict()"},{"line_number":136,"context_line":"        s3_headers \u003d HeaderKeyDict()  # note: this is not a swob.HeaderKeyDict"},{"line_number":137,"context_line":"        self.is_slo \u003d False"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        for key, val in self.headers.items():"}],"source_content_type":"text/x-python","patch_set":7,"id":"b62a2c78_000872c7","line":136,"range":{"start_line":136,"start_character":46,"end_line":136,"end_character":78},"updated":"2026-09-17 18:38:23.000000000","message":"Well, but it *is* -- `isinstance(s3_headers, swob.HeaderKeyDict)` is true.\n\nMaybe we should rename this one to be `S3HeaderKeyDict`?","commit_id":"21709787c9faf63fca57e6e13b2cd52cb473c6da"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8f2fe47098ae90910e4bbb0942b12ba583e935f5","unresolved":true,"context_lines":[{"line_number":133,"context_line":"        self.sysmeta_headers \u003d self.s3api_sysmeta_headers  # backwards compat"},{"line_number":134,"context_line":"        # Used for pure swift header handling at the request layer"},{"line_number":135,"context_line":"        self.sw_headers \u003d swob.HeaderKeyDict()"},{"line_number":136,"context_line":"        s3_headers \u003d HeaderKeyDict()  # note: this is not a swob.HeaderKeyDict"},{"line_number":137,"context_line":"        self.is_slo \u003d False"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        for key, val in self.headers.items():"}],"source_content_type":"text/x-python","patch_set":7,"id":"7e538950_c6267a38","line":136,"range":{"start_line":136,"start_character":46,"end_line":136,"end_character":78},"in_reply_to":"b62a2c78_000872c7","updated":"2026-09-18 08:29:02.000000000","message":"\u003e  isinstance(s3_headers, swob.HeaderKeyDict) is true\n\nboth statements are true ;-)\n\n\u003eMaybe we should rename this one to be S3HeaderKeyDict?\n\n+1","commit_id":"21709787c9faf63fca57e6e13b2cd52cb473c6da"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bc9a705cead9df1d454999eeb1ac0bee3f61cfc0","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            # because we don\u0027t actually know how many parts there are.)"},{"line_number":186,"context_line":"            s3_headers[\u0027etag\u0027] +\u003d \u0027-N\u0027"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"        self.headers \u003d s3_headers"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        if self.etag:"},{"line_number":191,"context_line":"            # add double quotes to the etag header"}],"source_content_type":"text/x-python","patch_set":7,"id":"3081c41e_05c83f54","line":188,"updated":"2026-09-17 18:38:23.000000000","message":"We don\u0027t want to just set this up at the top like we do for `self.s3api_sysmeta_headers` and `self.sw_headers`?\n\nOh -- because we still need `self.headers` to be *all* the response headers as we\u0027re looping through them in that first partitioning...","commit_id":"21709787c9faf63fca57e6e13b2cd52cb473c6da"}],"swift/common/middleware/s3api/utils.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b61cb4f4d2dd308dc6f2806b6662e86df1c24205","unresolved":true,"context_lines":[{"line_number":51,"context_line":"    return sysmeta_prefix(resource) + name"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def s3api_object_sysmeta_header(name):"},{"line_number":55,"context_line":"    \"\"\""},{"line_number":56,"context_line":"    Returns the ``s3api`` namespace object system metadata header for the given"},{"line_number":57,"context_line":"    name."}],"source_content_type":"text/x-python","patch_set":1,"id":"71f7e14a_a9cf9d2c","side":"PARENT","line":54,"updated":"2026-08-24 11:48:47.000000000","message":"oh did I only use it once. maybe I was mimicing ``swift3_object_sysmeta_header``","commit_id":"8c3f615c9f9b3d361e7e6f14552f7717376f1081"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c3f8907281d8799d5b7494644d14d14c321aaf6d","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    return sysmeta_prefix(resource) + name"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def s3api_object_sysmeta_header(name):"},{"line_number":55,"context_line":"    \"\"\""},{"line_number":56,"context_line":"    Returns the ``s3api`` namespace object system metadata header for the given"},{"line_number":57,"context_line":"    name."}],"source_content_type":"text/x-python","patch_set":1,"id":"2e06c9c8_d01116ef","side":"PARENT","line":54,"in_reply_to":"71f7e14a_a9cf9d2c","updated":"2026-08-25 16:50:59.000000000","message":"Done","commit_id":"8c3f615c9f9b3d361e7e6f14552f7717376f1081"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b61cb4f4d2dd308dc6f2806b6662e86df1c24205","unresolved":true,"context_lines":[{"line_number":33,"context_line":"MULTIUPLOAD_SUFFIX \u003d \u0027+segments\u0027"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def s3api_sysmeta_prefix(resource):"},{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":"    Returns the system metadata prefix for given resource type."},{"line_number":39,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"d10a5c9f_68ee631f","line":36,"updated":"2026-08-24 11:48:47.000000000","message":"love it. I wanted to change this but told myself it was scope creep, but if you\u0027re on board then I am!","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c3f8907281d8799d5b7494644d14d14c321aaf6d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"MULTIUPLOAD_SUFFIX \u003d \u0027+segments\u0027"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"def s3api_sysmeta_prefix(resource):"},{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":"    Returns the system metadata prefix for given resource type."},{"line_number":39,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"c7793ef6_5dabd240","line":36,"in_reply_to":"d10a5c9f_68ee631f","updated":"2026-08-25 16:50:59.000000000","message":"Done","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a100ba2e949434576f431245932f25ea85f7141b","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":"    Returns the system metadata prefix for given resource type."},{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":"    return get_sys_meta_prefix(resource) + \u0027s3api-\u0027"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def s3api_sysmeta_header(resource, name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"936b18ac_39e9c7e2","line":40,"updated":"2026-08-24 14:25:54.000000000","message":"this change broke a test (see below)\n\nQuestion is, should we retain leniency for out of tree callers?\n\n```\nFound it. It\u0027s a behaviour change in s3api_sysmeta_prefix().\n\nBefore (swift/common/middleware/s3api/utils.py):\ndef sysmeta_prefix(resource):\n    if resource.lower() \u003d\u003d \u0027object\u0027:\n        return \u0027x-object-sysmeta-s3api-\u0027\n    else:\n        return \u0027x-container-sysmeta-s3api-\u0027   # anything not \u0027object\u0027 -\u003e container\n\nAfter the commit:\ndef s3api_sysmeta_prefix(resource):\n    return get_sys_meta_prefix(resource) + \u0027s3api-\u0027   # \u0027x-\u003cresource\u003e-sysmeta-s3api-\u0027\n\nThe old version silently coerced any non-object resource string to container; the new one takes the resource name literally.\n\nThe test setup in test/unit/common/middleware/s3api/__init__.py:302-304 registers the sticky ACL for /v1/AUTH_test/authenticated with resource\u003d\u0027bucket\u0027:\n\nauthenticated_headers \u003d _gen_test_headers(\n    self.default_owner, [Grant(AuthenticatedUsers(), \u0027READ\u0027)],\n    \u0027bucket\u0027)\n\nThat now encodes to x-bucket-sysmeta-s3api-acl (verified) instead of x-container-sysmeta-s3api-acl. So the container response carries no recognised ACL header, S3Response parses an empty \u003cAccessControlList/\u003e (visible in the captured output), and the READ check fails → 403 instead of 200.\n\nTwo ways to fix:\n\n1. Fix the test — \u0027bucket\u0027 looks like a typo that the lenient old helper masked; every other call in that setup passes \u0027container\u0027 or \u0027object\u0027. Changing it to \u0027container\u0027 (or just dropping the third arg, since it defaults to \u0027container\u0027) restores the intended header.\n2. Restore leniency in the helper — keep the object/else coercion, but that re-introduces the silent mis-spelling tolerance the commit was deliberately removing, and get_sys_meta_prefix would also then accept \u0027account\u0027 oddly.\n```","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4c69441c9c10512cf11b05155ab5e06371df0bd6","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":"    Returns the system metadata prefix for given resource type."},{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":"    return get_sys_meta_prefix(resource) + \u0027s3api-\u0027"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def s3api_sysmeta_header(resource, name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"f5803e3f_25936f39","line":40,"in_reply_to":"936b18ac_39e9c7e2","updated":"2026-08-25 16:58:12.000000000","message":"Acknowledged","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b61cb4f4d2dd308dc6f2806b6662e86df1c24205","unresolved":true,"context_lines":[{"line_number":51,"context_line":"# Keep the original short spellings as compatibility aliases. They are also"},{"line_number":52,"context_line":"# useful when this module supplies the S3API namespace."},{"line_number":53,"context_line":"sysmeta_prefix \u003d s3api_sysmeta_prefix"},{"line_number":54,"context_line":"sysmeta_header \u003d s3api_sysmeta_header"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def is_s3api_sysmeta(server_type, name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"6ee9bb0d_e8de8973","line":54,"updated":"2026-08-24 11:48:47.000000000","message":"fair enough but I might change the usages in test_s3response","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a100ba2e949434576f431245932f25ea85f7141b","unresolved":true,"context_lines":[{"line_number":51,"context_line":"# Keep the original short spellings as compatibility aliases. They are also"},{"line_number":52,"context_line":"# useful when this module supplies the S3API namespace."},{"line_number":53,"context_line":"sysmeta_prefix \u003d s3api_sysmeta_prefix"},{"line_number":54,"context_line":"sysmeta_header \u003d s3api_sysmeta_header"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def is_s3api_sysmeta(server_type, name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fe676fc6_1b2577e8","line":54,"in_reply_to":"6ee9bb0d_e8de8973","updated":"2026-08-24 14:25:54.000000000","message":"and other places","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c3f8907281d8799d5b7494644d14d14c321aaf6d","unresolved":false,"context_lines":[{"line_number":51,"context_line":"# Keep the original short spellings as compatibility aliases. They are also"},{"line_number":52,"context_line":"# useful when this module supplies the S3API namespace."},{"line_number":53,"context_line":"sysmeta_prefix \u003d s3api_sysmeta_prefix"},{"line_number":54,"context_line":"sysmeta_header \u003d s3api_sysmeta_header"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def is_s3api_sysmeta(server_type, name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"0c589aff_d25a9935","line":54,"in_reply_to":"fe676fc6_1b2577e8","updated":"2026-08-25 16:50:59.000000000","message":"Done","commit_id":"a07c4a3733a09ad26f02c27d44443ce058d9dc2c"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"052b90341d1fa116616060d3b1700c8b399dbf43","unresolved":true,"context_lines":[{"line_number":439,"context_line":"        # to the sink req, so first clear *all* s3api sysmeta, and then set"},{"line_number":440,"context_line":"        # only the s3api sysmeta that is explicitly wanted in sink_req..."},{"line_number":441,"context_line":"        etag_override_key \u003d get_container_update_override_key(\u0027etag\u0027).lower()"},{"line_number":442,"context_line":"        s3_mpu \u003d sysmeta_header(\u0027object\u0027, \u0027upload-id\u0027) in sink_req.headers"},{"line_number":443,"context_line":"        for key, value in dict(sink_req.headers).items():"},{"line_number":444,"context_line":"            lower_key \u003d key.lower()"},{"line_number":445,"context_line":"            if (is_s3api_sysmeta(\u0027object\u0027, lower_key)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ce231f4b_456b936c","line":442,"updated":"2026-08-25 16:50:51.000000000","message":"Maybe worth a follow up to rename this as well?","commit_id":"f53d6f7a7f7e702608480ebc21110fa089d3f78e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4c69441c9c10512cf11b05155ab5e06371df0bd6","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        # to the sink req, so first clear *all* s3api sysmeta, and then set"},{"line_number":440,"context_line":"        # only the s3api sysmeta that is explicitly wanted in sink_req..."},{"line_number":441,"context_line":"        etag_override_key \u003d get_container_update_override_key(\u0027etag\u0027).lower()"},{"line_number":442,"context_line":"        s3_mpu \u003d sysmeta_header(\u0027object\u0027, \u0027upload-id\u0027) in sink_req.headers"},{"line_number":443,"context_line":"        for key, value in dict(sink_req.headers).items():"},{"line_number":444,"context_line":"            lower_key \u003d key.lower()"},{"line_number":445,"context_line":"            if (is_s3api_sysmeta(\u0027object\u0027, lower_key)"}],"source_content_type":"text/x-python","patch_set":6,"id":"8b012e55_1e9b03c8","line":442,"in_reply_to":"ce231f4b_456b936c","updated":"2026-08-25 16:58:12.000000000","message":"Done","commit_id":"f53d6f7a7f7e702608480ebc21110fa089d3f78e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bc9a705cead9df1d454999eeb1ac0bee3f61cfc0","unresolved":true,"context_lines":[{"line_number":55,"context_line":"    return s3api_sysmeta_prefix(resource) + name"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"# Keep the original short spellings as backwards compatibility aliases."},{"line_number":59,"context_line":"sysmeta_prefix \u003d s3api_sysmeta_prefix"},{"line_number":60,"context_line":"sysmeta_header \u003d s3api_sysmeta_header"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"8d1774c2_b011c293","line":58,"range":{"start_line":58,"start_character":36,"end_line":58,"end_character":70},"updated":"2026-09-17 18:38:23.000000000","message":"IDK that we really need these -- or are they used in our out-of-tree bucket-inventory daemon? I didn\u0027t think so...","commit_id":"21709787c9faf63fca57e6e13b2cd52cb473c6da"}]}
