)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"e797a1874b11081cea4af579bf1fd80e78bbab38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"82817682_b4ee2b6a","updated":"2023-01-05 23:16:12.000000000","message":"thanks for the review.","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5c7575b09437b418c574ea1518397b6948a57b3e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"7116553a_2ed706d4","updated":"2023-01-05 23:29:20.000000000","message":"LGTM","commit_id":"242ffe8fb59d826708b378ed93e3bf5410cc6636"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2fa04e791e44aab83bd96d391e9f7ae34028582f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"259d78c8_7ddada80","updated":"2023-01-06 00:05:29.000000000","message":"Minor pep8 fixes","commit_id":"359870c09ec770b5d34e54cb26907b35354c0256"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"2a7b62bb3a3bb0f033f0c921a9d948074b313dcc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a8fa549f_563e6085","in_reply_to":"259d78c8_7ddada80","updated":"2023-01-06 01:09:45.000000000","message":"Thanks!","commit_id":"359870c09ec770b5d34e54cb26907b35354c0256"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ae18d07cf518b5b5b638ff547e12ccc09f3bfe21","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"4d70c3e7_9f385de2","updated":"2023-01-06 05:05:57.000000000","message":"Oh, sorry! Actually, maybe I like your fix better...","commit_id":"2cac39162cba12d0fd394725fca1c545dc628b81"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"51ae6afe180a3977728a3adefd481247e68383f6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1bca3361_1b57b7a3","in_reply_to":"4d70c3e7_9f385de2","updated":"2023-01-06 05:08:32.000000000","message":"I think maybe I can save a little bit CPU instructions in production code, since the failed test file is the only place which is using Memcached and is having this issue.","commit_id":"2cac39162cba12d0fd394725fca1c545dc628b81"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fa397d80e5a65c64588c2b4209cb36a401e9e98","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"cc70e15e_359e4d9c","updated":"2023-01-11 16:12:04.000000000","message":"i think if we can we should try to fix this patch rather than \"all the middlewares\"","commit_id":"b4124e0cd25b7f50b7d6be284fe2b936d7191acc"}],"swift/common/memcached.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4a0978ca126f2f652f1d2c32742c7a9fe0a78ae9","unresolved":true,"context_lines":[{"line_number":49,"context_line":"import json"},{"line_number":50,"context_line":"import logging"},{"line_number":51,"context_line":"import time"},{"line_number":52,"context_line":"import random"},{"line_number":53,"context_line":"from bisect import bisect"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"from eventlet.green import socket, ssl"}],"source_content_type":"text/x-python","patch_set":1,"id":"c36d2282_66c764db","line":52,"updated":"2023-01-05 18:19:03.000000000","message":"Unused?","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"e797a1874b11081cea4af579bf1fd80e78bbab38","unresolved":false,"context_lines":[{"line_number":49,"context_line":"import json"},{"line_number":50,"context_line":"import logging"},{"line_number":51,"context_line":"import time"},{"line_number":52,"context_line":"import random"},{"line_number":53,"context_line":"from bisect import bisect"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"from eventlet.green import socket, ssl"}],"source_content_type":"text/x-python","patch_set":1,"id":"3aaf7c54_dde6e7c0","line":52,"in_reply_to":"c36d2282_66c764db","updated":"2023-01-05 23:16:12.000000000","message":"Done","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4a0978ca126f2f652f1d2c32742c7a9fe0a78ae9","unresolved":true,"context_lines":[{"line_number":351,"context_line":"            raise MemcacheConnectionError("},{"line_number":352,"context_line":"                \"No memcached connections succeeded.\")"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    @memcached_timing_stats(sample_rate\u003d0.02)"},{"line_number":355,"context_line":"    def get(self, key, raise_on_error\u003dFalse):"},{"line_number":356,"context_line":"        \"\"\""},{"line_number":357,"context_line":"        Gets the object specified by key.  It will also unserialize the object"}],"source_content_type":"text/x-python","patch_set":1,"id":"d4f36c1c_61cbefa2","line":354,"updated":"2023-01-05 18:19:03.000000000","message":"So how\u0027d we choose these sample rates? How\u0027d we decide on the ratio for gets vs everything else?","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"51ae6afe180a3977728a3adefd481247e68383f6","unresolved":false,"context_lines":[{"line_number":351,"context_line":"            raise MemcacheConnectionError("},{"line_number":352,"context_line":"                \"No memcached connections succeeded.\")"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    @memcached_timing_stats(sample_rate\u003d0.02)"},{"line_number":355,"context_line":"    def get(self, key, raise_on_error\u003dFalse):"},{"line_number":356,"context_line":"        \"\"\""},{"line_number":357,"context_line":"        Gets the object specified by key.  It will also unserialize the object"}],"source_content_type":"text/x-python","patch_set":1,"id":"b6bfd800_f9564f23","line":354,"in_reply_to":"a5e2f02f_db4e621e","updated":"2023-01-06 05:08:32.000000000","message":"Done","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"e797a1874b11081cea4af579bf1fd80e78bbab38","unresolved":true,"context_lines":[{"line_number":351,"context_line":"            raise MemcacheConnectionError("},{"line_number":352,"context_line":"                \"No memcached connections succeeded.\")"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"    @memcached_timing_stats(sample_rate\u003d0.02)"},{"line_number":355,"context_line":"    def get(self, key, raise_on_error\u003dFalse):"},{"line_number":356,"context_line":"        \"\"\""},{"line_number":357,"context_line":"        Gets the object specified by key.  It will also unserialize the object"}],"source_content_type":"text/x-python","patch_set":1,"id":"a5e2f02f_db4e621e","line":354,"in_reply_to":"d4f36c1c_61cbefa2","updated":"2023-01-05 23:16:12.000000000","message":"Those rates were chosen based on the operations ratio from production memcached throughputs. I feel this should be generic to all open source users as well. Current sample rates for different object/container servers are fixed value too, I wanted to pass configs into those decorators, but python decorators won\u0027t take \"self.xxx\" as parameters.","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ddba855af5cc0a9bfb4a732e464f017f93a13dba","unresolved":true,"context_lines":[{"line_number":207,"context_line":"        self._io_timeout \u003d io_timeout"},{"line_number":208,"context_line":"        self._pool_timeout \u003d pool_timeout"},{"line_number":209,"context_line":"        if logger is None:"},{"line_number":210,"context_line":"            self.logger \u003d logging.getLogger()"},{"line_number":211,"context_line":"        else:"},{"line_number":212,"context_line":"            self.logger \u003d logger"},{"line_number":213,"context_line":"        self.item_size_warning_threshold \u003d item_size_warning_threshold"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a7fc4c4_fcd68418","line":210,"range":{"start_line":210,"start_character":12,"end_line":210,"end_character":45},"updated":"2023-01-19 14:14:36.000000000","message":"This is problematic - a logging.getLogger() instance does not support timing_since().\n\nSee https://bugs.launchpad.net/swift/+bug/2003345","commit_id":"b4124e0cd25b7f50b7d6be284fe2b936d7191acc"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"12cb572642d0d9094b3c14d9d8e5703e9848d7bc","unresolved":true,"context_lines":[{"line_number":207,"context_line":"        self._io_timeout \u003d io_timeout"},{"line_number":208,"context_line":"        self._pool_timeout \u003d pool_timeout"},{"line_number":209,"context_line":"        if logger is None:"},{"line_number":210,"context_line":"            self.logger \u003d logging.getLogger()"},{"line_number":211,"context_line":"        else:"},{"line_number":212,"context_line":"            self.logger \u003d logger"},{"line_number":213,"context_line":"        self.item_size_warning_threshold \u003d item_size_warning_threshold"}],"source_content_type":"text/x-python","patch_set":8,"id":"9268e3bf_9b620412","line":210,"range":{"start_line":210,"start_character":12,"end_line":210,"end_character":45},"in_reply_to":"5a7fc4c4_fcd68418","updated":"2023-01-20 00:20:08.000000000","message":"then should we add back Tim\u0027s changes to support default logger? I can help on that if needed.","commit_id":"b4124e0cd25b7f50b7d6be284fe2b936d7191acc"}],"swift/common/utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4a0978ca126f2f652f1d2c32742c7a9fe0a78ae9","unresolved":true,"context_lines":[{"line_number":2041,"context_line":"    MemcacheRing class, such as memcached set, get and etc."},{"line_number":2042,"context_line":"    \"\"\""},{"line_number":2043,"context_line":"    def decorating_func(func):"},{"line_number":2044,"context_line":"        method \u003d func.__name__"},{"line_number":2045,"context_line":""},{"line_number":2046,"context_line":"        @functools.wraps(func)"},{"line_number":2047,"context_line":"        def _timing_stats(cache, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"94f813de_d8834cbe","line":2044,"updated":"2023-01-05 18:19:03.000000000","message":"+1, nice.","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"e797a1874b11081cea4af579bf1fd80e78bbab38","unresolved":false,"context_lines":[{"line_number":2041,"context_line":"    MemcacheRing class, such as memcached set, get and etc."},{"line_number":2042,"context_line":"    \"\"\""},{"line_number":2043,"context_line":"    def decorating_func(func):"},{"line_number":2044,"context_line":"        method \u003d func.__name__"},{"line_number":2045,"context_line":""},{"line_number":2046,"context_line":"        @functools.wraps(func)"},{"line_number":2047,"context_line":"        def _timing_stats(cache, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7a4a92_d89d9d43","line":2044,"in_reply_to":"94f813de_d8834cbe","updated":"2023-01-05 23:16:12.000000000","message":"Ack","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1317d6ceaed494307ceaf928298b0c2943404407","unresolved":true,"context_lines":[{"line_number":2047,"context_line":"        def _timing_stats(cache, *args, **kwargs):"},{"line_number":2048,"context_line":"            start_time \u003d time.time()"},{"line_number":2049,"context_line":"            result \u003d func(cache, *args, **kwargs)"},{"line_number":2050,"context_line":"            cache.logger.timing_since("},{"line_number":2051,"context_line":"                \u0027memcached.\u0027 + method + \u0027.timing\u0027, start_time, **dec_kwargs)"},{"line_number":2052,"context_line":"            return result"},{"line_number":2053,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"11d19a1f_135c79a8","line":2050,"updated":"2023-01-06 02:54:23.000000000","message":"Those probe test failures look legit -- looks like we want to guard this with something like\n\n if hasattr(getattr(cache, \u0027logger\u0027, None), \u0027timing_since\u0027):","commit_id":"359870c09ec770b5d34e54cb26907b35354c0256"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0fa397d80e5a65c64588c2b4209cb36a401e9e98","unresolved":true,"context_lines":[{"line_number":2043,"context_line":"    def decorating_func(func):"},{"line_number":2044,"context_line":"        method \u003d func.__name__"},{"line_number":2045,"context_line":""},{"line_number":2046,"context_line":"        @functools.wraps(func)"},{"line_number":2047,"context_line":"        def _timing_stats(cache, *args, **kwargs):"},{"line_number":2048,"context_line":"            start_time \u003d time.time()"},{"line_number":2049,"context_line":"            result \u003d func(cache, *args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":8,"id":"65ff85a1_72feb257","line":2046,"updated":"2023-01-11 16:12:04.000000000","message":"sadly on py2 it seems this preserves the name and the docstring but not the function signature (which is bad if callers are checking to see if the function supports time or timeout kwarg)","commit_id":"b4124e0cd25b7f50b7d6be284fe2b936d7191acc"}],"test/unit/common/test_utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4a0978ca126f2f652f1d2c32742c7a9fe0a78ae9","unresolved":true,"context_lines":[{"line_number":5770,"context_line":"                self.args \u003d ()"},{"line_number":5771,"context_line":"                self.called \u003d \u0027UNKNOWN\u0027"},{"line_number":5772,"context_line":""},{"line_number":5773,"context_line":"            def timing_since(self, *args):"},{"line_number":5774,"context_line":"                self.called \u003d \u0027timing\u0027"},{"line_number":5775,"context_line":"                self.args \u003d args"},{"line_number":5776,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"88a52759_1036a171","line":5773,"updated":"2023-01-05 18:19:03.000000000","message":"Is this a method on the cache, or on the logger that\u0027s hanging off the cache?","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"e797a1874b11081cea4af579bf1fd80e78bbab38","unresolved":false,"context_lines":[{"line_number":5770,"context_line":"                self.args \u003d ()"},{"line_number":5771,"context_line":"                self.called \u003d \u0027UNKNOWN\u0027"},{"line_number":5772,"context_line":""},{"line_number":5773,"context_line":"            def timing_since(self, *args):"},{"line_number":5774,"context_line":"                self.called \u003d \u0027timing\u0027"},{"line_number":5775,"context_line":"                self.args \u003d args"},{"line_number":5776,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7950a84a_641be6bc","line":5773,"in_reply_to":"88a52759_1036a171","updated":"2023-01-05 23:16:12.000000000","message":"it\u0027s on the cache, just to unit test this decorator. \nline 5769: self.logger \u003d self","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4a0978ca126f2f652f1d2c32742c7a9fe0a78ae9","unresolved":true,"context_lines":[{"line_number":5788,"context_line":"        self.assertEqual(len(mock_cache.args), 2)"},{"line_number":5789,"context_line":"        self.assertEqual(mock_cache.args[0], \u0027memcached.set.timing\u0027)"},{"line_number":5790,"context_line":"        self.assertTrue(mock_cache.args[1] \u003e 0)"},{"line_number":5791,"context_line":"        get(mock_cache)"},{"line_number":5792,"context_line":"        self.assertEqual(mock_cache.called, \u0027timing\u0027)"},{"line_number":5793,"context_line":"        self.assertEqual(len(mock_cache.args), 2)"},{"line_number":5794,"context_line":"        self.assertEqual(mock_cache.args[0], \u0027memcached.get.timing\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"68aba61f_5067b4e3","line":5791,"updated":"2023-01-05 18:19:03.000000000","message":"I\u0027m a little worried about these assertions -- I don\u0027t think there\u0027s a guarantee that the return will advance between calls to time.time():\n\n \u003e\u003e\u003e for x in itertools.count():\n ...     if time.time() \u003e\u003d time.time():\n ...         break\n ... \n \u003e\u003e\u003e x\n 2\n \u003e\u003e\u003e for x in itertools.count():\n ...     if time.time() \u003e\u003d time.time():\n ...         break\n ... \n \u003e\u003e\u003e x\n 12\n \u003e\u003e\u003e for x in itertools.count():\n ...     if time.time() \u003e\u003d time.time():\n ...         break\n ... \n \u003e\u003e\u003e x\n 27\n\nProbably better to mock out time to ensure it advances.","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"e797a1874b11081cea4af579bf1fd80e78bbab38","unresolved":false,"context_lines":[{"line_number":5788,"context_line":"        self.assertEqual(len(mock_cache.args), 2)"},{"line_number":5789,"context_line":"        self.assertEqual(mock_cache.args[0], \u0027memcached.set.timing\u0027)"},{"line_number":5790,"context_line":"        self.assertTrue(mock_cache.args[1] \u003e 0)"},{"line_number":5791,"context_line":"        get(mock_cache)"},{"line_number":5792,"context_line":"        self.assertEqual(mock_cache.called, \u0027timing\u0027)"},{"line_number":5793,"context_line":"        self.assertEqual(len(mock_cache.args), 2)"},{"line_number":5794,"context_line":"        self.assertEqual(mock_cache.args[0], \u0027memcached.get.timing\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"f78ab41d_09c42120","line":5791,"in_reply_to":"68aba61f_5067b4e3","updated":"2023-01-05 23:16:12.000000000","message":"actually, the call of \"timing_since\" is required to pass \"start_time\". So for below assertions, even time.time() won\u0027t advance, mock_cache.args[1] (which is the start_time) still will be \u003e 0.\nself.assertTrue(mock_cache.args[1] \u003e 0)\n\nBut it\u0027s good to have mock of time to check the args precisely.","commit_id":"85c0ce297257ce3b25af35364abd79a2ea414dce"}]}
