)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"b2d2a237_5651cb82","updated":"2024-03-08 23:30:15.000000000","message":"i love it!\n\nmy only hitch getting setup for functional testing:\n\nmv /etc/swift/backend_ratelimit.conf /etc/swift/backend-ratelimit.conf\n\n;)\n\nBASELINE:\n\nswift-bench 2024-03-08 22:59:59,321 INFO 1000 PUTS **FINAL** [0 failures], 18.8/s\nswift-bench 2024-03-08 23:03:09,560 INFO 10000 GETS **FINAL** [0 failures], 52.6/s\nswift-bench 2024-03-08 23:03:54,424 INFO 1000 DEL **FINAL** [0 failures], 22.3/s\n\nvagrant@saio:~$ cat /etc/swift/backend-ratelimit.conf \n[backend_ratelimit]\nget_requests_per_device_per_second \u003d 10\n\nMar  8 23:07:56 saio object-server-6020: Loaded config file /etc/swift/backend-ratelimit.conf, config changed\n\n^ woot!\n\nDEFAULT PROXY:\n\nswift-bench 2024-03-08 23:10:00,035 INFO 1000 PUTS **FINAL** [0 failures], 19.4/s\nswift-bench 2024-03-08 23:12:03,254 INFO 10000 GETS **FINAL** [9788 failures], 81.2/s\nswift-bench 2024-03-08 23:12:47,632 INFO 1000 DEL **FINAL** [33 failures], 22.5/s\n\nso the error limiting is still doing it\u0027s thing...\n\nvagrant@saio:~$ grep error_suppression_interval /etc/swift/proxy-server/default.conf-template \nerror_suppression_interval \u003d 0.0\n\n^ in prod we have 100s of proxies and run with 3.0\n\n\"REASONABLE\" PROXY:\n\nswift-bench 2024-03-08 23:18:50,353 INFO 1000 PUTS **FINAL** [0 failures], 20.9/s\nswift-bench 2024-03-08 23:22:15,074 INFO 10000 GETS **FINAL** [2677 failures], 48.8/s\nswift-bench 2024-03-08 23:23:00,911 INFO 1000 DEL **FINAL** [0 failures], 21.8/s\n\n^ this is great!\n\nI know that an \"error\" may not be the penultimate way we want to represent a backend server getting over-loaded, but with careful application this could be an amazing tool for operators to minimize the \"blast radius\" of a \"hot spot\" in the storage servers.\n\nI think I only have nits with names and tests:\n\nhttps://review.opendev.org/c/openstack/swift/+/912322","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"544f69c8aba709b411e9c39107d54b6c3ad1459e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"25390e10_9767e0d4","updated":"2024-05-10 23:52:45.000000000","message":"I feel like we\u0027re going to want even finer granularity (in particular, for PUTs to container servers -- is it an object update? shard ranges? actual container PUT?) but this seems like a good next step.","commit_id":"3517ca453e0f1994cdbde69b2c4e1764c91586f2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ece86edf0b1db1bd0cfa924a777664b6c18ba0e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"0effcfe0_dc5d5100","updated":"2024-05-13 14:43:16.000000000","message":"this one is good to go too!","commit_id":"3517ca453e0f1994cdbde69b2c4e1764c91586f2"}],"swift/common/middleware/backend_ratelimit.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":90,"context_line":"                     DEFAULT_REQUESTS_PER_DEVICE_RATE_BUFFER))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        reqs_per_device_per_second \u003d {None: non_negative_float("},{"line_number":93,"context_line":"            conf.get(\u0027requests_per_device_per_second\u0027, 0.0))}"},{"line_number":94,"context_line":"        for method in RATE_LIMITED_METHODS:"},{"line_number":95,"context_line":"            val \u003d non_negative_float("},{"line_number":96,"context_line":"                conf.get(\u0027%s_requests_per_device_per_second\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7e4a9e_0e87df9f","line":93,"updated":"2024-03-08 23:30:15.000000000","message":"found it!  when modified this new dict replaces self.req_per_device_per_second","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ece86edf0b1db1bd0cfa924a777664b6c18ba0e","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                     DEFAULT_REQUESTS_PER_DEVICE_RATE_BUFFER))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        reqs_per_device_per_second \u003d {None: non_negative_float("},{"line_number":93,"context_line":"            conf.get(\u0027requests_per_device_per_second\u0027, 0.0))}"},{"line_number":94,"context_line":"        for method in RATE_LIMITED_METHODS:"},{"line_number":95,"context_line":"            val \u003d non_negative_float("},{"line_number":96,"context_line":"                conf.get(\u0027%s_requests_per_device_per_second\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3801ba94_cfafd350","line":93,"in_reply_to":"367065cc_64be74fb","updated":"2024-05-13 14:43:16.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7d10b986ea3778bdc3d731434f003286e174a5ac","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                     DEFAULT_REQUESTS_PER_DEVICE_RATE_BUFFER))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        reqs_per_device_per_second \u003d {None: non_negative_float("},{"line_number":93,"context_line":"            conf.get(\u0027requests_per_device_per_second\u0027, 0.0))}"},{"line_number":94,"context_line":"        for method in RATE_LIMITED_METHODS:"},{"line_number":95,"context_line":"            val \u003d non_negative_float("},{"line_number":96,"context_line":"                conf.get(\u0027%s_requests_per_device_per_second\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3ced90cf_9193d79a","line":93,"in_reply_to":"367065cc_64be74fb","updated":"2024-05-13 08:20:47.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":true,"context_lines":[{"line_number":90,"context_line":"                     DEFAULT_REQUESTS_PER_DEVICE_RATE_BUFFER))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        reqs_per_device_per_second \u003d {None: non_negative_float("},{"line_number":93,"context_line":"            conf.get(\u0027requests_per_device_per_second\u0027, 0.0))}"},{"line_number":94,"context_line":"        for method in RATE_LIMITED_METHODS:"},{"line_number":95,"context_line":"            val \u003d non_negative_float("},{"line_number":96,"context_line":"                conf.get(\u0027%s_requests_per_device_per_second\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"367065cc_64be74fb","line":93,"in_reply_to":"df7e4a9e_0e87df9f","updated":"2024-03-11 11:36:58.000000000","message":"added a comment","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":152,"context_line":"            rl \u003d self.rate_limiters[(device, method)]"},{"line_number":153,"context_line":"        except KeyError:"},{"line_number":154,"context_line":"            rl \u003d EventletRateLimiter("},{"line_number":155,"context_line":"                max_rate\u003dself.requests_per_device_per_second[method],"},{"line_number":156,"context_line":"                rate_buffer\u003dself.requests_per_device_rate_buffer,"},{"line_number":157,"context_line":"                running_time\u003dtime.time(),"},{"line_number":158,"context_line":"                burst_after_idle\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"e16405d7_afd3d05d","line":155,"updated":"2024-03-08 23:30:15.000000000","message":"i feel like is telling me the max_device_rate must get added to this dict under the key of None, but I\u0027m not seeing where...","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ece86edf0b1db1bd0cfa924a777664b6c18ba0e","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            rl \u003d self.rate_limiters[(device, method)]"},{"line_number":153,"context_line":"        except KeyError:"},{"line_number":154,"context_line":"            rl \u003d EventletRateLimiter("},{"line_number":155,"context_line":"                max_rate\u003dself.requests_per_device_per_second[method],"},{"line_number":156,"context_line":"                rate_buffer\u003dself.requests_per_device_rate_buffer,"},{"line_number":157,"context_line":"                running_time\u003dtime.time(),"},{"line_number":158,"context_line":"                burst_after_idle\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"0d4c8ec4_369b102e","line":155,"in_reply_to":"1fd40ea8_cc46cfce","updated":"2024-05-13 14:43:16.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7d10b986ea3778bdc3d731434f003286e174a5ac","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            rl \u003d self.rate_limiters[(device, method)]"},{"line_number":153,"context_line":"        except KeyError:"},{"line_number":154,"context_line":"            rl \u003d EventletRateLimiter("},{"line_number":155,"context_line":"                max_rate\u003dself.requests_per_device_per_second[method],"},{"line_number":156,"context_line":"                rate_buffer\u003dself.requests_per_device_rate_buffer,"},{"line_number":157,"context_line":"                running_time\u003dtime.time(),"},{"line_number":158,"context_line":"                burst_after_idle\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5f7aed8e_7d382f1b","line":155,"in_reply_to":"1fd40ea8_cc46cfce","updated":"2024-05-13 08:20:47.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":true,"context_lines":[{"line_number":152,"context_line":"            rl \u003d self.rate_limiters[(device, method)]"},{"line_number":153,"context_line":"        except KeyError:"},{"line_number":154,"context_line":"            rl \u003d EventletRateLimiter("},{"line_number":155,"context_line":"                max_rate\u003dself.requests_per_device_per_second[method],"},{"line_number":156,"context_line":"                rate_buffer\u003dself.requests_per_device_rate_buffer,"},{"line_number":157,"context_line":"                running_time\u003dtime.time(),"},{"line_number":158,"context_line":"                burst_after_idle\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1fd40ea8_cc46cfce","line":155,"in_reply_to":"e16405d7_afd3d05d","updated":"2024-03-11 11:36:58.000000000","message":"added docstring","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":159,"context_line":"            self.rate_limiters[(device, method)] \u003d rl"},{"line_number":160,"context_line":"        return rl"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _is_allowed(self, device, method):"},{"line_number":163,"context_line":"        return (self._get_ratelimiter(device, None).is_allowed()"},{"line_number":164,"context_line":"                and self._get_ratelimiter(device, method).is_allowed())"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"92a49c59_6dd0adba","line":162,"updated":"2024-03-08 23:30:15.000000000","message":"this is nice little helper - despite being private and having only one caller and two lines - it might still worthy of a doc string.\n\n```\nEvaluate backend-ratelimiting policies for the incoming request.\n\nCurrently a request is disallowed when either the per-(device, method)\nratelimit or the max per-device limit has been reached.\n\n:returns: boolean, is_allowed\n```","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            self.rate_limiters[(device, method)] \u003d rl"},{"line_number":160,"context_line":"        return rl"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _is_allowed(self, device, method):"},{"line_number":163,"context_line":"        return (self._get_ratelimiter(device, None).is_allowed()"},{"line_number":164,"context_line":"                and self._get_ratelimiter(device, method).is_allowed())"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"4db3aed7_ecdea56a","line":162,"in_reply_to":"92a49c59_6dd0adba","updated":"2024-03-11 11:36:58.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _is_allowed(self, device, method):"},{"line_number":163,"context_line":"        return (self._get_ratelimiter(device, None).is_allowed()"},{"line_number":164,"context_line":"                and self._get_ratelimiter(device, method).is_allowed())"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def __call__(self, env, start_response):"},{"line_number":167,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"e3a1676f_d13bb1b0","line":164,"updated":"2024-03-08 23:30:15.000000000","message":"short of the method\u003dNone policy being 0, you can run out of global device requests before you run out of per-method requests right?","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ece86edf0b1db1bd0cfa924a777664b6c18ba0e","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _is_allowed(self, device, method):"},{"line_number":163,"context_line":"        return (self._get_ratelimiter(device, None).is_allowed()"},{"line_number":164,"context_line":"                and self._get_ratelimiter(device, method).is_allowed())"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def __call__(self, env, start_response):"},{"line_number":167,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"21471590_a2812bb1","line":164,"in_reply_to":"dd3d9c55_4a3575c7","updated":"2024-05-13 14:43:16.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7d10b986ea3778bdc3d731434f003286e174a5ac","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _is_allowed(self, device, method):"},{"line_number":163,"context_line":"        return (self._get_ratelimiter(device, None).is_allowed()"},{"line_number":164,"context_line":"                and self._get_ratelimiter(device, method).is_allowed())"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def __call__(self, env, start_response):"},{"line_number":167,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"ab873800_eb07686b","line":164,"in_reply_to":"dd3d9c55_4a3575c7","updated":"2024-05-13 08:20:47.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":true,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _is_allowed(self, device, method):"},{"line_number":163,"context_line":"        return (self._get_ratelimiter(device, None).is_allowed()"},{"line_number":164,"context_line":"                and self._get_ratelimiter(device, method).is_allowed())"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def __call__(self, env, start_response):"},{"line_number":167,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"dd3d9c55_4a3575c7","line":164,"in_reply_to":"e3a1676f_d13bb1b0","updated":"2024-03-11 11:36:58.000000000","message":"correct, added not to docstring","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":173,"context_line":"        self._maybe_reload_config()"},{"line_number":174,"context_line":"        req \u003d Request(env)"},{"line_number":175,"context_line":"        handler \u003d self.app"},{"line_number":176,"context_line":"        if (self.max_requests_per_device_per_second"},{"line_number":177,"context_line":"                and req.method in RATE_LIMITED_METHODS):"},{"line_number":178,"context_line":"            try:"},{"line_number":179,"context_line":"                device, partition, _ \u003d split_and_validate_path(req, 1, 3, True)"}],"source_content_type":"text/x-python","patch_set":6,"id":"d7e21491_f4866546","line":176,"updated":"2024-03-08 23:30:15.000000000","message":"maybe just better as \"ratelimit_enabled\" - max has my brain going somewhere else.","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7d10b986ea3778bdc3d731434f003286e174a5ac","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        self._maybe_reload_config()"},{"line_number":174,"context_line":"        req \u003d Request(env)"},{"line_number":175,"context_line":"        handler \u003d self.app"},{"line_number":176,"context_line":"        if (self.max_requests_per_device_per_second"},{"line_number":177,"context_line":"                and req.method in RATE_LIMITED_METHODS):"},{"line_number":178,"context_line":"            try:"},{"line_number":179,"context_line":"                device, partition, _ \u003d split_and_validate_path(req, 1, 3, True)"}],"source_content_type":"text/x-python","patch_set":6,"id":"701b699f_e2d7dd2e","line":176,"in_reply_to":"4891eb84_c69c95f5","updated":"2024-05-13 08:20:47.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ece86edf0b1db1bd0cfa924a777664b6c18ba0e","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        self._maybe_reload_config()"},{"line_number":174,"context_line":"        req \u003d Request(env)"},{"line_number":175,"context_line":"        handler \u003d self.app"},{"line_number":176,"context_line":"        if (self.max_requests_per_device_per_second"},{"line_number":177,"context_line":"                and req.method in RATE_LIMITED_METHODS):"},{"line_number":178,"context_line":"            try:"},{"line_number":179,"context_line":"                device, partition, _ \u003d split_and_validate_path(req, 1, 3, True)"}],"source_content_type":"text/x-python","patch_set":6,"id":"db797c2a_5ff4bbce","line":176,"in_reply_to":"4891eb84_c69c95f5","updated":"2024-05-13 14:43:16.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":true,"context_lines":[{"line_number":173,"context_line":"        self._maybe_reload_config()"},{"line_number":174,"context_line":"        req \u003d Request(env)"},{"line_number":175,"context_line":"        handler \u003d self.app"},{"line_number":176,"context_line":"        if (self.max_requests_per_device_per_second"},{"line_number":177,"context_line":"                and req.method in RATE_LIMITED_METHODS):"},{"line_number":178,"context_line":"            try:"},{"line_number":179,"context_line":"                device, partition, _ \u003d split_and_validate_path(req, 1, 3, True)"}],"source_content_type":"text/x-python","patch_set":6,"id":"4891eb84_c69c95f5","line":176,"in_reply_to":"d7e21491_f4866546","updated":"2024-03-11 11:36:58.000000000","message":"agree, also confused me when I returned to this patch after a break\n\nchanged to ``self.is_any_rate_limit_configured``","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"}],"test/unit/common/middleware/test_backend_ratelimit.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":46,"context_line":"        super(TestBackendRatelimitMiddleware, self).setUp()"},{"line_number":47,"context_line":"        self.swift \u003d FakeSwift()"},{"line_number":48,"context_line":"        self.tempdir \u003d mkdtemp()"},{"line_number":49,"context_line":"        self.default_req_per_dev_per_sec \u003d dict("},{"line_number":50,"context_line":"            (key, 0.0) for key in"},{"line_number":51,"context_line":"            (None, \u0027GET\u0027, \u0027HEAD\u0027, \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027, \u0027UPDATE\u0027,"},{"line_number":52,"context_line":"             \u0027REPLICATE\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f36d4de_f41c17a0","line":49,"updated":"2024-03-08 23:30:15.000000000","message":"right, right, right \"req_per_dev\" ... per_sec\n\nwhere req ~\u003d method","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        super(TestBackendRatelimitMiddleware, self).setUp()"},{"line_number":47,"context_line":"        self.swift \u003d FakeSwift()"},{"line_number":48,"context_line":"        self.tempdir \u003d mkdtemp()"},{"line_number":49,"context_line":"        self.default_req_per_dev_per_sec \u003d dict("},{"line_number":50,"context_line":"            (key, 0.0) for key in"},{"line_number":51,"context_line":"            (None, \u0027GET\u0027, \u0027HEAD\u0027, \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027, \u0027UPDATE\u0027,"},{"line_number":52,"context_line":"             \u0027REPLICATE\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"0afea193_3299899e","line":49,"in_reply_to":"7f36d4de_f41c17a0","updated":"2024-03-11 11:36:58.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":60,"context_line":"        factory \u003d backend_ratelimit.filter_factory(conf)"},{"line_number":61,"context_line":"        rl \u003d factory(self.swift)"},{"line_number":62,"context_line":"        self.assertEqual(self.default_req_per_dev_per_sec,"},{"line_number":63,"context_line":"                         rl.requests_per_device_per_second)"},{"line_number":64,"context_line":"        self.assertEqual(1.0, rl.requests_per_device_rate_buffer)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        conf \u003d {\u0027requests_per_device_per_second\u0027: 1.3,"}],"source_content_type":"text/x-python","patch_set":6,"id":"a290f092_2dff1939","line":63,"updated":"2024-03-08 23:30:15.000000000","message":"FWIW this totally convinced me I wasn\u0027t looking hard enough for where you add in the None - thank you!","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        factory \u003d backend_ratelimit.filter_factory(conf)"},{"line_number":61,"context_line":"        rl \u003d factory(self.swift)"},{"line_number":62,"context_line":"        self.assertEqual(self.default_req_per_dev_per_sec,"},{"line_number":63,"context_line":"                         rl.requests_per_device_per_second)"},{"line_number":64,"context_line":"        self.assertEqual(1.0, rl.requests_per_device_rate_buffer)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        conf \u003d {\u0027requests_per_device_per_second\u0027: 1.3,"}],"source_content_type":"text/x-python","patch_set":6,"id":"a28a432d_fee88514","line":63,"in_reply_to":"a290f092_2dff1939","updated":"2024-03-11 11:36:58.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                    \u0027swift.common.middleware.backend_ratelimit.get_logger\u0027,"},{"line_number":139,"context_line":"                    return_value\u003ddebug_logger()):"},{"line_number":140,"context_line":"                rl \u003d factory(self.swift)"},{"line_number":141,"context_line":"            exp_req_per_dev_per_sec \u003d dict(self.default_req_per_dev_per_sec)"},{"line_number":142,"context_line":"            exp_req_per_dev_per_sec.update({None: 1.3})"},{"line_number":143,"context_line":"            self.assertEqual(exp_req_per_dev_per_sec,"},{"line_number":144,"context_line":"                             rl.requests_per_device_per_second)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1e73d4ce_5b789541","line":141,"updated":"2024-03-08 23:30:15.000000000","message":"ok, the expectation is the per method dict is always fully populated.","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    \u0027swift.common.middleware.backend_ratelimit.get_logger\u0027,"},{"line_number":139,"context_line":"                    return_value\u003ddebug_logger()):"},{"line_number":140,"context_line":"                rl \u003d factory(self.swift)"},{"line_number":141,"context_line":"            exp_req_per_dev_per_sec \u003d dict(self.default_req_per_dev_per_sec)"},{"line_number":142,"context_line":"            exp_req_per_dev_per_sec.update({None: 1.3})"},{"line_number":143,"context_line":"            self.assertEqual(exp_req_per_dev_per_sec,"},{"line_number":144,"context_line":"                             rl.requests_per_device_per_second)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9eaeb79e_6c5ffdc5","line":141,"in_reply_to":"1e73d4ce_5b789541","updated":"2024-03-11 11:36:58.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":289,"context_line":"        self.assertEqual(conf_path, rl.conf_path)"},{"line_number":290,"context_line":"        self.assertEqual(15, rl.config_reload_interval)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        with open(actual_path, \u0027w\u0027) as fd:"},{"line_number":293,"context_line":"            fd.write("},{"line_number":294,"context_line":"                \u0027[backend_ratelimit]\\n\u0027"},{"line_number":295,"context_line":"                \u0027requests_per_device_per_second \u003d 5.3\\n\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"049d8ea0_51ce9169","line":292,"updated":"2024-03-08 23:30:15.000000000","message":"maybe this should write to... conf_path?  I\u0027m actually a little confused what this is doing now.","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":true,"context_lines":[{"line_number":289,"context_line":"        self.assertEqual(conf_path, rl.conf_path)"},{"line_number":290,"context_line":"        self.assertEqual(15, rl.config_reload_interval)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        with open(actual_path, \u0027w\u0027) as fd:"},{"line_number":293,"context_line":"            fd.write("},{"line_number":294,"context_line":"                \u0027[backend_ratelimit]\\n\u0027"},{"line_number":295,"context_line":"                \u0027requests_per_device_per_second \u003d 5.3\\n\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"352d802f_899e400b","line":292,"in_reply_to":"049d8ea0_51ce9169","updated":"2024-03-11 11:36:58.000000000","message":"actual_path is path to where the file actually exists\n\nconf_path is the path in the config file\n\nI\u0027ve clarified the naming (I hope!)","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ece86edf0b1db1bd0cfa924a777664b6c18ba0e","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        self.assertEqual(conf_path, rl.conf_path)"},{"line_number":290,"context_line":"        self.assertEqual(15, rl.config_reload_interval)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        with open(actual_path, \u0027w\u0027) as fd:"},{"line_number":293,"context_line":"            fd.write("},{"line_number":294,"context_line":"                \u0027[backend_ratelimit]\\n\u0027"},{"line_number":295,"context_line":"                \u0027requests_per_device_per_second \u003d 5.3\\n\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"cbdd96ce_1df0aa71","line":292,"in_reply_to":"352d802f_899e400b","updated":"2024-05-13 14:43:16.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7d10b986ea3778bdc3d731434f003286e174a5ac","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        self.assertEqual(conf_path, rl.conf_path)"},{"line_number":290,"context_line":"        self.assertEqual(15, rl.config_reload_interval)"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        with open(actual_path, \u0027w\u0027) as fd:"},{"line_number":293,"context_line":"            fd.write("},{"line_number":294,"context_line":"                \u0027[backend_ratelimit]\\n\u0027"},{"line_number":295,"context_line":"                \u0027requests_per_device_per_second \u003d 5.3\\n\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"faf69055_555ecc66","line":292,"in_reply_to":"352d802f_899e400b","updated":"2024-05-13 08:20:47.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":321,"context_line":"        self.assertEqual(exp_req_per_dev_per_sec,"},{"line_number":322,"context_line":"                         rl.requests_per_device_per_second)"},{"line_number":323,"context_line":"        self.assertEqual(0.5, rl.requests_per_device_rate_buffer)"},{"line_number":324,"context_line":"        self.assertEqual(7, rl.max_requests_per_device_per_second)"},{"line_number":325,"context_line":"        # options related to conf file loading are not loaded from conf file..."},{"line_number":326,"context_line":"        self.assertEqual(conf_path, rl.conf_path)"},{"line_number":327,"context_line":"        self.assertEqual(15, rl.config_reload_interval)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfdeeb26_a1a5c16e","line":324,"updated":"2024-03-08 23:30:15.000000000","message":"I wonder why I\u0027m expecting this to be 5.3\n\noh, i\u0027ve keep wanting to think of \"requests_per_device_per_second\" as a MAX because I think `_get_ratelimit(device, None).is_allowed()` has to be true even if you set updates_per_second to 10K\n\nit seems like this might mostly just be internal state to decide if ratelimiting is enabled at all?","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        self.assertEqual(exp_req_per_dev_per_sec,"},{"line_number":322,"context_line":"                         rl.requests_per_device_per_second)"},{"line_number":323,"context_line":"        self.assertEqual(0.5, rl.requests_per_device_rate_buffer)"},{"line_number":324,"context_line":"        self.assertEqual(7, rl.max_requests_per_device_per_second)"},{"line_number":325,"context_line":"        # options related to conf file loading are not loaded from conf file..."},{"line_number":326,"context_line":"        self.assertEqual(conf_path, rl.conf_path)"},{"line_number":327,"context_line":"        self.assertEqual(15, rl.config_reload_interval)"}],"source_content_type":"text/x-python","patch_set":6,"id":"513202fd_27370106","line":324,"in_reply_to":"dfdeeb26_a1a5c16e","updated":"2024-03-11 11:36:58.000000000","message":"yep, my bad, confusing var name, fixed","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":329,"context_line":"    def test_init_config_file_overrides_filter_conf(self):"},{"line_number":330,"context_line":"        # default conf path"},{"line_number":331,"context_line":"        actual_path \u003d os.path.join(self.tempdir, \u0027backend-ratelimit.conf\u0027)"},{"line_number":332,"context_line":"        self._do_test_init_config_file_overrides_filter_conf(actual_path, None)"},{"line_number":333,"context_line":"        # explicitly configure conf path"},{"line_number":334,"context_line":"        actual_path \u003d os.path.join(self.tempdir, \u0027backend_rl.conf\u0027)"},{"line_number":335,"context_line":"        self._do_test_init_config_file_overrides_filter_conf(actual_path,"}],"source_content_type":"text/x-python","patch_set":6,"id":"af26c5f9_22355e6e","line":332,"updated":"2024-03-08 23:30:15.000000000","message":"ok, so there\u0027s an implicit coupling with the test that when conf_path is None it\u0027s expected you pass in the default value as the actual_path\n\nmaybe just `_do_test(override_config_file_name\u003dNone)`","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":333,"context_line":"        # explicitly configure conf path"},{"line_number":334,"context_line":"        actual_path \u003d os.path.join(self.tempdir, \u0027backend_rl.conf\u0027)"},{"line_number":335,"context_line":"        self._do_test_init_config_file_overrides_filter_conf(actual_path,"},{"line_number":336,"context_line":"                                                             actual_path)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _do_test_config_file_reload(self, filter_conf, exp_reload_time):"},{"line_number":339,"context_line":"        # verify that conf file options are periodically reloaded"}],"source_content_type":"text/x-python","patch_set":6,"id":"696aaa65_a8033e74","line":336,"updated":"2024-03-08 23:30:15.000000000","message":"having to pass in the override path twice seems weird\n\nthe only valid arguments for this function are:\n\n```\n(\u0027default-path\u0027, None)\n(x, x)\n```\n\nI\u0027m not sure why it strikes me as confusing.","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":true,"context_lines":[{"line_number":333,"context_line":"        # explicitly configure conf path"},{"line_number":334,"context_line":"        actual_path \u003d os.path.join(self.tempdir, \u0027backend_rl.conf\u0027)"},{"line_number":335,"context_line":"        self._do_test_init_config_file_overrides_filter_conf(actual_path,"},{"line_number":336,"context_line":"                                                             actual_path)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _do_test_config_file_reload(self, filter_conf, exp_reload_time):"},{"line_number":339,"context_line":"        # verify that conf file options are periodically reloaded"}],"source_content_type":"text/x-python","patch_set":6,"id":"7dc04dd5_30577269","line":336,"in_reply_to":"696aaa65_a8033e74","updated":"2024-03-11 11:36:58.000000000","message":"hmmm, not sure how to refactor to make it clearer\n\nthe args are conveying (\"write the file here\", \"tell the config it is here\")\n\nI\u0027ll try to make the arg names better","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ece86edf0b1db1bd0cfa924a777664b6c18ba0e","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        # explicitly configure conf path"},{"line_number":334,"context_line":"        actual_path \u003d os.path.join(self.tempdir, \u0027backend_rl.conf\u0027)"},{"line_number":335,"context_line":"        self._do_test_init_config_file_overrides_filter_conf(actual_path,"},{"line_number":336,"context_line":"                                                             actual_path)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _do_test_config_file_reload(self, filter_conf, exp_reload_time):"},{"line_number":339,"context_line":"        # verify that conf file options are periodically reloaded"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f3a35d4_db01d2a6","line":336,"in_reply_to":"7dc04dd5_30577269","updated":"2024-05-13 14:43:16.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7d10b986ea3778bdc3d731434f003286e174a5ac","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        # explicitly configure conf path"},{"line_number":334,"context_line":"        actual_path \u003d os.path.join(self.tempdir, \u0027backend_rl.conf\u0027)"},{"line_number":335,"context_line":"        self._do_test_init_config_file_overrides_filter_conf(actual_path,"},{"line_number":336,"context_line":"                                                             actual_path)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"    def _do_test_config_file_reload(self, filter_conf, exp_reload_time):"},{"line_number":339,"context_line":"        # verify that conf file options are periodically reloaded"}],"source_content_type":"text/x-python","patch_set":6,"id":"8ece71dc_e18f5a24","line":336,"in_reply_to":"7dc04dd5_30577269","updated":"2024-05-13 08:20:47.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":343,"context_line":"        with open(conf_path, \u0027w\u0027) as fd:"},{"line_number":344,"context_line":"            fd.write(\u0027[backend_ratelimit]\\n\u0027"},{"line_number":345,"context_line":"                     \u0027requests_per_device_per_second \u003d 12.3\\n\u0027"},{"line_number":346,"context_line":"                     \u0027backend_ratelimit_conf_path \u003d /etc/swift/rl.conf\\n\u0027"},{"line_number":347,"context_line":"                     \u0027config_reload_interval \u003d 999999\\n\u0027)"},{"line_number":348,"context_line":"        factory \u003d backend_ratelimit.filter_factory(filter_conf)"},{"line_number":349,"context_line":"        with mock.patch(\u0027swift.common.middleware.backend_ratelimit.time.time\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"92e8df52_d7c231a8","line":346,"updated":"2024-03-08 23:30:15.000000000","message":"this *is* the backend_rateliit_conf tho right?  I think sometimes we set the value to \"ignored\" to make it more clear it\u0027s just in the test try and confuse our code.  (I assume we\u0027re not *actively* trying to confuse future us!)","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        with open(conf_path, \u0027w\u0027) as fd:"},{"line_number":344,"context_line":"            fd.write(\u0027[backend_ratelimit]\\n\u0027"},{"line_number":345,"context_line":"                     \u0027requests_per_device_per_second \u003d 12.3\\n\u0027"},{"line_number":346,"context_line":"                     \u0027backend_ratelimit_conf_path \u003d /etc/swift/rl.conf\\n\u0027"},{"line_number":347,"context_line":"                     \u0027config_reload_interval \u003d 999999\\n\u0027)"},{"line_number":348,"context_line":"        factory \u003d backend_ratelimit.filter_factory(filter_conf)"},{"line_number":349,"context_line":"        with mock.patch(\u0027swift.common.middleware.backend_ratelimit.time.time\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"e4fd9b5b_6d76a7fe","line":346,"in_reply_to":"92e8df52_d7c231a8","updated":"2024-03-11 11:36:58.000000000","message":"ah, yes, that was a little too subtle...these values *are* ignored because the dynamically loadable conf file cannot reconfigure the dynamically loadable conf file!","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":345,"context_line":"                     \u0027requests_per_device_per_second \u003d 12.3\\n\u0027"},{"line_number":346,"context_line":"                     \u0027backend_ratelimit_conf_path \u003d /etc/swift/rl.conf\\n\u0027"},{"line_number":347,"context_line":"                     \u0027config_reload_interval \u003d 999999\\n\u0027)"},{"line_number":348,"context_line":"        factory \u003d backend_ratelimit.filter_factory(filter_conf)"},{"line_number":349,"context_line":"        with mock.patch(\u0027swift.common.middleware.backend_ratelimit.time.time\u0027,"},{"line_number":350,"context_line":"                        return_value\u003dnow):"},{"line_number":351,"context_line":"            rl \u003d factory(self.swift)"}],"source_content_type":"text/x-python","patch_set":6,"id":"f4d6e6be_ab4d3e27","line":348,"updated":"2024-03-08 23:30:15.000000000","message":"this passed in filter_conf sets swift_dir to self.tempdir - the glue that makes the file we wrote just above get loaded into this instance below.","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":345,"context_line":"                     \u0027requests_per_device_per_second \u003d 12.3\\n\u0027"},{"line_number":346,"context_line":"                     \u0027backend_ratelimit_conf_path \u003d /etc/swift/rl.conf\\n\u0027"},{"line_number":347,"context_line":"                     \u0027config_reload_interval \u003d 999999\\n\u0027)"},{"line_number":348,"context_line":"        factory \u003d backend_ratelimit.filter_factory(filter_conf)"},{"line_number":349,"context_line":"        with mock.patch(\u0027swift.common.middleware.backend_ratelimit.time.time\u0027,"},{"line_number":350,"context_line":"                        return_value\u003dnow):"},{"line_number":351,"context_line":"            rl \u003d factory(self.swift)"}],"source_content_type":"text/x-python","patch_set":6,"id":"46691973_a10e352a","line":348,"in_reply_to":"f4d6e6be_ab4d3e27","updated":"2024-03-11 11:36:58.000000000","message":"squashed in your improvement, thanks","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":350,"context_line":"                        return_value\u003dnow):"},{"line_number":351,"context_line":"            rl \u003d factory(self.swift)"},{"line_number":352,"context_line":"        exp_req_per_dev_per_sec \u003d dict(self.default_req_per_dev_per_sec)"},{"line_number":353,"context_line":"        exp_req_per_dev_per_sec.update({None: 12.3, \u0027HEAD\u0027: 6.2})"},{"line_number":354,"context_line":"        self.assertEqual(exp_req_per_dev_per_sec,"},{"line_number":355,"context_line":"                         rl.requests_per_device_per_second)"},{"line_number":356,"context_line":"        self.assertEqual(2.4, rl.requests_per_device_rate_buffer)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ebe8af6f_582e69e4","line":353,"updated":"2024-03-08 23:30:15.000000000","message":"oh, ok - this expectation is coupled with the passed in filter_conf","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":350,"context_line":"                        return_value\u003dnow):"},{"line_number":351,"context_line":"            rl \u003d factory(self.swift)"},{"line_number":352,"context_line":"        exp_req_per_dev_per_sec \u003d dict(self.default_req_per_dev_per_sec)"},{"line_number":353,"context_line":"        exp_req_per_dev_per_sec.update({None: 12.3, \u0027HEAD\u0027: 6.2})"},{"line_number":354,"context_line":"        self.assertEqual(exp_req_per_dev_per_sec,"},{"line_number":355,"context_line":"                         rl.requests_per_device_per_second)"},{"line_number":356,"context_line":"        self.assertEqual(2.4, rl.requests_per_device_rate_buffer)"}],"source_content_type":"text/x-python","patch_set":6,"id":"e25a65e9_db89df1d","line":353,"in_reply_to":"ebe8af6f_582e69e4","updated":"2024-03-11 11:36:58.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":390,"context_line":"                          (\u0027sda1\u0027, None): 12.3,"},{"line_number":391,"context_line":"                          (\u0027sda2\u0027, None): 12.3},"},{"line_number":392,"context_line":"                         dict((key, val.max_rate)"},{"line_number":393,"context_line":"                              for key, val in rl.rate_limiters.items()))"},{"line_number":394,"context_line":"        for (dev, method), limiter in rl.rate_limiters.items():"},{"line_number":395,"context_line":"            self.assertEqual(2.4 * limiter.clock_accuracy,"},{"line_number":396,"context_line":"                             limiter.rate_buffer_ms, (dev, method))"}],"source_content_type":"text/x-python","patch_set":6,"id":"d8d8e5f1_6821b971","line":393,"updated":"2024-03-08 23:30:15.000000000","message":"nice, so here we get to see the ratelimiters being dynamic","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7d10b986ea3778bdc3d731434f003286e174a5ac","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                          (\u0027sda1\u0027, None): 12.3,"},{"line_number":391,"context_line":"                          (\u0027sda2\u0027, None): 12.3},"},{"line_number":392,"context_line":"                         dict((key, val.max_rate)"},{"line_number":393,"context_line":"                              for key, val in rl.rate_limiters.items()))"},{"line_number":394,"context_line":"        for (dev, method), limiter in rl.rate_limiters.items():"},{"line_number":395,"context_line":"            self.assertEqual(2.4 * limiter.clock_accuracy,"},{"line_number":396,"context_line":"                             limiter.rate_buffer_ms, (dev, method))"}],"source_content_type":"text/x-python","patch_set":6,"id":"26b32190_81887e5f","line":393,"in_reply_to":"d8d8e5f1_6821b971","updated":"2024-05-13 08:20:47.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ece86edf0b1db1bd0cfa924a777664b6c18ba0e","unresolved":false,"context_lines":[{"line_number":390,"context_line":"                          (\u0027sda1\u0027, None): 12.3,"},{"line_number":391,"context_line":"                          (\u0027sda2\u0027, None): 12.3},"},{"line_number":392,"context_line":"                         dict((key, val.max_rate)"},{"line_number":393,"context_line":"                              for key, val in rl.rate_limiters.items()))"},{"line_number":394,"context_line":"        for (dev, method), limiter in rl.rate_limiters.items():"},{"line_number":395,"context_line":"            self.assertEqual(2.4 * limiter.clock_accuracy,"},{"line_number":396,"context_line":"                             limiter.rate_buffer_ms, (dev, method))"}],"source_content_type":"text/x-python","patch_set":6,"id":"b8330ca6_100dd00f","line":393,"in_reply_to":"d8d8e5f1_6821b971","updated":"2024-05-13 14:43:16.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":393,"context_line":"                              for key, val in rl.rate_limiters.items()))"},{"line_number":394,"context_line":"        for (dev, method), limiter in rl.rate_limiters.items():"},{"line_number":395,"context_line":"            self.assertEqual(2.4 * limiter.clock_accuracy,"},{"line_number":396,"context_line":"                             limiter.rate_buffer_ms, (dev, method))"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        # send some requests, time for config file to be reloaded"},{"line_number":399,"context_line":"        with mock.patch(\u0027swift.common.middleware.backend_ratelimit.time.time\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9e16ce6f_cd02b6c4","line":396,"updated":"2024-03-08 23:30:15.000000000","message":"when do we get subtest!?\n\nhttps://docs.python.org/3/library/unittest.html#distinguishing-test-iterations-using-subtests\n\nthis actually looks really good:\n\n```\nswift/test/unit/common/middleware/test_backend_ratelimit.py:395: in _do_test_config_file_reload\n    self.assertEqual(1.4 * limiter.clock_accuracy,\nE   AssertionError: 1400.0 !\u003d 2400.0 : (\u0027sda1\u0027, None)\n```","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7d10b986ea3778bdc3d731434f003286e174a5ac","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                              for key, val in rl.rate_limiters.items()))"},{"line_number":394,"context_line":"        for (dev, method), limiter in rl.rate_limiters.items():"},{"line_number":395,"context_line":"            self.assertEqual(2.4 * limiter.clock_accuracy,"},{"line_number":396,"context_line":"                             limiter.rate_buffer_ms, (dev, method))"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        # send some requests, time for config file to be reloaded"},{"line_number":399,"context_line":"        with mock.patch(\u0027swift.common.middleware.backend_ratelimit.time.time\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"13675990_230bb6df","line":396,"in_reply_to":"9e16ce6f_cd02b6c4","updated":"2024-05-13 08:20:47.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ece86edf0b1db1bd0cfa924a777664b6c18ba0e","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                              for key, val in rl.rate_limiters.items()))"},{"line_number":394,"context_line":"        for (dev, method), limiter in rl.rate_limiters.items():"},{"line_number":395,"context_line":"            self.assertEqual(2.4 * limiter.clock_accuracy,"},{"line_number":396,"context_line":"                             limiter.rate_buffer_ms, (dev, method))"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"        # send some requests, time for config file to be reloaded"},{"line_number":399,"context_line":"        with mock.patch(\u0027swift.common.middleware.backend_ratelimit.time.time\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"b582b357_56bcd0b8","line":396,"in_reply_to":"9e16ce6f_cd02b6c4","updated":"2024-05-13 14:43:16.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":408,"context_line":"            \u0027DELETE\u0027: 7.3,"},{"line_number":409,"context_line":"            \u0027GET\u0027: 8.4})"},{"line_number":410,"context_line":"        self.assertEqual(exp_req_per_dev_per_sec,"},{"line_number":411,"context_line":"                         rl.requests_per_device_per_second)"},{"line_number":412,"context_line":"        self.assertEqual(12.4, rl.requests_per_device_rate_buffer)"},{"line_number":413,"context_line":"        self.assertEqual(conf_path, rl.conf_path)"},{"line_number":414,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a18bb46_a98700ae","line":411,"updated":"2024-03-08 23:30:15.000000000","message":"but here we see HEAD because the per_method_device_rates map is always fully populated on config reload.","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":408,"context_line":"            \u0027DELETE\u0027: 7.3,"},{"line_number":409,"context_line":"            \u0027GET\u0027: 8.4})"},{"line_number":410,"context_line":"        self.assertEqual(exp_req_per_dev_per_sec,"},{"line_number":411,"context_line":"                         rl.requests_per_device_per_second)"},{"line_number":412,"context_line":"        self.assertEqual(12.4, rl.requests_per_device_rate_buffer)"},{"line_number":413,"context_line":"        self.assertEqual(conf_path, rl.conf_path)"},{"line_number":414,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"b6844424_2d935f2a","line":411,"in_reply_to":"7a18bb46_a98700ae","updated":"2024-03-11 11:36:58.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        # verify the per dev ratelimiters were not updated"},{"line_number":449,"context_line":"        self.assertEqual({(\u0027sda1\u0027, \u0027GET\u0027): 8.4,"},{"line_number":450,"context_line":"                          (\u0027sda2\u0027, \u0027DELETE\u0027): 7.3,"},{"line_number":451,"context_line":"                          (\u0027sda1\u0027, None): 29.3,"},{"line_number":452,"context_line":"                          (\u0027sda2\u0027, None): 29.3},"},{"line_number":453,"context_line":"                         dict((key, val.max_rate)"}],"source_content_type":"text/x-python","patch_set":6,"id":"a9aacc86_5851ad48","line":450,"updated":"2024-03-08 23:30:15.000000000","message":"i wonder how worried I should be the DELETE ratelimiter is still in place - i think  it just hasn\u0027t reloaded yet.","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":447,"context_line":""},{"line_number":448,"context_line":"        # verify the per dev ratelimiters were not updated"},{"line_number":449,"context_line":"        self.assertEqual({(\u0027sda1\u0027, \u0027GET\u0027): 8.4,"},{"line_number":450,"context_line":"                          (\u0027sda2\u0027, \u0027DELETE\u0027): 7.3,"},{"line_number":451,"context_line":"                          (\u0027sda1\u0027, None): 29.3,"},{"line_number":452,"context_line":"                          (\u0027sda2\u0027, None): 29.3},"},{"line_number":453,"context_line":"                         dict((key, val.max_rate)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dab383e3_8b9ba652","line":450,"in_reply_to":"a9aacc86_5851ad48","updated":"2024-03-11 11:36:58.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        # verify the per dev ratelimiters were updated"},{"line_number":480,"context_line":"        self.assertEqual({(\u0027sda1\u0027, \u0027GET\u0027): 9.5,"},{"line_number":481,"context_line":"                          (\u0027sda2\u0027, \u0027DELETE\u0027): 0.0,"},{"line_number":482,"context_line":"                          (\u0027sda1\u0027, None): 1.3,"},{"line_number":483,"context_line":"                          (\u0027sda2\u0027, None): 1.3},"},{"line_number":484,"context_line":"                         dict((key, val.max_rate)"}],"source_content_type":"text/x-python","patch_set":6,"id":"8a2d8375_23ea7923","line":481,"updated":"2024-03-08 23:30:15.000000000","message":"yup, now that enough time has advance the reload happens and since it exists it will get updated.  Fantastic!","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":478,"context_line":""},{"line_number":479,"context_line":"        # verify the per dev ratelimiters were updated"},{"line_number":480,"context_line":"        self.assertEqual({(\u0027sda1\u0027, \u0027GET\u0027): 9.5,"},{"line_number":481,"context_line":"                          (\u0027sda2\u0027, \u0027DELETE\u0027): 0.0,"},{"line_number":482,"context_line":"                          (\u0027sda1\u0027, None): 1.3,"},{"line_number":483,"context_line":"                          (\u0027sda2\u0027, None): 1.3},"},{"line_number":484,"context_line":"                         dict((key, val.max_rate)"}],"source_content_type":"text/x-python","patch_set":6,"id":"c9808439_875024a1","line":481,"in_reply_to":"8a2d8375_23ea7923","updated":"2024-03-11 11:36:58.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":501,"context_line":"                       \u0027config_reload_interval\u0027: \"30\","},{"line_number":502,"context_line":"                       \u0027requests_per_device_per_second\u0027: \"1.3\","},{"line_number":503,"context_line":"                       \u0027requests_per_device_rate_buffer\u0027: \"2.4\","},{"line_number":504,"context_line":"                       \u0027head_requests_per_device_per_second\u0027: \u00276.2\u0027}"},{"line_number":505,"context_line":"        rl \u003d self._do_test_config_file_reload(filter_conf, 30)"},{"line_number":506,"context_line":"        self.assertEqual(30, rl.config_reload_interval)"},{"line_number":507,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"f5f6bed6_a8c458f2","line":504,"updated":"2024-03-08 23:30:15.000000000","message":"i think this value *eventually* gets overridden in the test - but the _do_test helper expects it for the initial assert loaded from this dict up until it change it and and the backend_ratelimit.conf is reloaded.","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7d10b986ea3778bdc3d731434f003286e174a5ac","unresolved":false,"context_lines":[{"line_number":501,"context_line":"                       \u0027config_reload_interval\u0027: \"30\","},{"line_number":502,"context_line":"                       \u0027requests_per_device_per_second\u0027: \"1.3\","},{"line_number":503,"context_line":"                       \u0027requests_per_device_rate_buffer\u0027: \"2.4\","},{"line_number":504,"context_line":"                       \u0027head_requests_per_device_per_second\u0027: \u00276.2\u0027}"},{"line_number":505,"context_line":"        rl \u003d self._do_test_config_file_reload(filter_conf, 30)"},{"line_number":506,"context_line":"        self.assertEqual(30, rl.config_reload_interval)"},{"line_number":507,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"32a8e345_6595c3f0","line":504,"in_reply_to":"0682943b_e8d8063c","updated":"2024-05-13 08:20:47.000000000","message":"Done","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":true,"context_lines":[{"line_number":501,"context_line":"                       \u0027config_reload_interval\u0027: \"30\","},{"line_number":502,"context_line":"                       \u0027requests_per_device_per_second\u0027: \"1.3\","},{"line_number":503,"context_line":"                       \u0027requests_per_device_rate_buffer\u0027: \"2.4\","},{"line_number":504,"context_line":"                       \u0027head_requests_per_device_per_second\u0027: \u00276.2\u0027}"},{"line_number":505,"context_line":"        rl \u003d self._do_test_config_file_reload(filter_conf, 30)"},{"line_number":506,"context_line":"        self.assertEqual(30, rl.config_reload_interval)"},{"line_number":507,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"0682943b_e8d8063c","line":504,"in_reply_to":"f5f6bed6_a8c458f2","updated":"2024-03-11 11:36:58.000000000","message":"hmmm, may be clearer to declare the filter_conf in the helper","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":656,"context_line":"                resp1 \u003d req1.get_response(rl)"},{"line_number":657,"context_line":"        self.assertEqual(200, resp1.status_int)"},{"line_number":658,"context_line":"        # previous conf file value has been retained"},{"line_number":659,"context_line":"        self.assertEqual(exp_req_per_dev_per_sec,"},{"line_number":660,"context_line":"                         rl.requests_per_device_per_second)"},{"line_number":661,"context_line":"        self.assertEqual(2.4, rl.requests_per_device_rate_buffer)"},{"line_number":662,"context_line":"        mock_readconf.assert_called_once()"}],"source_content_type":"text/x-python","patch_set":6,"id":"4148697a_b1b1f585","line":659,"updated":"2024-03-08 23:30:15.000000000","message":"this expectation was already changed to 12.3 in L636","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":656,"context_line":"                resp1 \u003d req1.get_response(rl)"},{"line_number":657,"context_line":"        self.assertEqual(200, resp1.status_int)"},{"line_number":658,"context_line":"        # previous conf file value has been retained"},{"line_number":659,"context_line":"        self.assertEqual(exp_req_per_dev_per_sec,"},{"line_number":660,"context_line":"                         rl.requests_per_device_per_second)"},{"line_number":661,"context_line":"        self.assertEqual(2.4, rl.requests_per_device_rate_buffer)"},{"line_number":662,"context_line":"        mock_readconf.assert_called_once()"}],"source_content_type":"text/x-python","patch_set":6,"id":"e27831c7_32996968","line":659,"in_reply_to":"4148697a_b1b1f585","updated":"2024-03-11 11:36:58.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3623036dfbbfb7c29ab87b1eeb0534b59bbf8dab","unresolved":true,"context_lines":[{"line_number":892,"context_line":"                \u0027BackendRateLimitMiddleware._is_allowed\u0027) as mock_is_allowed:"},{"line_number":893,"context_line":"            success_per_dev \u003d self._do_test_ratelimit(\u0027GET\u0027, 0, 0)"},{"line_number":894,"context_line":"        self.assertEqual([20] * 3, list(success_per_dev.values()))"},{"line_number":895,"context_line":"        mock_is_allowed.assert_not_called()"},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"    def test_unhandled_request(self):"},{"line_number":898,"context_line":"        app \u003d FakeSwift()"}],"source_content_type":"text/x-python","patch_set":6,"id":"85427d22_b8751a17","line":895,"updated":"2024-03-08 23:30:15.000000000","message":"oh right, our mock is never called becuase of the short circut on backend_ratelimit_is_enabled or max or whatever it\u0027s called.","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"34214f378bc15b2b7af22290bf52af6aea8884fc","unresolved":false,"context_lines":[{"line_number":892,"context_line":"                \u0027BackendRateLimitMiddleware._is_allowed\u0027) as mock_is_allowed:"},{"line_number":893,"context_line":"            success_per_dev \u003d self._do_test_ratelimit(\u0027GET\u0027, 0, 0)"},{"line_number":894,"context_line":"        self.assertEqual([20] * 3, list(success_per_dev.values()))"},{"line_number":895,"context_line":"        mock_is_allowed.assert_not_called()"},{"line_number":896,"context_line":""},{"line_number":897,"context_line":"    def test_unhandled_request(self):"},{"line_number":898,"context_line":"        app \u003d FakeSwift()"}],"source_content_type":"text/x-python","patch_set":6,"id":"951cf227_f8f19dd6","line":895,"in_reply_to":"85427d22_b8751a17","updated":"2024-03-11 11:36:58.000000000","message":"Acknowledged","commit_id":"e2873285fed45aafdad7cdd6778159d49079d4de"}]}
