)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"06bdc7ac61ee42033a3e68c80f53cf6b4dde9f35","unresolved":false,"context_lines":[{"line_number":7,"context_line":"memcache: Make error-limiting values configurable"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Previously these were all hardcoded; let operators tweak them as needed."},{"line_number":10,"context_line":"Significantly, this also allows operators to disabled error-limiting"},{"line_number":11,"context_line":"entirely, which may be a useful protection in case proxies are"},{"line_number":12,"context_line":"configured with a single memcached server."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1f621f24_5ac63e9c","line":10,"updated":"2020-11-05 19:12:53.000000000","message":"\"to disable\"","commit_id":"4974d9ce0858fb6bfc49b757e77569c2afdc9294"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ca0d8ae360b8587424ab78706f894709e24d2cb7","unresolved":false,"context_lines":[{"line_number":702,"context_line":"# How many errors can accumulate before a server is temporarily ignored."},{"line_number":703,"context_line":"# error_suppression_limit \u003d 10"},{"line_number":704,"context_line":"#"},{"line_number":705,"context_line":"# More options documented in memcache.conf-sample"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"[filter:ratelimit]"},{"line_number":708,"context_line":"use \u003d egg:swift#ratelimit"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"1f621f24_c5ca7818","line":705,"updated":"2020-11-05 16:26:32.000000000","message":"should memcache.conf-sample also be updated?\n\noff-topic: should all the content in this section be de-duped and in memcache.conf-sample, and just a pointer included here?","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1051e1c6a6813bb34c7d74bf0a9a5ddabc4da77b","unresolved":false,"context_lines":[{"line_number":702,"context_line":"# How many errors can accumulate before a server is temporarily ignored."},{"line_number":703,"context_line":"# error_suppression_limit \u003d 10"},{"line_number":704,"context_line":"#"},{"line_number":705,"context_line":"# More options documented in memcache.conf-sample"},{"line_number":706,"context_line":""},{"line_number":707,"context_line":"[filter:ratelimit]"},{"line_number":708,"context_line":"use \u003d egg:swift#ratelimit"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"1f621f24_c6171ea3","line":705,"in_reply_to":"1f621f24_c5ca7818","updated":"2020-11-05 18:32:01.000000000","message":"Yeah, I\u0027ll update memcache.conf-sample, too","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"}],"swift/common/memcached.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ca0d8ae360b8587424ab78706f894709e24d2cb7","unresolved":false,"context_lines":[{"line_number":72,"context_line":"# if ERROR_LIMIT_COUNT errors occur in ERROR_LIMIT_TIME seconds, the server"},{"line_number":73,"context_line":"# will be considered failed for ERROR_LIMIT_DURATION seconds."},{"line_number":74,"context_line":"ERROR_LIMIT_COUNT \u003d 10"},{"line_number":75,"context_line":"ERROR_LIMIT_TIME \u003d ERROR_LIMIT_DURATION \u003d 60"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"def md5hash(key):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_65cc446a","line":75,"updated":"2020-11-05 16:26:32.000000000","message":"nit: might be worth adding a DEFAULT_ prefix, although I\u0027m not sure how consistently that pattern is followed, I am just contrasting with the DEFAULT_RECHECK_* vars that I have recently looked at","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1051e1c6a6813bb34c7d74bf0a9a5ddabc4da77b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"# if ERROR_LIMIT_COUNT errors occur in ERROR_LIMIT_TIME seconds, the server"},{"line_number":73,"context_line":"# will be considered failed for ERROR_LIMIT_DURATION seconds."},{"line_number":74,"context_line":"ERROR_LIMIT_COUNT \u003d 10"},{"line_number":75,"context_line":"ERROR_LIMIT_TIME \u003d ERROR_LIMIT_DURATION \u003d 60"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"def md5hash(key):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_e614daa2","line":75,"in_reply_to":"1f621f24_65cc446a","updated":"2020-11-05 18:32:01.000000000","message":"I\u0027d actually started out that way! Then I got to wondering about whether anyone would be referencing the values directly, or even monkey-patching them in some wrapping server-loader... and I got nervous about it. Seemed safer to just leave it alone.","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ca0d8ae360b8587424ab78706f894709e24d2cb7","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        self._error_limit_count \u003d error_limit_count"},{"line_number":170,"context_line":"        self._error_limit_time \u003d error_limit_time"},{"line_number":171,"context_line":"        self._error_limit_duration \u003d error_limit_duration"},{"line_number":172,"context_line":"        if self._error_limit_duration \u003c\u003d 0:"},{"line_number":173,"context_line":"            self._error_limit_time \u003d 0"},{"line_number":174,"context_line":"        for server in sorted(servers):"},{"line_number":175,"context_line":"            for i in range(NODE_WEIGHT):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_c079c693","line":172,"updated":"2020-11-05 16:26:32.000000000","message":"this looks a bit strange i.e. to force minimum of zero to error_limit_time but not to the error_limit_duration - is that deliberate?\n\n(AFAICT it makes no difference to the behaviour but it just looks odd here)","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1051e1c6a6813bb34c7d74bf0a9a5ddabc4da77b","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        self._error_limit_count \u003d error_limit_count"},{"line_number":170,"context_line":"        self._error_limit_time \u003d error_limit_time"},{"line_number":171,"context_line":"        self._error_limit_duration \u003d error_limit_duration"},{"line_number":172,"context_line":"        if self._error_limit_duration \u003c\u003d 0:"},{"line_number":173,"context_line":"            self._error_limit_time \u003d 0"},{"line_number":174,"context_line":"        for server in sorted(servers):"},{"line_number":175,"context_line":"            for i in range(NODE_WEIGHT):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_a64942d1","line":172,"in_reply_to":"1f621f24_c079c693","updated":"2020-11-05 18:32:01.000000000","message":"So this is not actually about enforcing a floor, but making sure that if *either* time or duration is \u003c\u003d 0, we skip the bookkeeping entirely. Maybe I should just *say that* in the short-circuit at L222 :-/","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ca0d8ae360b8587424ab78706f894709e24d2cb7","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            return"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        now \u003d time.time()"},{"line_number":226,"context_line":"        self._errors[server].append(time.time())"},{"line_number":227,"context_line":"        if len(self._errors[server]) \u003e self._error_limit_count:"},{"line_number":228,"context_line":"            self._errors[server] \u003d [err for err in self._errors[server]"},{"line_number":229,"context_line":"                                    if err \u003e now - self._error_limit_time]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_40d8167e","line":226,"updated":"2020-11-05 16:26:32.000000000","message":"nit^2: if we didn\u0027t have the short circuit at line 222, then a server might get error_limited with error_limit_time\u003d\u003d0 and error_limit_count\u003d\u003d0, if time.time() \u003e now.\n\nOf course, we *do* have the short circuit so this is just a trivial intellectual annoyance :) But if, and only if, you need to revise the patch could you change \u0027time.time()\u0027 here to be \u0027now\u0027, so that the analysis of the two path is consistent.","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1051e1c6a6813bb34c7d74bf0a9a5ddabc4da77b","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            return"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        now \u003d time.time()"},{"line_number":226,"context_line":"        self._errors[server].append(time.time())"},{"line_number":227,"context_line":"        if len(self._errors[server]) \u003e self._error_limit_count:"},{"line_number":228,"context_line":"            self._errors[server] \u003d [err for err in self._errors[server]"},{"line_number":229,"context_line":"                                    if err \u003e now - self._error_limit_time]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_c62efef8","line":226,"in_reply_to":"1f621f24_40d8167e","updated":"2020-11-05 18:32:01.000000000","message":"#willfix","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"06bdc7ac61ee42033a3e68c80f53cf6b4dde9f35","unresolved":false,"context_lines":[{"line_number":221,"context_line":"            return"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        now \u003d time.time()"},{"line_number":224,"context_line":"        self._errors[server].append(now)"},{"line_number":225,"context_line":"        if len(self._errors[server]) \u003e self._error_limit_count:"},{"line_number":226,"context_line":"            self._errors[server] \u003d [err for err in self._errors[server]"},{"line_number":227,"context_line":"                                    if err \u003e now - self._error_limit_time]"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f621f24_ba6312b1","line":224,"updated":"2020-11-05 19:12:53.000000000","message":"good one","commit_id":"4974d9ce0858fb6bfc49b757e77569c2afdc9294"}],"swift/common/middleware/memcache.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1051e1c6a6813bb34c7d74bf0a9a5ddabc4da77b","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            logger\u003dself.logger,"},{"line_number":114,"context_line":"            error_limit_count\u003derror_suppression_limit,"},{"line_number":115,"context_line":"            error_limit_time\u003derror_suppression_interval,"},{"line_number":116,"context_line":"            error_limit_duration\u003derror_suppression_interval)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def __call__(self, env, start_response):"},{"line_number":119,"context_line":"        env[\u0027swift.cache\u0027] \u003d self.memcache"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_c67c3eed","line":116,"updated":"2020-11-05 18:32:01.000000000","message":"I\u0027m kinda torn about the difference in naming here -- but it seems preferable to have it match the proxy-server options.","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"}],"test/unit/common/test_memcached.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ca0d8ae360b8587424ab78706f894709e24d2cb7","unresolved":false,"context_lines":[{"line_number":542,"context_line":"        mock2.should_explode \u003d True"},{"line_number":543,"context_line":"        for _ in range(12):"},{"line_number":544,"context_line":"            memcache_client.set(\u0027some_key\u0027, [1, 2, 3])"},{"line_number":545,"context_line":"        # since .4 is the last available server, it won\u0027t get error limited"},{"line_number":546,"context_line":"        self.assertEqual(self.logger.get_lines_for_level(\u0027error\u0027), ["},{"line_number":547,"context_line":"            \u0027Error talking to memcached: 1.2.3.4:11211: \u0027"},{"line_number":548,"context_line":"            \u0027[Errno 32] Broken pipe\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_253c0ce1","line":545,"updated":"2020-11-05 16:26:32.000000000","message":"stale comment - .4 will be error limited","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1051e1c6a6813bb34c7d74bf0a9a5ddabc4da77b","unresolved":false,"context_lines":[{"line_number":542,"context_line":"        mock2.should_explode \u003d True"},{"line_number":543,"context_line":"        for _ in range(12):"},{"line_number":544,"context_line":"            memcache_client.set(\u0027some_key\u0027, [1, 2, 3])"},{"line_number":545,"context_line":"        # since .4 is the last available server, it won\u0027t get error limited"},{"line_number":546,"context_line":"        self.assertEqual(self.logger.get_lines_for_level(\u0027error\u0027), ["},{"line_number":547,"context_line":"            \u0027Error talking to memcached: 1.2.3.4:11211: \u0027"},{"line_number":548,"context_line":"            \u0027[Errno 32] Broken pipe\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f621f24_268412d4","line":545,"in_reply_to":"1f621f24_253c0ce1","updated":"2020-11-05 18:32:01.000000000","message":"Bah -- #willfix","commit_id":"b735be518db17d0f77f3205a6a48350d0b3cfe6a"}]}
