)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"951c79b9e4b999c643fe2494a6e818151587bc33","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"851e47d4_0a2c5309","updated":"2025-04-30 15:54:28.000000000","message":"The test_log_line_format error is likely because there is now a labeled_timing_stats decorator making two calls to time.time() which is consuming from the mock time iterable. The expedient solution is to just add a couple more time values in the middle of the mock list.","commit_id":"c23ce85c65dd77f15357303175930bf0bd2cbdaf"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"81cb2d7440788314763967d64382446b89e00db2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"10ca7ecf_23b0f359","updated":"2025-05-01 15:29:09.000000000","message":"recheck","commit_id":"936d5aa0c7093ef0c37d293f391b76ddae83f7b5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9b729afb_d9100aca","updated":"2025-05-07 14:30:55.000000000","message":"@Yan This patch is doing two things:\n\na. fix exceptions bypassing the labeled_timing_stats decorator\n    - but there\u0027s no new tests directly on labeled_timing_stats decorator\nb. applying the labeled_timing_stats decorator to other methods\n\nThe tests get \"interesting\" because in some cases the legacy decorator isn\u0027t keeping up with the new labeled decorator w.r.t. exception handling.\n\nI suggest breaking into two patches:\n\npatch 1. fix the bug: add exception handling in labeled_timing_stats AND timing_stats, moving them both to base_storage_server.py, and add unit tests for the decorators and object server methods\n\npatch 2. add the feature: apply labeled_timing_stats to other server methods.","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"5823bca8_e4791cb0","updated":"2025-05-21 11:25:25.000000000","message":"change looks good, test coverage is good\n\nmost of my comments are nits re keeping the tests more focussed (and therefore shorter), but there\u0027s one or two unnecessary calls (e.g. clearing statsd) that should definitely be cleaned up. Plus the SSYNC test case is missing.\n\nNote: some comments apply to multiple tests where a pattern is repeated.","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"3d6bc9ad_c469406b","updated":"2025-05-22 14:30:49.000000000","message":"LGTM\n\nTried this out on my vsaio, collected some metrics:\n\n```\n$ python ./udp_listener.py |grep object_server\n[1541261] Listening for UDP packets on port [::]:8125\nswift_object_server_request_timing:32.4042|ms|#account:AUTH_test,container:test,method:PUT,policy:0,status:201\nswift_object_server_request_timing:45.0826|ms|#account:AUTH_test,container:test,method:PUT,policy:0,status:201\nswift_object_server_request_timing:60.6773|ms|#account:AUTH_test,container:test,method:PUT,policy:0,status:201\nswift_object_server_request_timing:0.7546|ms|#account:AUTH_test,container:test,method:GET,policy:0,status:200\nswift_object_server_request_timing:0.509|ms|@0.8|#account:AUTH_test,container:test,method:HEAD,policy:0,status:200\nswift_object_server_request_timing:0.1793|ms|@0.8|#account:AUTH_test,container:ec,method:HEAD,policy:1,status:404\nswift_object_server_request_timing:0.1962|ms|@0.8|#account:AUTH_test,container:ec,method:HEAD,policy:1,status:404\nswift_object_server_request_timing:0.1035|ms|@0.8|#account:AUTH_test,container:ec,method:HEAD,policy:1,status:404\nswift_object_server_request_timing:0.1309|ms|@0.8|#account:AUTH_test,container:ec,method:HEAD,policy:1,status:404\nswift_object_server_request_timing:0.1047|ms|@0.8|#account:AUTH_test,container:ec,method:HEAD,policy:1,status:404\nswift_object_server_request_timing:0.1376|ms|@0.8|#account:AUTH_test,container:ec,method:HEAD,policy:1,status:404\nswift_object_server_request_timing:27.5352|ms|#account:AUTH_test,container:ec,method:PUT,policy:1,status:201\nswift_object_server_request_timing:27.7352|ms|#account:AUTH_test,container:ec,method:PUT,policy:1,status:201\nswift_object_server_request_timing:32.0747|ms|#account:AUTH_test,container:ec,method:PUT,policy:1,status:201\nswift_object_server_request_timing:33.0734|ms|#account:AUTH_test,container:ec,method:PUT,policy:1,status:201\nswift_object_server_request_timing:38.2564|ms|#account:AUTH_test,container:ec,method:PUT,policy:1,status:201\nswift_object_server_request_timing:40.2951|ms|#account:AUTH_test,container:ec,method:PUT,policy:1,status:201\nswift_object_server_request_timing:0.5722|ms|#account:AUTH_test,container:ec,method:GET,policy:1,status:200\nswift_object_server_request_timing:0.6526|ms|#account:AUTH_test,container:ec,method:GET,policy:1,status:200\nswift_object_server_request_timing:0.3266|ms|#account:AUTH_test,container:ec,method:GET,policy:1,status:200\nswift_object_server_request_timing:0.9773|ms|#account:AUTH_test,container:ec,method:GET,policy:1,status:200\nswift_object_server_request_timing:0.2999|ms|@0.1|#method:REPLICATE,policy:1,skip_rehash:False,status:200\nswift_object_server_request_timing:0.5267|ms|@0.1|#method:REPLICATE,policy:1,skip_rehash:False,status:200\nswift_object_server_request_timing:0.5963|ms|@0.1|#method:REPLICATE,policy:1,skip_rehash:False,status:200\n```","commit_id":"c66c0bfd258d5c9a626d04fcf109ca27ae3e64b0"}],"swift/common/utils/stats_utils.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"951c79b9e4b999c643fe2494a6e818151587bc33","unresolved":true,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Miscellaneous utility functions for use with Swift.\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import time"},{"line_number":20,"context_line":"import functools"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from swift.common.http import is_server_error"},{"line_number":23,"context_line":"from swift.common.swob import HTTPException"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# For backwards compatability with 3rd party middlewares"},{"line_number":26,"context_line":"from swift.common.registry import register_swift_info, get_swift_info  # noqa"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from .base import (  # noqa"},{"line_number":29,"context_line":"    md5, get_valid_utf8_str, quote, split_path)"},{"line_number":30,"context_line":"from swift.common.utils.logs import (   # noqa"},{"line_number":31,"context_line":"    SysLogHandler,  # t.u.helpers.setup_servers monkey patch is sketch"},{"line_number":32,"context_line":"    logging_monkey_patch,"},{"line_number":33,"context_line":"    get_swift_logger,"},{"line_number":34,"context_line":"    get_prefixed_swift_logger,"},{"line_number":35,"context_line":"    LogLevelFilter,"},{"line_number":36,"context_line":"    NullLogger,"},{"line_number":37,"context_line":"    capture_stdio,"},{"line_number":38,"context_line":"    SwiftLogFormatter,"},{"line_number":39,"context_line":"    LoggerFileObject,"},{"line_number":40,"context_line":"    PipeMutex,"},{"line_number":41,"context_line":"    NoopMutex,"},{"line_number":42,"context_line":"    ThreadSafeSysLogHandler,"},{"line_number":43,"context_line":"    StrAnonymizer,"},{"line_number":44,"context_line":"    get_log_line,"},{"line_number":45,"context_line":"    StrFormatTime,"},{"line_number":46,"context_line":"    LogStringFormatter,"},{"line_number":47,"context_line":"    get_policy_index,"},{"line_number":48,"context_line":"    LOG_LINE_DEFAULT_FORMAT,"},{"line_number":49,"context_line":"    NOTICE,"},{"line_number":50,"context_line":")"},{"line_number":51,"context_line":"from swift.common.utils.config import ( # noqa"},{"line_number":52,"context_line":"    TRUE_VALUES,"},{"line_number":53,"context_line":"    NicerInterpolation,"},{"line_number":54,"context_line":"    config_true_value,"},{"line_number":55,"context_line":"    append_underscore,"},{"line_number":56,"context_line":"    non_negative_float,"},{"line_number":57,"context_line":"    non_negative_int,"},{"line_number":58,"context_line":"    config_positive_int_value,"},{"line_number":59,"context_line":"    config_float_value,"},{"line_number":60,"context_line":"    config_auto_int_value,"},{"line_number":61,"context_line":"    config_percent_value,"},{"line_number":62,"context_line":"    config_request_node_count_value,"},{"line_number":63,"context_line":"    config_fallocate_value,"},{"line_number":64,"context_line":"    config_read_prefixed_options,"},{"line_number":65,"context_line":"    config_read_reseller_options,"},{"line_number":66,"context_line":"    parse_prefixed_conf,"},{"line_number":67,"context_line":"    affinity_locality_predicate,"},{"line_number":68,"context_line":"    affinity_key_function,"},{"line_number":69,"context_line":"    readconf,"},{"line_number":70,"context_line":"    read_conf_dir,"},{"line_number":71,"context_line":")"},{"line_number":72,"context_line":"from swift.common.utils.libc import (  # noqa"},{"line_number":73,"context_line":"    F_SETPIPE_SZ,"},{"line_number":74,"context_line":"    load_libc_function,"},{"line_number":75,"context_line":"    drop_buffer_cache,"},{"line_number":76,"context_line":"    get_md5_socket,"},{"line_number":77,"context_line":"    modify_priority,"},{"line_number":78,"context_line":"    _LibcWrapper,"},{"line_number":79,"context_line":")"},{"line_number":80,"context_line":"from swift.common.utils.timestamp import (  # noqa"},{"line_number":81,"context_line":"    NORMAL_FORMAT,"},{"line_number":82,"context_line":"    INTERNAL_FORMAT,"},{"line_number":83,"context_line":"    SHORT_FORMAT,"},{"line_number":84,"context_line":"    MAX_OFFSET,"},{"line_number":85,"context_line":"    PRECISION,"},{"line_number":86,"context_line":"    Timestamp,"},{"line_number":87,"context_line":"    encode_timestamps,"},{"line_number":88,"context_line":"    decode_timestamps,"},{"line_number":89,"context_line":"    normalize_timestamp,"},{"line_number":90,"context_line":"    EPOCH,"},{"line_number":91,"context_line":"    last_modified_date_to_timestamp,"},{"line_number":92,"context_line":"    normalize_delete_at_timestamp,"},{"line_number":93,"context_line":"    UTC,"},{"line_number":94,"context_line":")"},{"line_number":95,"context_line":"from swift.common.utils.ipaddrs import (  # noqa"},{"line_number":96,"context_line":"    is_valid_ip,"},{"line_number":97,"context_line":"    is_valid_ipv4,"},{"line_number":98,"context_line":"    is_valid_ipv6,"},{"line_number":99,"context_line":"    expand_ipv6,"},{"line_number":100,"context_line":"    parse_socket_string,"},{"line_number":101,"context_line":"    whataremyips,"},{"line_number":102,"context_line":")"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def labeled_timing_stats(metric, **dec_kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9235a90e_584d703f","line":102,"range":{"start_line":16,"start_character":0,"end_line":102,"end_character":1},"updated":"2025-04-30 15:54:28.000000000","message":"did you intend to copy all of this here - I don\u0027t think it should be moving","commit_id":"c23ce85c65dd77f15357303175930bf0bd2cbdaf"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"0473f47f812fe9632ddecbe582f0cac14dedc0d4","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Miscellaneous utility functions for use with Swift.\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import time"},{"line_number":20,"context_line":"import functools"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from swift.common.http import is_server_error"},{"line_number":23,"context_line":"from swift.common.swob import HTTPException"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# For backwards compatability with 3rd party middlewares"},{"line_number":26,"context_line":"from swift.common.registry import register_swift_info, get_swift_info  # noqa"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from .base import (  # noqa"},{"line_number":29,"context_line":"    md5, get_valid_utf8_str, quote, split_path)"},{"line_number":30,"context_line":"from swift.common.utils.logs import (   # noqa"},{"line_number":31,"context_line":"    SysLogHandler,  # t.u.helpers.setup_servers monkey patch is sketch"},{"line_number":32,"context_line":"    logging_monkey_patch,"},{"line_number":33,"context_line":"    get_swift_logger,"},{"line_number":34,"context_line":"    get_prefixed_swift_logger,"},{"line_number":35,"context_line":"    LogLevelFilter,"},{"line_number":36,"context_line":"    NullLogger,"},{"line_number":37,"context_line":"    capture_stdio,"},{"line_number":38,"context_line":"    SwiftLogFormatter,"},{"line_number":39,"context_line":"    LoggerFileObject,"},{"line_number":40,"context_line":"    PipeMutex,"},{"line_number":41,"context_line":"    NoopMutex,"},{"line_number":42,"context_line":"    ThreadSafeSysLogHandler,"},{"line_number":43,"context_line":"    StrAnonymizer,"},{"line_number":44,"context_line":"    get_log_line,"},{"line_number":45,"context_line":"    StrFormatTime,"},{"line_number":46,"context_line":"    LogStringFormatter,"},{"line_number":47,"context_line":"    get_policy_index,"},{"line_number":48,"context_line":"    LOG_LINE_DEFAULT_FORMAT,"},{"line_number":49,"context_line":"    NOTICE,"},{"line_number":50,"context_line":")"},{"line_number":51,"context_line":"from swift.common.utils.config import ( # noqa"},{"line_number":52,"context_line":"    TRUE_VALUES,"},{"line_number":53,"context_line":"    NicerInterpolation,"},{"line_number":54,"context_line":"    config_true_value,"},{"line_number":55,"context_line":"    append_underscore,"},{"line_number":56,"context_line":"    non_negative_float,"},{"line_number":57,"context_line":"    non_negative_int,"},{"line_number":58,"context_line":"    config_positive_int_value,"},{"line_number":59,"context_line":"    config_float_value,"},{"line_number":60,"context_line":"    config_auto_int_value,"},{"line_number":61,"context_line":"    config_percent_value,"},{"line_number":62,"context_line":"    config_request_node_count_value,"},{"line_number":63,"context_line":"    config_fallocate_value,"},{"line_number":64,"context_line":"    config_read_prefixed_options,"},{"line_number":65,"context_line":"    config_read_reseller_options,"},{"line_number":66,"context_line":"    parse_prefixed_conf,"},{"line_number":67,"context_line":"    affinity_locality_predicate,"},{"line_number":68,"context_line":"    affinity_key_function,"},{"line_number":69,"context_line":"    readconf,"},{"line_number":70,"context_line":"    read_conf_dir,"},{"line_number":71,"context_line":")"},{"line_number":72,"context_line":"from swift.common.utils.libc import (  # noqa"},{"line_number":73,"context_line":"    F_SETPIPE_SZ,"},{"line_number":74,"context_line":"    load_libc_function,"},{"line_number":75,"context_line":"    drop_buffer_cache,"},{"line_number":76,"context_line":"    get_md5_socket,"},{"line_number":77,"context_line":"    modify_priority,"},{"line_number":78,"context_line":"    _LibcWrapper,"},{"line_number":79,"context_line":")"},{"line_number":80,"context_line":"from swift.common.utils.timestamp import (  # noqa"},{"line_number":81,"context_line":"    NORMAL_FORMAT,"},{"line_number":82,"context_line":"    INTERNAL_FORMAT,"},{"line_number":83,"context_line":"    SHORT_FORMAT,"},{"line_number":84,"context_line":"    MAX_OFFSET,"},{"line_number":85,"context_line":"    PRECISION,"},{"line_number":86,"context_line":"    Timestamp,"},{"line_number":87,"context_line":"    encode_timestamps,"},{"line_number":88,"context_line":"    decode_timestamps,"},{"line_number":89,"context_line":"    normalize_timestamp,"},{"line_number":90,"context_line":"    EPOCH,"},{"line_number":91,"context_line":"    last_modified_date_to_timestamp,"},{"line_number":92,"context_line":"    normalize_delete_at_timestamp,"},{"line_number":93,"context_line":"    UTC,"},{"line_number":94,"context_line":")"},{"line_number":95,"context_line":"from swift.common.utils.ipaddrs import (  # noqa"},{"line_number":96,"context_line":"    is_valid_ip,"},{"line_number":97,"context_line":"    is_valid_ipv4,"},{"line_number":98,"context_line":"    is_valid_ipv6,"},{"line_number":99,"context_line":"    expand_ipv6,"},{"line_number":100,"context_line":"    parse_socket_string,"},{"line_number":101,"context_line":"    whataremyips,"},{"line_number":102,"context_line":")"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def labeled_timing_stats(metric, **dec_kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"12fecd32_932176ed","line":102,"range":{"start_line":16,"start_character":0,"end_line":102,"end_character":1},"in_reply_to":"9235a90e_584d703f","updated":"2025-05-01 15:31:13.000000000","message":"should not copy those","commit_id":"c23ce85c65dd77f15357303175930bf0bd2cbdaf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"951c79b9e4b999c643fe2494a6e818151587bc33","unresolved":true,"context_lines":[{"line_number":183,"context_line":"            start_time \u003d time.time()"},{"line_number":184,"context_line":"            result \u003d func(cache, *args, **kwargs)"},{"line_number":185,"context_line":"            cache.logger.timing_since("},{"line_number":186,"context_line":"                \u0027memcached.\u0027 + method + \u0027.timing\u0027, start_time, **dec_kwargs)"},{"line_number":187,"context_line":"            return result"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        return _timing_stats"}],"source_content_type":"text/x-python","patch_set":1,"id":"ab8ff6cb_36a0868f","line":186,"updated":"2025-04-30 15:54:28.000000000","message":"This decorator is generic *except* for the prefix given to the metric name which is obviously very opinionated about being for memcached.\n\nAs such, I wonder why it was/is in a utils module - what else will use this other than memcached.py?","commit_id":"c23ce85c65dd77f15357303175930bf0bd2cbdaf"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            start_time \u003d time.time()"},{"line_number":184,"context_line":"            result \u003d func(cache, *args, **kwargs)"},{"line_number":185,"context_line":"            cache.logger.timing_since("},{"line_number":186,"context_line":"                \u0027memcached.\u0027 + method + \u0027.timing\u0027, start_time, **dec_kwargs)"},{"line_number":187,"context_line":"            return result"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        return _timing_stats"}],"source_content_type":"text/x-python","patch_set":1,"id":"5402c3e5_c5438d58","line":186,"in_reply_to":"2a7542bb_a7f44503","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"c23ce85c65dd77f15357303175930bf0bd2cbdaf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":183,"context_line":"            start_time \u003d time.time()"},{"line_number":184,"context_line":"            result \u003d func(cache, *args, **kwargs)"},{"line_number":185,"context_line":"            cache.logger.timing_since("},{"line_number":186,"context_line":"                \u0027memcached.\u0027 + method + \u0027.timing\u0027, start_time, **dec_kwargs)"},{"line_number":187,"context_line":"            return result"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        return _timing_stats"}],"source_content_type":"text/x-python","patch_set":1,"id":"2a7542bb_a7f44503","line":186,"in_reply_to":"ab8ff6cb_36a0868f","updated":"2025-05-07 14:30:55.000000000","message":"my original comment was a little off-topic. I\u0027m inclined to suggest not moving this function, since it is unrelated to the scope o this patch.","commit_id":"c23ce85c65dd77f15357303175930bf0bd2cbdaf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2010-2012 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":3,"id":"2e38793d_b75b7e37","line":1,"updated":"2025-05-07 14:30:55.000000000","message":"it\u0027s 2025 now! ;-)","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2010-2012 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":3,"id":"81eb62ee_2176988d","line":1,"in_reply_to":"2e38793d_b75b7e37","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":43,"context_line":"                    ctrl, req, *args, timing_stats_labels\u003dlabels, **kwargs)"},{"line_number":44,"context_line":"            except HTTPException as e:"},{"line_number":45,"context_line":"                resp \u003d e"},{"line_number":46,"context_line":"                raise e"},{"line_number":47,"context_line":"            finally:"},{"line_number":48,"context_line":"                if resp is not None:"},{"line_number":49,"context_line":"                    labels[\u0027method\u0027] \u003d req_method"}],"source_content_type":"text/x-python","patch_set":3,"id":"033eab80_15402628","line":46,"updated":"2025-05-07 14:30:55.000000000","message":"I *think* we could proceed to return ``resp`` and not raise e again","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                    ctrl, req, *args, timing_stats_labels\u003dlabels, **kwargs)"},{"line_number":44,"context_line":"            except HTTPException as e:"},{"line_number":45,"context_line":"                resp \u003d e"},{"line_number":46,"context_line":"                raise e"},{"line_number":47,"context_line":"            finally:"},{"line_number":48,"context_line":"                if resp is not None:"},{"line_number":49,"context_line":"                    labels[\u0027method\u0027] \u003d req_method"}],"source_content_type":"text/x-python","patch_set":3,"id":"218c6939_cf1f32b4","line":46,"in_reply_to":"033eab80_15402628","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":45,"context_line":"                resp \u003d e"},{"line_number":46,"context_line":"                raise e"},{"line_number":47,"context_line":"            finally:"},{"line_number":48,"context_line":"                if resp is not None:"},{"line_number":49,"context_line":"                    labels[\u0027method\u0027] \u003d req_method"},{"line_number":50,"context_line":"                    labels[\u0027status\u0027] \u003d resp.status_int"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"4aa2275d_6f3f944c","line":48,"updated":"2025-05-07 14:30:55.000000000","message":"can resp ever be None?\n\nThe servers don\u0027t seem to expect None to be returned from the decorated functions, therefore the decorator shouldn\u0027t need to expect None.","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                resp \u003d e"},{"line_number":46,"context_line":"                raise e"},{"line_number":47,"context_line":"            finally:"},{"line_number":48,"context_line":"                if resp is not None:"},{"line_number":49,"context_line":"                    labels[\u0027method\u0027] \u003d req_method"},{"line_number":50,"context_line":"                    labels[\u0027status\u0027] \u003d resp.status_int"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ce8d2517_7aef6e94","line":48,"in_reply_to":"4aa2275d_6f3f944c","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":54,"context_line":"            return resp"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        return _timing_stats"},{"line_number":57,"context_line":"    return decorating_func"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def timing_stats(**dec_kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"48bc1ec7_9769b795","line":57,"updated":"2025-05-07 14:30:55.000000000","message":"I question creating a module as a home for these decorators. They aren\u0027t really general utilities because they are very opinionated about the signatures and return type of the functions they wrap.\n\nI\u0027d be inclined to put ``labeled_timing_stats`` in base_storage_server.py, and only move ``timing_stats`` to the same place if you *need* to in order to also catch HTTPExceptions there (which could be a separate patch).","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            return resp"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        return _timing_stats"},{"line_number":57,"context_line":"    return decorating_func"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def timing_stats(**dec_kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5afb7008_60be0958","line":57,"in_reply_to":"48bc1ec7_9769b795","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":86,"context_line":"            return resp"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        return _timing_stats"},{"line_number":89,"context_line":"    return decorating_func"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"def memcached_timing_stats(**dec_kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"2eaa7572_0c2ccd61","line":89,"updated":"2025-05-07 14:30:55.000000000","message":"I think this didn\u0027t need to move - until someone wants to also catch HTTPException in this decorator. For the time being it could remain in utils.\n\nThat said, it would be good to fix the HTTPException catching, but perhaps in a separate patch.","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            return resp"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        return _timing_stats"},{"line_number":89,"context_line":"    return decorating_func"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"def memcached_timing_stats(**dec_kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"40550af5_440d26e6","line":89,"in_reply_to":"2eaa7572_0c2ccd61","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"}],"swift/obj/server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"66862ad3b442fa9bb98a8a307fd8c067e21bb43e","unresolved":true,"context_lines":[{"line_number":658,"context_line":""},{"line_number":659,"context_line":"    @public"},{"line_number":660,"context_line":"    @timing_stats()"},{"line_number":661,"context_line":"    @labeled_timing_stats(metric\u003dLABELED_METRIC_NAME)"},{"line_number":662,"context_line":"    def POST(self, request, timing_stats_labels):"},{"line_number":663,"context_line":"        \"\"\"Handle HTTP POST requests for the Swift Object Server.\"\"\""},{"line_number":664,"context_line":"        device, partition, account, container, obj, policy \u003d \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"1fd18017_48c499c7","line":661,"updated":"2025-05-02 15:13:24.000000000","message":"not to self: the reason we don\u0027t just wrap methods ONCE where they are called from the __call__ method is that the sample_rate may vary between methods (e.g. REPLICATE)","commit_id":"936d5aa0c7093ef0c37d293f391b76ddae83f7b5"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"24df70a789255226dd767b574b485867926be695","unresolved":false,"context_lines":[{"line_number":658,"context_line":""},{"line_number":659,"context_line":"    @public"},{"line_number":660,"context_line":"    @timing_stats()"},{"line_number":661,"context_line":"    @labeled_timing_stats(metric\u003dLABELED_METRIC_NAME)"},{"line_number":662,"context_line":"    def POST(self, request, timing_stats_labels):"},{"line_number":663,"context_line":"        \"\"\"Handle HTTP POST requests for the Swift Object Server.\"\"\""},{"line_number":664,"context_line":"        device, partition, account, container, obj, policy \u003d \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"9cd60dfc_6a22b78c","line":661,"in_reply_to":"1fd18017_48c499c7","updated":"2025-05-06 15:30:25.000000000","message":"Acknowledged","commit_id":"936d5aa0c7093ef0c37d293f391b76ddae83f7b5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":1262,"context_line":"            get_obj_name_and_placement(request)"},{"line_number":1263,"context_line":"        timing_stats_labels[\u0027account\u0027] \u003d account"},{"line_number":1264,"context_line":"        timing_stats_labels[\u0027container\u0027] \u003d container"},{"line_number":1265,"context_line":"        timing_stats_labels[\u0027policy\u0027] \u003d int(policy)"},{"line_number":1266,"context_line":""},{"line_number":1267,"context_line":"        req_timestamp \u003d valid_timestamp(request)"},{"line_number":1268,"context_line":"        next_part_power \u003d request.headers.get(\u0027X-Backend-Next-Part-Power\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"d588007e_56f24adc","line":1265,"updated":"2025-05-21 11:25:25.000000000","message":"so it\u0027s the same for every method...except...","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":1262,"context_line":"            get_obj_name_and_placement(request)"},{"line_number":1263,"context_line":"        timing_stats_labels[\u0027account\u0027] \u003d account"},{"line_number":1264,"context_line":"        timing_stats_labels[\u0027container\u0027] \u003d container"},{"line_number":1265,"context_line":"        timing_stats_labels[\u0027policy\u0027] \u003d int(policy)"},{"line_number":1266,"context_line":""},{"line_number":1267,"context_line":"        req_timestamp \u003d valid_timestamp(request)"},{"line_number":1268,"context_line":"        next_part_power \u003d request.headers.get(\u0027X-Backend-Next-Part-Power\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"551e55b8_a4f29fa8","line":1265,"in_reply_to":"d588007e_56f24adc","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":1383,"context_line":"        # understand the X-Backend-No-Commit header."},{"line_number":1384,"context_line":"        headers \u003d {\u0027X-Backend-Accept-No-Commit\u0027: True}"},{"line_number":1385,"context_line":"        receiver \u003d ssync_receiver.Receiver(self, request)"},{"line_number":1386,"context_line":"        timing_stats_labels[\u0027policy\u0027] \u003d int(receiver.policy)"},{"line_number":1387,"context_line":"        return Response(app_iter\u003dreceiver(),"},{"line_number":1388,"context_line":"                        headers\u003dheaders)"},{"line_number":1389,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"c299cb72_de82ef18","line":1386,"updated":"2025-05-21 11:25:25.000000000","message":"haha, ...SSYNC is the one case that deviates from the repeated pattern","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":1383,"context_line":"        # understand the X-Backend-No-Commit header."},{"line_number":1384,"context_line":"        headers \u003d {\u0027X-Backend-Accept-No-Commit\u0027: True}"},{"line_number":1385,"context_line":"        receiver \u003d ssync_receiver.Receiver(self, request)"},{"line_number":1386,"context_line":"        timing_stats_labels[\u0027policy\u0027] \u003d int(receiver.policy)"},{"line_number":1387,"context_line":"        return Response(app_iter\u003dreceiver(),"},{"line_number":1388,"context_line":"                        headers\u003dheaders)"},{"line_number":1389,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"64dbbff5_1ab5240f","line":1386,"in_reply_to":"c299cb72_de82ef18","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":1385,"context_line":"        receiver \u003d ssync_receiver.Receiver(self, request)"},{"line_number":1386,"context_line":"        timing_stats_labels[\u0027policy\u0027] \u003d int(receiver.policy)"},{"line_number":1387,"context_line":"        return Response(app_iter\u003dreceiver(),"},{"line_number":1388,"context_line":"                        headers\u003dheaders)"},{"line_number":1389,"context_line":""},{"line_number":1390,"context_line":"    def __call__(self, env, start_response):"},{"line_number":1391,"context_line":"        \"\"\"WSGI Application entry point for the Swift Object Server.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"b5403dcb_2b983545","line":1388,"updated":"2025-05-21 11:25:25.000000000","message":"nit: no need for the line wrap","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":1385,"context_line":"        receiver \u003d ssync_receiver.Receiver(self, request)"},{"line_number":1386,"context_line":"        timing_stats_labels[\u0027policy\u0027] \u003d int(receiver.policy)"},{"line_number":1387,"context_line":"        return Response(app_iter\u003dreceiver(),"},{"line_number":1388,"context_line":"                        headers\u003dheaders)"},{"line_number":1389,"context_line":""},{"line_number":1390,"context_line":"    def __call__(self, env, start_response):"},{"line_number":1391,"context_line":"        \"\"\"WSGI Application entry point for the Swift Object Server.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"86836798_80578ea3","line":1388,"in_reply_to":"b5403dcb_2b983545","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"}],"test/unit/common/test_stats_utils.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Tests for swift.common.utils\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from swift.common.utils.stats_utils import timing_stats, \\"},{"line_number":19,"context_line":"    memcached_timing_stats, labeled_timing_stats"}],"source_content_type":"text/x-python","patch_set":3,"id":"346505da_93f395f2","line":16,"updated":"2025-05-07 14:30:55.000000000","message":"this docstring doesn\u0027t make sense\n\ndepending on what happens to the new stats_utils module, these tests might need to be relocated","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\"Tests for swift.common.utils\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from swift.common.utils.stats_utils import timing_stats, \\"},{"line_number":19,"context_line":"    memcached_timing_stats, labeled_timing_stats"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a3172c7_d80e4fce","line":16,"in_reply_to":"346505da_93f395f2","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"66862ad3b442fa9bb98a8a307fd8c067e21bb43e","unresolved":true,"context_lines":[{"line_number":310,"context_line":"        })"},{"line_number":311,"context_line":"        self.assertEqual({"},{"line_number":312,"context_line":"            \u0027transfer_rate\u0027: [((\u0027PUT.sda1.timing\u0027, mock.ANY, mock.ANY), {})],"},{"line_number":313,"context_line":"            \u0027timing\u0027: [((\u0027PUT.sda1.timing\u0027, mock.ANY, None), {})],"},{"line_number":314,"context_line":"            \u0027timing_since\u0027: [((\u0027PUT.timing\u0027, now), {})]"},{"line_number":315,"context_line":"        }, statsd_client.calls)"},{"line_number":316,"context_line":"        self.assertEqual({"}],"source_content_type":"text/x-python","patch_set":2,"id":"e378b312_4c328cd8","line":313,"updated":"2025-05-02 15:13:24.000000000","message":"Previously on master the ``statsd_client.transfer_rate`` called through to ``timing``, so you would have seen these two calls captured for the single metric being emitted.\n\nThat was changed on master here https://review.opendev.org/c/openstack/swift/+/946349 so that transfer_rate now calls ``_timing``. When gerrit runs tests it is rebasing your patch onto master and picking up that change so the test fails.\n\nRebasing and dropping the expected ``timing`` call should fix it.","commit_id":"936d5aa0c7093ef0c37d293f391b76ddae83f7b5"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"24df70a789255226dd767b574b485867926be695","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        })"},{"line_number":311,"context_line":"        self.assertEqual({"},{"line_number":312,"context_line":"            \u0027transfer_rate\u0027: [((\u0027PUT.sda1.timing\u0027, mock.ANY, mock.ANY), {})],"},{"line_number":313,"context_line":"            \u0027timing\u0027: [((\u0027PUT.sda1.timing\u0027, mock.ANY, None), {})],"},{"line_number":314,"context_line":"            \u0027timing_since\u0027: [((\u0027PUT.timing\u0027, now), {})]"},{"line_number":315,"context_line":"        }, statsd_client.calls)"},{"line_number":316,"context_line":"        self.assertEqual({"}],"source_content_type":"text/x-python","patch_set":2,"id":"d4b9e6fe_40989e30","line":313,"in_reply_to":"e378b312_4c328cd8","updated":"2025-05-06 15:30:25.000000000","message":"Acknowledged","commit_id":"936d5aa0c7093ef0c37d293f391b76ddae83f7b5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":502,"context_line":"                },"},{"line_number":503,"context_line":"                \u0027sample_rate\u0027: 0.1"},{"line_number":504,"context_line":"            })]},"},{"line_number":505,"context_line":"            statsd.calls)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def test_legacy_and_labeled_timing_stats_ssync_success(self):"},{"line_number":508,"context_line":"        req \u003d Request.blank(\u0027/sda1/0\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7601c0a3_117cecf9","line":505,"updated":"2025-05-07 14:30:55.000000000","message":"we can provoke an exception in the REPLICATE method by using a bad policy:\n\n```\n    def test_legacy_and_labeled_timing_stats_replicate_bad_policy(self):\n        # non-existent policy\n        req \u003d Request.blank(\n            \u0027/sda1/p/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027REPLICATE\u0027},\n            headers\u003d{\u0027X-Backend-Storage-Policy-Index\u0027: \u002799\u0027}\n        )\n        now \u003d time()\n        statsd_client, statsd, _ \u003d self._do_test_timing_stats(\n            self.conf, req, now)\n        # XXX fails here...\n        #self.assertEqual({\u0027timing_since\u0027: [((\u0027REPLICATE.timing\u0027, now), {\n        #    \u0027sample_rate\u0027: 0.1\n        #})]}, statsd_client.calls)\n        self.assertEqual(\n            {\u0027timing_since\u0027: [((\u0027swift_object_server_request_timing\u0027, now), {\n                \u0027labels\u0027: {\n                    \u0027method\u0027: \u0027REPLICATE\u0027,\n                    \u0027status\u0027: 503\n                },\n                \u0027sample_rate\u0027: 0.1\n            })]},\n            statsd.calls)\n\n```","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":502,"context_line":"                },"},{"line_number":503,"context_line":"                \u0027sample_rate\u0027: 0.1"},{"line_number":504,"context_line":"            })]},"},{"line_number":505,"context_line":"            statsd.calls)"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def test_legacy_and_labeled_timing_stats_ssync_success(self):"},{"line_number":508,"context_line":"        req \u003d Request.blank(\u0027/sda1/0\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df46330f_1c69c7d6","line":505,"in_reply_to":"7601c0a3_117cecf9","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":526,"context_line":"        }, statsd.calls)"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    def _do_test_legacy_and_labeled_timing_stats_error("},{"line_number":529,"context_line":"            self, req, sample_rate\u003dNone, additional_labels\u003dNone):"},{"line_number":530,"context_line":"        now \u003d time()"},{"line_number":531,"context_line":"        # mount_check will provoke a 507"},{"line_number":532,"context_line":"        conf \u003d dict(self.conf, mount_check\u003d\u0027true\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"cf3a3766_4b3c5cc1","line":529,"updated":"2025-05-07 14:30:55.000000000","message":"you could write this as \n\n```\ndef _do_test_legacy_and_labeled_timing_stats_error(\n            self, req, additional_labels\u003dNone, **kwargs):\n```\n\nand then just skip making a kwargs dict at line 534","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":526,"context_line":"        }, statsd.calls)"},{"line_number":527,"context_line":""},{"line_number":528,"context_line":"    def _do_test_legacy_and_labeled_timing_stats_error("},{"line_number":529,"context_line":"            self, req, sample_rate\u003dNone, additional_labels\u003dNone):"},{"line_number":530,"context_line":"        now \u003d time()"},{"line_number":531,"context_line":"        # mount_check will provoke a 507"},{"line_number":532,"context_line":"        conf \u003d dict(self.conf, mount_check\u003d\u0027true\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"02a2b81d_c53a3ed0","line":529,"in_reply_to":"cf3a3766_4b3c5cc1","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":553,"context_line":"        self._do_test_legacy_and_labeled_timing_stats_error("},{"line_number":554,"context_line":"            req, additional_labels\u003d{\u0027account\u0027: \u0027a\u0027, \u0027container\u0027: \u0027c\u0027, })"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"    def test_legacy_and_labeled_timing_stats_put_error(self):"},{"line_number":557,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":558,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp,"},{"line_number":559,"context_line":"                   \u0027X-Object-Meta-1\u0027: \u0027One\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"4eb6f35d_476f98c3","line":556,"range":{"start_line":556,"start_character":13,"end_line":556,"end_character":21},"updated":"2025-05-07 14:30:55.000000000","message":"this test does not make any legacy assertions (because timing_stats does not catch the HTTPException)\n\nin fact, is this and the ssync test just a special case because an HTTPException is raised rather than returned and so the legacy assertion fails in _do_test_legacy_and_labeled_timing_stats_error?\n\nMaybe we should fix the exception handling in legacy and labeled decorators first, and then extend the pattern to all methods.","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":553,"context_line":"        self._do_test_legacy_and_labeled_timing_stats_error("},{"line_number":554,"context_line":"            req, additional_labels\u003d{\u0027account\u0027: \u0027a\u0027, \u0027container\u0027: \u0027c\u0027, })"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"    def test_legacy_and_labeled_timing_stats_put_error(self):"},{"line_number":557,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":558,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp,"},{"line_number":559,"context_line":"                   \u0027X-Object-Meta-1\u0027: \u0027One\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"b447741b_68b226df","line":556,"range":{"start_line":556,"start_character":13,"end_line":556,"end_character":21},"in_reply_to":"4eb6f35d_476f98c3","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a71cf17ced8f6999cedfd4f449822f95928aa85d","unresolved":true,"context_lines":[{"line_number":611,"context_line":"        self._do_test_legacy_and_labeled_timing_stats_error("},{"line_number":612,"context_line":"            req, sample_rate\u003d0.1, additional_labels\u003d{\u0027skip_rehash\u0027: False, })"},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"    def test_legacy_and_labeled_timing_stats_ssync_error(self):"},{"line_number":615,"context_line":"        def fake_get_dev_path(*args, **kwargs):"},{"line_number":616,"context_line":"            return None"},{"line_number":617,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"a2816994_21eacf1a","line":614,"range":{"start_line":614,"start_character":13,"end_line":614,"end_character":20},"updated":"2025-05-07 14:30:55.000000000","message":"as with PUT there\u0027s not really any legacy assertions here","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"4e7359dfa6045ce4addcff53333cf2cab78bab34","unresolved":false,"context_lines":[{"line_number":611,"context_line":"        self._do_test_legacy_and_labeled_timing_stats_error("},{"line_number":612,"context_line":"            req, sample_rate\u003d0.1, additional_labels\u003d{\u0027skip_rehash\u0027: False, })"},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"    def test_legacy_and_labeled_timing_stats_ssync_error(self):"},{"line_number":615,"context_line":"        def fake_get_dev_path(*args, **kwargs):"},{"line_number":616,"context_line":"            return None"},{"line_number":617,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c4cf3612_f0166e89","line":614,"range":{"start_line":614,"start_character":13,"end_line":614,"end_character":20},"in_reply_to":"a2816994_21eacf1a","updated":"2025-05-15 15:29:48.000000000","message":"Acknowledged","commit_id":"29ee519d7b2bfc54c2a31d64f6a63eb70720fecd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def _do_test_timing_stats(self, conf, req, now):"},{"line_number":232,"context_line":"        with mock.patch(\u0027swift.common.utils.time.time\u0027, return_value\u003dnow), \\"},{"line_number":233,"context_line":"                mock.patch(\u0027swift.common.statsd_client.StatsdClient\u0027,"},{"line_number":234,"context_line":"                           FakeStatsdClient), \\"},{"line_number":235,"context_line":"                mock.patch(\u0027swift.common.statsd_client.LabeledStatsdClient\u0027,"},{"line_number":236,"context_line":"                           FakeLabeledStatsdClient):"},{"line_number":237,"context_line":"            app \u003d object_server.ObjectController(conf, logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":5,"id":"462a95db_6682b52c","line":234,"range":{"start_line":233,"start_character":16,"end_line":234,"end_character":47},"updated":"2025-05-21 11:25:25.000000000","message":"I\u0027m not sure this is needed because the app is passed self.logger which IS a debug logger with a FakeStatsdClient already","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def _do_test_timing_stats(self, conf, req, now):"},{"line_number":232,"context_line":"        with mock.patch(\u0027swift.common.utils.time.time\u0027, return_value\u003dnow), \\"},{"line_number":233,"context_line":"                mock.patch(\u0027swift.common.statsd_client.StatsdClient\u0027,"},{"line_number":234,"context_line":"                           FakeStatsdClient), \\"},{"line_number":235,"context_line":"                mock.patch(\u0027swift.common.statsd_client.LabeledStatsdClient\u0027,"},{"line_number":236,"context_line":"                           FakeLabeledStatsdClient):"},{"line_number":237,"context_line":"            app \u003d object_server.ObjectController(conf, logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":5,"id":"bb56996b_b8c62148","line":234,"range":{"start_line":233,"start_character":16,"end_line":234,"end_character":47},"in_reply_to":"462a95db_6682b52c","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def _do_test_timing_stats(self, conf, req, now):"},{"line_number":232,"context_line":"        with mock.patch(\u0027swift.common.utils.time.time\u0027, return_value\u003dnow), \\"},{"line_number":233,"context_line":"                mock.patch(\u0027swift.common.statsd_client.StatsdClient\u0027,"},{"line_number":234,"context_line":"                           FakeStatsdClient), \\"},{"line_number":235,"context_line":"                mock.patch(\u0027swift.common.statsd_client.LabeledStatsdClient\u0027,"},{"line_number":236,"context_line":"                           FakeLabeledStatsdClient):"},{"line_number":237,"context_line":"            app \u003d object_server.ObjectController(conf, logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":5,"id":"13383036_006e67a4","line":234,"range":{"start_line":233,"start_character":16,"end_line":234,"end_character":47},"in_reply_to":"462a95db_6682b52c","updated":"2025-05-22 14:30:49.000000000","message":"Done","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":249,"context_line":"    def test_legacy_and_labeled_timing_stats_get_success(self):"},{"line_number":250,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":251,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp,"},{"line_number":252,"context_line":"                   \u0027X-Object-Meta-1\u0027: \u0027One\u0027,"},{"line_number":253,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"611618f2_71cba807","line":252,"updated":"2025-05-21 11:25:25.000000000","message":"nit: this header is not relevant for the test","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    def test_legacy_and_labeled_timing_stats_get_success(self):"},{"line_number":250,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":251,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp,"},{"line_number":252,"context_line":"                   \u0027X-Object-Meta-1\u0027: \u0027One\u0027,"},{"line_number":253,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"67e59b86_f7140fd5","line":252,"in_reply_to":"611618f2_71cba807","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    def test_legacy_and_labeled_timing_stats_get_success(self):"},{"line_number":250,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":251,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp,"},{"line_number":252,"context_line":"                   \u0027X-Object-Meta-1\u0027: \u0027One\u0027,"},{"line_number":253,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"30353b21_87dbc1e7","line":252,"in_reply_to":"611618f2_71cba807","updated":"2025-05-22 14:30:49.000000000","message":"Done","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":256,"context_line":"                            headers\u003dheaders)"},{"line_number":257,"context_line":"        req.body \u003d b\u0027VERIFY\u0027"},{"line_number":258,"context_line":"        etag \u003d \u0027\"%s\"\u0027 % md5(b\u0027VERIFY\u0027, usedforsecurity\u003dFalse).hexdigest()"},{"line_number":259,"context_line":"        now \u003d time()"},{"line_number":260,"context_line":"        statsd_client, statsd, resp \u003d self._do_test_timing_stats("}],"source_content_type":"text/x-python","patch_set":5,"id":"c0349429_1338c82c","line":257,"updated":"2025-05-21 11:25:25.000000000","message":"nit: ``body`` can be passed to ``Request.blank``\n\n```\nblank(cls, path, environ\u003dNone, headers\u003dNone, body\u003dNone, **kwargs)\n```","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":256,"context_line":"                            headers\u003dheaders)"},{"line_number":257,"context_line":"        req.body \u003d b\u0027VERIFY\u0027"},{"line_number":258,"context_line":"        etag \u003d \u0027\"%s\"\u0027 % md5(b\u0027VERIFY\u0027, usedforsecurity\u003dFalse).hexdigest()"},{"line_number":259,"context_line":"        now \u003d time()"},{"line_number":260,"context_line":"        statsd_client, statsd, resp \u003d self._do_test_timing_stats("}],"source_content_type":"text/x-python","patch_set":5,"id":"7e73e734_c961a505","line":257,"in_reply_to":"c0349429_1338c82c","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":256,"context_line":"                            headers\u003dheaders)"},{"line_number":257,"context_line":"        req.body \u003d b\u0027VERIFY\u0027"},{"line_number":258,"context_line":"        etag \u003d \u0027\"%s\"\u0027 % md5(b\u0027VERIFY\u0027, usedforsecurity\u003dFalse).hexdigest()"},{"line_number":259,"context_line":"        now \u003d time()"},{"line_number":260,"context_line":"        statsd_client, statsd, resp \u003d self._do_test_timing_stats("}],"source_content_type":"text/x-python","patch_set":5,"id":"54cf6eab_8abdafa9","line":257,"in_reply_to":"c0349429_1338c82c","updated":"2025-05-22 14:30:49.000000000","message":"Done","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":264,"context_line":"            \u0027Content-Type\u0027: \u0027text/html; charset\u003dUTF-8\u0027,"},{"line_number":265,"context_line":"            \u0027Content-Length\u0027: str(len(resp.body)),"},{"line_number":266,"context_line":"            \u0027Etag\u0027: etag,"},{"line_number":267,"context_line":"        })"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        statsd_client.clear()"},{"line_number":270,"context_line":"        statsd.clear()"}],"source_content_type":"text/x-python","patch_set":5,"id":"28826b6f_5af5fe1b","line":267,"updated":"2025-05-21 11:25:25.000000000","message":"nit: ok, but this assertion isn\u0027t really relevant for the scope of this test - this isn\u0027t even the response that we\u0027re asserting timing stats for. I fee like I just want to get to the GET request assertions ASAP 😊","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            \u0027Content-Type\u0027: \u0027text/html; charset\u003dUTF-8\u0027,"},{"line_number":265,"context_line":"            \u0027Content-Length\u0027: str(len(resp.body)),"},{"line_number":266,"context_line":"            \u0027Etag\u0027: etag,"},{"line_number":267,"context_line":"        })"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        statsd_client.clear()"},{"line_number":270,"context_line":"        statsd.clear()"}],"source_content_type":"text/x-python","patch_set":5,"id":"13c4d415_c78cbbaa","line":267,"in_reply_to":"28826b6f_5af5fe1b","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":264,"context_line":"            \u0027Content-Type\u0027: \u0027text/html; charset\u003dUTF-8\u0027,"},{"line_number":265,"context_line":"            \u0027Content-Length\u0027: str(len(resp.body)),"},{"line_number":266,"context_line":"            \u0027Etag\u0027: etag,"},{"line_number":267,"context_line":"        })"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        statsd_client.clear()"},{"line_number":270,"context_line":"        statsd.clear()"}],"source_content_type":"text/x-python","patch_set":5,"id":"b2ca7701_91243ecb","line":267,"in_reply_to":"28826b6f_5af5fe1b","updated":"2025-05-22 14:30:49.000000000","message":"Done","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":266,"context_line":"            \u0027Etag\u0027: etag,"},{"line_number":267,"context_line":"        })"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        statsd_client.clear()"},{"line_number":270,"context_line":"        statsd.clear()"},{"line_number":271,"context_line":"        req \u003d Request.blank("},{"line_number":272,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"}],"source_content_type":"text/x-python","patch_set":5,"id":"00c2daab_398b9184","line":269,"updated":"2025-05-21 11:25:25.000000000","message":"perhaps instead you could reset the self.logger statsd client in ``_do_test_timing_stats``\nwith a ``self.logger.clear()``","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":266,"context_line":"            \u0027Etag\u0027: etag,"},{"line_number":267,"context_line":"        })"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        statsd_client.clear()"},{"line_number":270,"context_line":"        statsd.clear()"},{"line_number":271,"context_line":"        req \u003d Request.blank("},{"line_number":272,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"}],"source_content_type":"text/x-python","patch_set":5,"id":"a3708b90_32a5f50e","line":269,"in_reply_to":"00c2daab_398b9184","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":266,"context_line":"            \u0027Etag\u0027: etag,"},{"line_number":267,"context_line":"        })"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        statsd_client.clear()"},{"line_number":270,"context_line":"        statsd.clear()"},{"line_number":271,"context_line":"        req \u003d Request.blank("},{"line_number":272,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"}],"source_content_type":"text/x-python","patch_set":5,"id":"11a1dc77_bcbcafb0","line":269,"in_reply_to":"00c2daab_398b9184","updated":"2025-05-22 14:30:49.000000000","message":"Done","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":267,"context_line":"        })"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        statsd_client.clear()"},{"line_number":270,"context_line":"        statsd.clear()"},{"line_number":271,"context_line":"        req \u003d Request.blank("},{"line_number":272,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"},{"line_number":273,"context_line":"        statsd_client, statsd, _ \u003d self._do_test_timing_stats("}],"source_content_type":"text/x-python","patch_set":5,"id":"658eb1d2_25f97e33","line":270,"updated":"2025-05-21 11:25:25.000000000","message":"this isn\u0027t needed - a new LabeledStatsdClient is created every time _do_test_timing_stats is called because a new app is created","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        })"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        statsd_client.clear()"},{"line_number":270,"context_line":"        statsd.clear()"},{"line_number":271,"context_line":"        req \u003d Request.blank("},{"line_number":272,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"},{"line_number":273,"context_line":"        statsd_client, statsd, _ \u003d self._do_test_timing_stats("}],"source_content_type":"text/x-python","patch_set":5,"id":"70711c66_ef802d90","line":270,"in_reply_to":"658eb1d2_25f97e33","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        })"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        statsd_client.clear()"},{"line_number":270,"context_line":"        statsd.clear()"},{"line_number":271,"context_line":"        req \u003d Request.blank("},{"line_number":272,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"},{"line_number":273,"context_line":"        statsd_client, statsd, _ \u003d self._do_test_timing_stats("}],"source_content_type":"text/x-python","patch_set":5,"id":"477d75aa_2fa38f99","line":270,"in_reply_to":"658eb1d2_25f97e33","updated":"2025-05-22 14:30:49.000000000","message":"Done","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":287,"context_line":"                    \u0027status\u0027: 200"},{"line_number":288,"context_line":"                },"},{"line_number":289,"context_line":"            })]"},{"line_number":290,"context_line":"        }, statsd.calls)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def test_legacy_and_labeled_timing_stats_put_post_success(self):"},{"line_number":293,"context_line":"        timestamp \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff32e23b_81780529","line":290,"updated":"2025-05-21 11:25:25.000000000","message":"ok, this is the meat of the test","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":287,"context_line":"                    \u0027status\u0027: 200"},{"line_number":288,"context_line":"                },"},{"line_number":289,"context_line":"            })]"},{"line_number":290,"context_line":"        }, statsd.calls)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def test_legacy_and_labeled_timing_stats_put_post_success(self):"},{"line_number":293,"context_line":"        timestamp \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":5,"id":"08faa279_02920390","line":290,"in_reply_to":"ff32e23b_81780529","updated":"2025-05-22 14:30:49.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":287,"context_line":"                    \u0027status\u0027: 200"},{"line_number":288,"context_line":"                },"},{"line_number":289,"context_line":"            })]"},{"line_number":290,"context_line":"        }, statsd.calls)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    def test_legacy_and_labeled_timing_stats_put_post_success(self):"},{"line_number":293,"context_line":"        timestamp \u003d normalize_timestamp(time())"}],"source_content_type":"text/x-python","patch_set":5,"id":"1f55df4d_553451a2","line":290,"in_reply_to":"ff32e23b_81780529","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":292,"context_line":"    def test_legacy_and_labeled_timing_stats_put_post_success(self):"},{"line_number":293,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":294,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp,"},{"line_number":295,"context_line":"                   \u0027X-Object-Meta-1\u0027: \u0027One\u0027,"},{"line_number":296,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"d876286e_e71b2dc8","line":295,"updated":"2025-05-21 11:25:25.000000000","message":"nit: again, I know I am nit-picking, but the extra, irrelevant, headers sometimes become a distraction","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":292,"context_line":"    def test_legacy_and_labeled_timing_stats_put_post_success(self):"},{"line_number":293,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":294,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp,"},{"line_number":295,"context_line":"                   \u0027X-Object-Meta-1\u0027: \u0027One\u0027,"},{"line_number":296,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa81f5cf_d860a85a","line":295,"in_reply_to":"d876286e_e71b2dc8","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":292,"context_line":"    def test_legacy_and_labeled_timing_stats_put_post_success(self):"},{"line_number":293,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":294,"context_line":"        headers \u003d {\u0027X-Timestamp\u0027: timestamp,"},{"line_number":295,"context_line":"                   \u0027X-Object-Meta-1\u0027: \u0027One\u0027,"},{"line_number":296,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"eb9c96c2_16ad4aeb","line":295,"in_reply_to":"d876286e_e71b2dc8","updated":"2025-05-22 14:30:49.000000000","message":"Done","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":322,"context_line":"                    \u0027status\u0027: 201"},{"line_number":323,"context_line":"                },"},{"line_number":324,"context_line":"            })]"},{"line_number":325,"context_line":"        }, statsd.calls)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        statsd_client.clear()"},{"line_number":328,"context_line":"        statsd.clear()"}],"source_content_type":"text/x-python","patch_set":5,"id":"036120a5_48000535","line":325,"updated":"2025-05-21 11:25:25.000000000","message":"ok, so this time we assert the PUT stats, which makes sense in a ``test...put_post...`` test","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                    \u0027status\u0027: 201"},{"line_number":323,"context_line":"                },"},{"line_number":324,"context_line":"            })]"},{"line_number":325,"context_line":"        }, statsd.calls)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        statsd_client.clear()"},{"line_number":328,"context_line":"        statsd.clear()"}],"source_content_type":"text/x-python","patch_set":5,"id":"60283fa4_5dcd7d27","line":325,"in_reply_to":"036120a5_48000535","updated":"2025-05-22 14:30:49.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                    \u0027status\u0027: 201"},{"line_number":323,"context_line":"                },"},{"line_number":324,"context_line":"            })]"},{"line_number":325,"context_line":"        }, statsd.calls)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        statsd_client.clear()"},{"line_number":328,"context_line":"        statsd.clear()"}],"source_content_type":"text/x-python","patch_set":5,"id":"728960a3_66a387fe","line":325,"in_reply_to":"036120a5_48000535","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":324,"context_line":"            })]"},{"line_number":325,"context_line":"        }, statsd.calls)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        statsd_client.clear()"},{"line_number":328,"context_line":"        statsd.clear()"},{"line_number":329,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":330,"context_line":"        headers[\u0027X-Timestamp\u0027] \u003d timestamp"},{"line_number":331,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"d92fe451_21b9e1bc","line":328,"range":{"start_line":327,"start_character":8,"end_line":328,"end_character":22},"updated":"2025-05-21 11:25:25.000000000","message":"as above - you could have ``_do_test_timing_stats`` take care of always clearing self.logger, and statsd doesn\u0027t need to be cleared because it\u0027s replaced each time","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            })]"},{"line_number":325,"context_line":"        }, statsd.calls)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        statsd_client.clear()"},{"line_number":328,"context_line":"        statsd.clear()"},{"line_number":329,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":330,"context_line":"        headers[\u0027X-Timestamp\u0027] \u003d timestamp"},{"line_number":331,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"d8984242_d309af9f","line":328,"range":{"start_line":327,"start_character":8,"end_line":328,"end_character":22},"in_reply_to":"d92fe451_21b9e1bc","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            })]"},{"line_number":325,"context_line":"        }, statsd.calls)"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        statsd_client.clear()"},{"line_number":328,"context_line":"        statsd.clear()"},{"line_number":329,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":330,"context_line":"        headers[\u0027X-Timestamp\u0027] \u003d timestamp"},{"line_number":331,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3defcf34_a7b3dbdf","line":328,"range":{"start_line":327,"start_character":8,"end_line":328,"end_character":22},"in_reply_to":"d92fe451_21b9e1bc","updated":"2025-05-22 14:30:49.000000000","message":"Done","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":435,"context_line":"                    \u0027status\u0027: 204"},{"line_number":436,"context_line":"                },"},{"line_number":437,"context_line":"            })]"},{"line_number":438,"context_line":"        }, statsd.calls)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    def test_legacy_and_labeled_timing_stats_replicate_success(self):"},{"line_number":441,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":5,"id":"7e394f69_50be33d6","line":438,"updated":"2025-05-21 11:25:25.000000000","message":"this set of test assertions is nice: make a request, assert legacy stats, assert labaled stats.\n\nI\u0027d just prefer it if they could be a little more succinct e.g. cut down the boiler-plate setup where a PUT request is needed first, so we get to the method being tested.","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":435,"context_line":"                    \u0027status\u0027: 204"},{"line_number":436,"context_line":"                },"},{"line_number":437,"context_line":"            })]"},{"line_number":438,"context_line":"        }, statsd.calls)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    def test_legacy_and_labeled_timing_stats_replicate_success(self):"},{"line_number":441,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":5,"id":"0c1ee253_e4303e09","line":438,"in_reply_to":"7e394f69_50be33d6","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":435,"context_line":"                    \u0027status\u0027: 204"},{"line_number":436,"context_line":"                },"},{"line_number":437,"context_line":"            })]"},{"line_number":438,"context_line":"        }, statsd.calls)"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    def test_legacy_and_labeled_timing_stats_replicate_success(self):"},{"line_number":441,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":5,"id":"b5079c7b_88dbddf9","line":438,"in_reply_to":"7e394f69_50be33d6","updated":"2025-05-22 14:30:49.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"659a3ea2efe09b8d181f10a143f780c153b6bb46","unresolved":true,"context_lines":[{"line_number":596,"context_line":"        req \u003d Request.blank("},{"line_number":597,"context_line":"            \u0027/sda1/p/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027REPLICATE\u0027})"},{"line_number":598,"context_line":"        self._do_test_legacy_and_labeled_timing_stats_mount_check("},{"line_number":599,"context_line":"            req, sample_rate\u003d0.1, additional_labels\u003d{\u0027skip_rehash\u0027: False, })"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"    def _do_test_legacy_and_labeled_timing_stats_bad_policy("},{"line_number":602,"context_line":"            self, req, sample_rate\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"8ffc80e3_f6e9fa56","line":599,"updated":"2025-05-21 11:25:25.000000000","message":"SSYNC case is missing, but interesting:\n\n```\n    def test_legacy_and_labeled_timing_stats_ssync_507(self):\n        req \u003d Request.blank(\n            \u0027/sda1/p/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027SSYNC\u0027})\n        self._do_test_legacy_and_labeled_timing_stats_mount_check(\n            req, sample_rate\u003d0.1, additional_labels\u003d{})\n```\n\nfails because SSYNC doesn\u0027t add the policy label (I guess the exception is raised before the policy is available)\n\nSo maybe SSYNC needs it\u0027s own bespoke test rather than calling _do_test_legacy_and_labeled_timing_stats_mount_check\n\nIt would be good to have this for completeness.","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"d79c71c51a770814373e776c4e2b439af84043ef","unresolved":false,"context_lines":[{"line_number":596,"context_line":"        req \u003d Request.blank("},{"line_number":597,"context_line":"            \u0027/sda1/p/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027REPLICATE\u0027})"},{"line_number":598,"context_line":"        self._do_test_legacy_and_labeled_timing_stats_mount_check("},{"line_number":599,"context_line":"            req, sample_rate\u003d0.1, additional_labels\u003d{\u0027skip_rehash\u0027: False, })"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"    def _do_test_legacy_and_labeled_timing_stats_bad_policy("},{"line_number":602,"context_line":"            self, req, sample_rate\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"c27baa4e_1ddeb2a6","line":599,"in_reply_to":"8ffc80e3_f6e9fa56","updated":"2025-05-22 14:15:40.000000000","message":"Acknowledged","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45f2667e0514fc57eb03e442ee703ae34ff64905","unresolved":false,"context_lines":[{"line_number":596,"context_line":"        req \u003d Request.blank("},{"line_number":597,"context_line":"            \u0027/sda1/p/\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027REPLICATE\u0027})"},{"line_number":598,"context_line":"        self._do_test_legacy_and_labeled_timing_stats_mount_check("},{"line_number":599,"context_line":"            req, sample_rate\u003d0.1, additional_labels\u003d{\u0027skip_rehash\u0027: False, })"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"    def _do_test_legacy_and_labeled_timing_stats_bad_policy("},{"line_number":602,"context_line":"            self, req, sample_rate\u003dNone):"}],"source_content_type":"text/x-python","patch_set":5,"id":"8ac6cff3_11777f23","line":599,"in_reply_to":"8ffc80e3_f6e9fa56","updated":"2025-05-22 14:30:49.000000000","message":"Done","commit_id":"5656da5a59e885c3a97e0f8655cfeb3095d94f1f"}]}
