)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Let SLO and S3API authoritatively classify object responses by"},{"line_number":12,"context_line":"updating the existing shared base-label map. Proxy logging consumes"},{"line_number":13,"context_line":"that result with a stable object_type schema, representing unknown"},{"line_number":14,"context_line":"values as None internally and an empty value on the wire."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Propagate the classification intentionally across response-path"},{"line_number":17,"context_line":"metrics while keeping non-object labels behavior stable. Cover"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"da0c965c_ab87fb54","line":14,"range":{"start_line":13,"start_character":59,"end_line":14,"end_character":7},"updated":"2026-09-17 16:21:40.000000000","message":"how can there be an unknown value? if we know that ``resource\u003d\u003dobject``, then the default is ``object_type\u003dnormal``","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c6b7c6d05ea0da941bbd6eebd6445b984ba63a72","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"0fe57fdb_377410e7","updated":"2026-07-08 15:48:55.000000000","message":"Ideally we would align this work with https://review.opendev.org/c/openstack/swift/+/974367 i.e. define the interface for other middlewares to add to base_labels dict, and then in this patch slo and s3api can simply add the labels. That way, we don\u0027t have to bleed s3api and slo into proxy_logging.","commit_id":"14a5e86cb4ba039b42b8f0b4eae43673f106b966"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e62aeb15c3c8333e03aafcc62a72978ca164f552","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"f7bd814a_72c71bb3","updated":"2026-09-07 11:24:38.000000000","message":"I wonder if we might consider introducing a single label key that could eventually capture more abstract API operations, e.g.:\n\n```\nop: GetMpu | GetSlo | GetObject | CreateMultipartUpload | UploadPart | CompleteMultipartUpload | DeleteObjects | etc...\n```","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"7fb1d961e9258e517d5abcbc89a837f749053acd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d714d567_5257dd5c","updated":"2026-09-02 16:15:48.000000000","message":"previously update_swift_base_labels() were intended for req_labels, while proxy_logging could overlay any resp_labels on to base_labels. If object_type is part of response schema, wonder if it would be better to change base_labels to be a \"base\" section, a \"response\" section, to avoid copying the labels in callback which could be every 10sec or so?","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1de7ce2101f5553e327ccfeb6871d0266aa8abc7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"d8a538f7_1d966a5d","updated":"2026-09-23 00:30:48.000000000","message":"proxy logging supplies the initial ``normal`` value instead of ``None``.\nI think Yan is still working on it.","commit_id":"1fb1de1f25b6ecf27af31cb6c878aac6ce60e1ee"}],"swift/common/middleware/proxy_logging.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e62aeb15c3c8333e03aafcc62a72978ca164f552","unresolved":true,"context_lines":[{"line_number":642,"context_line":"        resource_type \u003d labels.get(\u0027resource\u0027)"},{"line_number":643,"context_line":"        updated_labels \u003d dict(labels)"},{"line_number":644,"context_line":"        if resource_type \u003d\u003d \u0027object\u0027:"},{"line_number":645,"context_line":"            updated_labels.setdefault(\u0027object_type\u0027, None)"},{"line_number":646,"context_line":"        else:"},{"line_number":647,"context_line":"            updated_labels.pop(\u0027object_type\u0027, None)"},{"line_number":648,"context_line":"        if resource_type \u003d\u003d \u0027object\u0027 and \\"}],"source_content_type":"text/x-python","patch_set":4,"id":"61571286_56cf5a24","line":645,"updated":"2026-09-07 11:24:38.000000000","message":"why not just add the ``object_type` label when the `base_labels`` dict is *created* for object requests?","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d434d32597f58fea2a051f07aa5de2cde49ab9ff","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        resource_type \u003d labels.get(\u0027resource\u0027)"},{"line_number":643,"context_line":"        updated_labels \u003d dict(labels)"},{"line_number":644,"context_line":"        if resource_type \u003d\u003d \u0027object\u0027:"},{"line_number":645,"context_line":"            updated_labels.setdefault(\u0027object_type\u0027, None)"},{"line_number":646,"context_line":"        else:"},{"line_number":647,"context_line":"            updated_labels.pop(\u0027object_type\u0027, None)"},{"line_number":648,"context_line":"        if resource_type \u003d\u003d \u0027object\u0027 and \\"}],"source_content_type":"text/x-python","patch_set":4,"id":"2f4f6700_c9993bed","line":645,"in_reply_to":"61571286_56cf5a24","updated":"2026-09-16 19:35:31.000000000","message":"Acknowledged","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":108,"context_line":"    get_sensitive_params, register_sensitive_header"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"def update_base_labels(req, labels):"},{"line_number":112,"context_line":"    \"\"\""},{"line_number":113,"context_line":"    Helper function for other middlewares to update base_labels."},{"line_number":114,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"eb367bf9_3e0726ff","line":111,"updated":"2026-09-17 16:21:40.000000000","message":"we may want to move all base_labels helpers to a common module\n\nsee 1006018: sq? wip: re-use base_labels helpers in s3api | https://review.opendev.org/c/openstack/swift/+/1006018","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":549,"context_line":"        if cont:"},{"line_number":550,"context_line":"            labels[\u0027container\u0027] \u003d cont"},{"line_number":551,"context_line":"        if resource \u003d\u003d \u0027object\u0027:"},{"line_number":552,"context_line":"            labels[\u0027object_type\u0027] \u003d None"},{"line_number":553,"context_line":"        return labels"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    def get_current_labels(self, req, acc, cont, obj):"}],"source_content_type":"text/x-python","patch_set":7,"id":"fd99d77b_7fa18857","line":552,"updated":"2026-09-17 16:21:40.000000000","message":"isn\u0027t the default value ``normal``?","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":570,"context_line":"        if acc:"},{"line_number":571,"context_line":"            labels[\u0027account\u0027] \u003d acc"},{"line_number":572,"context_line":"        if resource:"},{"line_number":573,"context_line":"            labels[\u0027resource\u0027] \u003d resource"},{"line_number":574,"context_line":"        if cont:"},{"line_number":575,"context_line":"            labels[\u0027container\u0027] \u003d cont"},{"line_number":576,"context_line":"        return labels"}],"source_content_type":"text/x-python","patch_set":7,"id":"19ca551d_f359a715","line":573,"updated":"2026-09-17 16:21:40.000000000","message":"don\u0027t we need to set ``object_type`` here as well?","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":630,"context_line":"            base_labels.setdefault(\u0027account\u0027, current_labels.get(\u0027account\u0027))"},{"line_number":631,"context_line":"            resource_type \u003d current_labels.get(\u0027resource\u0027)"},{"line_number":632,"context_line":"            base_labels.setdefault(\u0027resource\u0027, resource_type)"},{"line_number":633,"context_line":"            if resource_type \u003d\u003d \u0027object\u0027:"},{"line_number":634,"context_line":"                base_labels.setdefault(\u0027object_type\u0027, None)"},{"line_number":635,"context_line":"            # use the composition of base_labels overlaid with current_labels"},{"line_number":636,"context_line":"            req_labels \u003d ChainMap(current_labels, base_labels)"}],"source_content_type":"text/x-python","patch_set":7,"id":"424d79b3_c64abe62","line":633,"updated":"2026-09-17 16:21:40.000000000","message":"ok, I guess it is possible that something to the right of rightmost proxy-logging might set ``object_type``, but not with this patch.\n\nPerhaps we want the ``object_type`` key to be in *every* ``object`` stat for consistency, even if empty value","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":631,"context_line":"            resource_type \u003d current_labels.get(\u0027resource\u0027)"},{"line_number":632,"context_line":"            base_labels.setdefault(\u0027resource\u0027, resource_type)"},{"line_number":633,"context_line":"            if resource_type \u003d\u003d \u0027object\u0027:"},{"line_number":634,"context_line":"                base_labels.setdefault(\u0027object_type\u0027, None)"},{"line_number":635,"context_line":"            # use the composition of base_labels overlaid with current_labels"},{"line_number":636,"context_line":"            req_labels \u003d ChainMap(current_labels, base_labels)"},{"line_number":637,"context_line":"        return req_labels"}],"source_content_type":"text/x-python","patch_set":7,"id":"9703ac1f_779809c7","line":634,"updated":"2026-09-17 16:21:40.000000000","message":"I think this is wrong; ``object_type`` should only be set if line 632 returns ``object`` i.e. only if ``base_labels`` now has ``resource: object``","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":650,"context_line":"        resource_type \u003d labels.get(\u0027resource\u0027)"},{"line_number":651,"context_line":"        updated_labels \u003d dict(labels)"},{"line_number":652,"context_line":"        if resource_type !\u003d \u0027object\u0027:"},{"line_number":653,"context_line":"            updated_labels.pop(\u0027object_type\u0027, None)"},{"line_number":654,"context_line":"        if resource_type \u003d\u003d \u0027object\u0027 and \\"},{"line_number":655,"context_line":"                policy_index is not None and \\"},{"line_number":656,"context_line":"                POLICIES.get_by_index(policy_index) is not None:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9f4e32d9_b8e63ae7","line":653,"updated":"2026-09-17 16:21:40.000000000","message":"how do end up with ``object_type`` in the dict but not ``resource: object``?\n\nAlso I\u0027m not sure I like a method that was previously *additive* now removing a key as a side-effect","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":774,"context_line":"            req \u003d Request(env)"},{"line_number":775,"context_line":"            env[\u0027swift.proxy_logging_status\u0027] \u003d 500"},{"line_number":776,"context_line":"            status_int \u003d status_int_for_logging()"},{"line_number":777,"context_line":"            resp_labels \u003d self.get_response_labels(req_labels)"},{"line_number":778,"context_line":"            self.log_request("},{"line_number":779,"context_line":"                req, status_int, input_proxy.bytes_received, 0, start_time,"},{"line_number":780,"context_line":"                time.time(), resp_labels)"}],"source_content_type":"text/x-python","patch_set":7,"id":"038b57bc_da51e91a","line":777,"updated":"2026-09-17 16:21:40.000000000","message":"this does nothing other than pop ``object_type`` in some circumstance, but I\u0027m not sure how those circumstances arise.","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"}],"swift/common/middleware/s3api/controllers/obj.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e6187fbcfc8867f6f26923f2219c58f1d8d5726c","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        if base_labels is not None:"},{"line_number":121,"context_line":"            s3_etag \u003d resp.sysmeta_headers.get("},{"line_number":122,"context_line":"                sysmeta_header(\u0027object\u0027, \u0027etag\u0027))"},{"line_number":123,"context_line":"            if not resp.is_slo:"},{"line_number":124,"context_line":"                object_type \u003d \u0027normal\u0027"},{"line_number":125,"context_line":"            elif s3_etag:"},{"line_number":126,"context_line":"                object_type \u003d \u0027s3_mpu\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"4290b0bd_8ad760b4","line":123,"updated":"2026-08-31 20:25:52.000000000","message":"pep8: F821 undefined name \u0027sysmeta_header\u0027","commit_id":"c7e20fe98442bffe3db96a43d90001aa2a66b206"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e62aeb15c3c8333e03aafcc62a72978ca164f552","unresolved":true,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        resp \u003d req.get_response(self.app, query\u003dquery)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        base_labels \u003d req.environ.get(\u0027swift.base_labels\u0027)"},{"line_number":121,"context_line":"        if base_labels is not None:"},{"line_number":122,"context_line":"            s3_etag \u003d resp.sysmeta_headers.get("},{"line_number":123,"context_line":"                s3api_sysmeta_header(\u0027object\u0027, \u0027etag\u0027))"},{"line_number":124,"context_line":"            if not resp.is_slo:"}],"source_content_type":"text/x-python","patch_set":4,"id":"d09b9ae7_161c31f2","line":121,"range":{"start_line":120,"start_character":8,"end_line":121,"end_character":35},"updated":"2026-09-07 11:24:38.000000000","message":"I think it might be worth encapuslating this in a proxy_logging helper function:\n\n```\ndef update_base_labels(my_labels):\n    base_labels \u003d req.environ.get(\u0027swift.base_labels\u0027)\n    if base_labels is not None:\n        base_labels.update(my_labels)\n```\n\nso that (a) the environ key is encapuslated and (b) the test for existence doesn\u0027t need to be repeated by every caller.","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d434d32597f58fea2a051f07aa5de2cde49ab9ff","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        resp \u003d req.get_response(self.app, query\u003dquery)"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        base_labels \u003d req.environ.get(\u0027swift.base_labels\u0027)"},{"line_number":121,"context_line":"        if base_labels is not None:"},{"line_number":122,"context_line":"            s3_etag \u003d resp.sysmeta_headers.get("},{"line_number":123,"context_line":"                s3api_sysmeta_header(\u0027object\u0027, \u0027etag\u0027))"},{"line_number":124,"context_line":"            if not resp.is_slo:"}],"source_content_type":"text/x-python","patch_set":4,"id":"a8e38213_a35d1536","line":121,"range":{"start_line":120,"start_character":8,"end_line":121,"end_character":35},"in_reply_to":"d09b9ae7_161c31f2","updated":"2026-09-16 19:35:31.000000000","message":"good point!","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e62aeb15c3c8333e03aafcc62a72978ca164f552","unresolved":true,"context_lines":[{"line_number":123,"context_line":"                s3api_sysmeta_header(\u0027object\u0027, \u0027etag\u0027))"},{"line_number":124,"context_line":"            if not resp.is_slo:"},{"line_number":125,"context_line":"                object_type \u003d \u0027normal\u0027"},{"line_number":126,"context_line":"            elif s3_etag:"},{"line_number":127,"context_line":"                object_type \u003d \u0027s3_mpu\u0027"},{"line_number":128,"context_line":"            else:"},{"line_number":129,"context_line":"                object_type \u003d \u0027slo\u0027"},{"line_number":130,"context_line":"            base_labels[\u0027object_type\u0027] \u003d object_type"}],"source_content_type":"text/x-python","patch_set":4,"id":"4abaadf3_e39f0a9f","line":127,"range":{"start_line":126,"start_character":12,"end_line":127,"end_character":38},"updated":"2026-09-07 11:24:38.000000000","message":"wouldn\u0027t it be more obvious to use ``x-object-sysmeta-s3api-upload-id`` as the condition for ``s3_mpu``?\n\nnit: s3_mpu seems verbose, ``mpu`` would be sufficient; we already have an ``api`` label so we\u0027d have ``{\u0027api\u0027: \u0027s3\u0027, \u0027object_type\u0027: \u0027mpu\u0027, ...}``","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d434d32597f58fea2a051f07aa5de2cde49ab9ff","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                s3api_sysmeta_header(\u0027object\u0027, \u0027etag\u0027))"},{"line_number":124,"context_line":"            if not resp.is_slo:"},{"line_number":125,"context_line":"                object_type \u003d \u0027normal\u0027"},{"line_number":126,"context_line":"            elif s3_etag:"},{"line_number":127,"context_line":"                object_type \u003d \u0027s3_mpu\u0027"},{"line_number":128,"context_line":"            else:"},{"line_number":129,"context_line":"                object_type \u003d \u0027slo\u0027"},{"line_number":130,"context_line":"            base_labels[\u0027object_type\u0027] \u003d object_type"}],"source_content_type":"text/x-python","patch_set":4,"id":"e811b264_7a679118","line":127,"range":{"start_line":126,"start_character":12,"end_line":127,"end_character":38},"in_reply_to":"4abaadf3_e39f0a9f","updated":"2026-09-16 19:35:31.000000000","message":"Acknowledged","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e62aeb15c3c8333e03aafcc62a72978ca164f552","unresolved":true,"context_lines":[{"line_number":126,"context_line":"            elif s3_etag:"},{"line_number":127,"context_line":"                object_type \u003d \u0027s3_mpu\u0027"},{"line_number":128,"context_line":"            else:"},{"line_number":129,"context_line":"                object_type \u003d \u0027slo\u0027"},{"line_number":130,"context_line":"            base_labels[\u0027object_type\u0027] \u003d object_type"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        if not resp.is_slo:"}],"source_content_type":"text/x-python","patch_set":4,"id":"e254ad6e_ee6ac243","line":129,"range":{"start_line":129,"start_character":16,"end_line":129,"end_character":35},"updated":"2026-09-07 11:24:38.000000000","message":"it seems wrong (and unnecessary?) for s3api middleware to be writing down \u0027slo\u0027 - doesn\u0027t SLO middleware set the ``object_type`` to ``slo``?\n\nI\u0027d expect the label to already be set by the tim s3api middleware handles the response, and s3api then overwrites the label value if it knows better (i.e. mpu).","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d434d32597f58fea2a051f07aa5de2cde49ab9ff","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            elif s3_etag:"},{"line_number":127,"context_line":"                object_type \u003d \u0027s3_mpu\u0027"},{"line_number":128,"context_line":"            else:"},{"line_number":129,"context_line":"                object_type \u003d \u0027slo\u0027"},{"line_number":130,"context_line":"            base_labels[\u0027object_type\u0027] \u003d object_type"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        if not resp.is_slo:"}],"source_content_type":"text/x-python","patch_set":4,"id":"0cb716cc_75e84ea5","line":129,"range":{"start_line":129,"start_character":16,"end_line":129,"end_character":35},"in_reply_to":"e254ad6e_ee6ac243","updated":"2026-09-16 19:35:31.000000000","message":"seems so, probably also depends on the user pipeline config","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":123,"context_line":"            object_type \u003d \u0027normal\u0027"},{"line_number":124,"context_line":"        elif s3api_sysmeta_header("},{"line_number":125,"context_line":"                \u0027object\u0027, \u0027upload-id\u0027) in resp.s3api_sysmeta_headers:"},{"line_number":126,"context_line":"            object_type \u003d \u0027mpu\u0027"},{"line_number":127,"context_line":"        if object_type:"},{"line_number":128,"context_line":"            update_base_labels(req, {\u0027object_type\u0027: object_type})"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"6cfb2716_2c01b1fc","line":126,"range":{"start_line":126,"start_character":26,"end_line":126,"end_character":31},"updated":"2026-09-17 16:21:40.000000000","message":"please use ``s3_mpu`` like the commit message says, because in the future we may have plain ``mpu`` for native mpus.","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":124,"context_line":"        elif s3api_sysmeta_header("},{"line_number":125,"context_line":"                \u0027object\u0027, \u0027upload-id\u0027) in resp.s3api_sysmeta_headers:"},{"line_number":126,"context_line":"            object_type \u003d \u0027mpu\u0027"},{"line_number":127,"context_line":"        if object_type:"},{"line_number":128,"context_line":"            update_base_labels(req, {\u0027object_type\u0027: object_type})"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        if not resp.is_slo:"}],"source_content_type":"text/x-python","patch_set":7,"id":"caffb5c5_4559e69c","line":127,"updated":"2026-09-17 16:21:40.000000000","message":"it seems like there ought always be a value at this point?\n\nOR, in fact, we should only update the labels here when we know we have a ``s3_mpu``. Leave SLO to set ``slo``, make the default be ``normal``.","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":125,"context_line":"                \u0027object\u0027, \u0027upload-id\u0027) in resp.s3api_sysmeta_headers:"},{"line_number":126,"context_line":"            object_type \u003d \u0027mpu\u0027"},{"line_number":127,"context_line":"        if object_type:"},{"line_number":128,"context_line":"            update_base_labels(req, {\u0027object_type\u0027: object_type})"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        if not resp.is_slo:"},{"line_number":131,"context_line":"            # SLO ignores part_number for non-slo objects, but s3api only"}],"source_content_type":"text/x-python","patch_set":7,"id":"fc7aea48_9d00e0e9","line":128,"range":{"start_line":128,"start_character":12,"end_line":128,"end_character":30},"updated":"2026-09-17 16:21:40.000000000","message":"should this be conditional on ``resource\u003d\u003dobject``? can that ever be False?","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1de7ce2101f5553e327ccfeb6871d0266aa8abc7","unresolved":true,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        object_type \u003d None"},{"line_number":122,"context_line":"        if not resp.is_slo:"},{"line_number":123,"context_line":"            object_type \u003d \u0027normal\u0027"},{"line_number":124,"context_line":"        elif s3api_sysmeta_header("},{"line_number":125,"context_line":"                \u0027object\u0027, \u0027upload-id\u0027) in resp.s3api_sysmeta_headers:"},{"line_number":126,"context_line":"            object_type \u003d \u0027s3_mpu\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"4508b261_12e0d5b7","line":123,"updated":"2026-09-23 00:30:48.000000000","message":"this is not ture, ``None`` can still mean “object type was never determined.”\nFor example:\nGET an existing MPU object\n  → object_type initialized to None\n  → authentication fails before object metadata is read\n  → 403 response returns to outer proxy-logging\n  → None → normal would incorrectly classify that request","commit_id":"1fb1de1f25b6ecf27af31cb6c878aac6ce60e1ee"}],"swift/common/middleware/slo.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e62aeb15c3c8333e03aafcc62a72978ca164f552","unresolved":true,"context_lines":[{"line_number":1167,"context_line":"        base_labels \u003d req.environ.get(\u0027swift.base_labels\u0027)"},{"line_number":1168,"context_line":"        if base_labels is not None:"},{"line_number":1169,"context_line":"            base_labels[\u0027object_type\u0027] \u003d ("},{"line_number":1170,"context_line":"                \u0027slo\u0027 if resp_attrs.is_slo else \u0027normal\u0027)"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"        if not resp_attrs.is_slo:"},{"line_number":1173,"context_line":"            # even if the original resp_attrs may have been SLO we may have"}],"source_content_type":"text/x-python","patch_set":4,"id":"66270907_0dcefb44","line":1170,"updated":"2026-09-07 11:24:38.000000000","message":"this would always be set before the s3api middleware handled the response, correct?","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d434d32597f58fea2a051f07aa5de2cde49ab9ff","unresolved":false,"context_lines":[{"line_number":1167,"context_line":"        base_labels \u003d req.environ.get(\u0027swift.base_labels\u0027)"},{"line_number":1168,"context_line":"        if base_labels is not None:"},{"line_number":1169,"context_line":"            base_labels[\u0027object_type\u0027] \u003d ("},{"line_number":1170,"context_line":"                \u0027slo\u0027 if resp_attrs.is_slo else \u0027normal\u0027)"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"        if not resp_attrs.is_slo:"},{"line_number":1173,"context_line":"            # even if the original resp_attrs may have been SLO we may have"}],"source_content_type":"text/x-python","patch_set":4,"id":"5efd5d46_5ad28c6f","line":1170,"in_reply_to":"66270907_0dcefb44","updated":"2026-09-16 19:35:31.000000000","message":"Acknowledged","commit_id":"b3572a0293b9deca51286cfefefa9d89af396c80"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8c865ee5e0653460990b85d0e6ac0e7e24caa14d","unresolved":true,"context_lines":[{"line_number":1166,"context_line":"                    req, resp_iter, resp_attrs)"},{"line_number":1167,"context_line":""},{"line_number":1168,"context_line":"        labels \u003d {\u0027object_type\u0027:"},{"line_number":1169,"context_line":"                  \u0027slo\u0027 if resp_attrs.is_slo else \u0027normal\u0027}"},{"line_number":1170,"context_line":"        update_base_labels(req, labels)"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"        if not resp_attrs.is_slo:"}],"source_content_type":"text/x-python","patch_set":7,"id":"7339fef0_2d3b7c3f","line":1169,"updated":"2026-09-17 16:21:40.000000000","message":"what if we already have \n\n```\nobject_type \u003d foo\n```\n\nI wonder if we should only update the labels if we have an authoritative value","commit_id":"66027e7bc29e5b37dfda7ab23b976d28b0000f59"}],"test/unit/common/middleware/s3api/test_obj.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e6187fbcfc8867f6f26923f2219c58f1d8d5726c","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        status \u003d self._do_test_object_GETorHEAD_conditional("},{"line_number":227,"context_line":"            \u0027HEAD\u0027, {\u0027If-Match\u0027: \u0027\"%s\"\u0027 % legacy_etag}, resp_headers)"},{"line_number":228,"context_line":"        self.assertEqual(\u0027412\u0027, status)"},{"line_number":229,"context_line":"    def test_object_type_for_slo(self):"},{"line_number":230,"context_line":"        object_path \u003d \u0027/v1/AUTH_test/bucket/object\u0027"},{"line_number":231,"context_line":"        s3_etag_header \u003d sysmeta_header(\u0027object\u0027, \u0027etag\u0027)"},{"line_number":232,"context_line":"        cases \u003d ("}],"source_content_type":"text/x-python","patch_set":3,"id":"8633eacd_4a183add","line":229,"updated":"2026-08-31 20:25:52.000000000","message":"pep8: E301 expected 1 blank line, found 0","commit_id":"c7e20fe98442bffe3db96a43d90001aa2a66b206"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"e6187fbcfc8867f6f26923f2219c58f1d8d5726c","unresolved":false,"context_lines":[{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"},{"line_number":269,"context_line":"        self.assertNotIn(\u0027swift.base_labels\u0027, req.environ)"},{"line_number":270,"context_line":"    def test_object_HEAD_error(self):"},{"line_number":271,"context_line":"        # HEAD does not return the body even an error response in the"},{"line_number":272,"context_line":"        # specifications of the REST API."},{"line_number":273,"context_line":"        # So, check the response code for error test of HEAD."}],"source_content_type":"text/x-python","patch_set":3,"id":"9d29e3f1_ff45cd39","line":270,"updated":"2026-08-31 20:25:52.000000000","message":"pep8: E301 expected 1 blank line, found 0","commit_id":"c7e20fe98442bffe3db96a43d90001aa2a66b206"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1de7ce2101f5553e327ccfeb6871d0266aa8abc7","unresolved":true,"context_lines":[{"line_number":36,"context_line":"from swift.common.middleware.s3api.subresource import ACL, User, encode_acl, \\"},{"line_number":37,"context_line":"    Owner, Grant"},{"line_number":38,"context_line":"from swift.common.middleware.s3api.etree import fromstring"},{"line_number":39,"context_line":"from swift.common.middleware.s3api.utils import S3Timestamp, sysmeta_header"},{"line_number":40,"context_line":"from swift.common.middleware.versioned_writes.object_versioning import \\"},{"line_number":41,"context_line":"    DELETE_MARKER_CONTENT_TYPE"},{"line_number":42,"context_line":"from swift.common.utils import md5"}],"source_content_type":"text/x-python","patch_set":8,"id":"efed739e_fbdd0be2","line":39,"updated":"2026-09-23 00:30:48.000000000","message":"``sysmeta_header`` is giving zuul this error\n________________________________________________________________________________________ ERROR collecting test/unit/common/middleware/s3api/test_obj.py ________________________________________________________________________________________\nImportError while importing test module \u0027/home/zuul/src/opendev.org/openstack/swift/test/unit/common/middleware/s3api/test_obj.py\u0027.\nHint: make sure your test modules/packages have valid Python names.\nTraceback:\n/usr/local/lib/python3.7/importlib/__init__.py:127: in import_module\n    return _bootstrap._gcd_import(name[level:], package, level)\ntest/unit/common/middleware/s3api/test_obj.py:39: in \u003cmodule\u003e\n    from swift.common.middleware.s3api.utils import S3Timestamp, sysmeta_header\nE   ImportError: cannot import name \u0027sysmeta_header\u0027 from \u0027swift.common.middleware.s3api.utils\u0027 (/home/zuul/src/opendev.org/openstack/swift/swift/common/middleware/s3api/utils.py)\n```suggestion\nfrom swift.common.middleware.s3api.utils import S3Timestamp, sysmeta_header\n```","commit_id":"1fb1de1f25b6ecf27af31cb6c878aac6ce60e1ee"}]}
