)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"c8dadbfb_1795bde1","updated":"2023-04-26 14:28:58.000000000","message":"-1 because the timeout value needs to be read from the exception, not config.\n\notherwise my comments are just some unnecessary changes, test coverage and nits.","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"dbaa13a1_561b350d","updated":"2023-04-27 05:51:02.000000000","message":"Thanks a lot for your detailed reviews! I submitted last patch to get your opinions on the implementation of metrics logics, knew it lacked some test cases.","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1fee05cb9b64fe107e9411358a1aaf578de69b35","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"8e46aff7_055abe97","updated":"2023-04-27 11:22:42.000000000","message":"I think there may be an opportunity to make the log messaging more consistent w.r.t the \u0027elapsed timeout time\u0027 between this handler and the LogAdapter handler that Clay has worked on here https://review.opendev.org/c/openstack/swift/+/881520?usp\u003demail\n\nBut for now, we\u0027ll carry this and see what we learn, and optimise the patches later if they prove useful.","commit_id":"0b6dd8da887d23504ada332aca63f77813b63103"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5381ee322cd81d82e08fdfceaf8f64a97945ec22","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"f866ce3d_9d86d6ed","updated":"2023-05-18 11:33:43.000000000","message":"follow up to try out encapsulation https://review.opendev.org/c/openstack/swift/+/883490 memcached: encapsulate common command parameters","commit_id":"7b4642567ae2c35dd0e8d07ea628a80d04ccc820"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"bc6e8ee12dc15e245ac144d882615b0b0baef617","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"abbc3bf7_31be64ea","updated":"2023-05-18 09:43:27.000000000","message":"this has already helped us track down a significant bug https://review.opendev.org/c/openstack/swift/+/883367","commit_id":"7b4642567ae2c35dd0e8d07ea628a80d04ccc820"}],"swift/common/memcached.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46996e6cf92970de04645ae437b70f8b063851af","unresolved":true,"context_lines":[{"line_number":227,"context_line":"            self.logger.error("},{"line_number":228,"context_line":"                \"Timeout %(action)s to memcached: %(server)s\""},{"line_number":229,"context_line":"                \": with key_prefix %(key_prefix)s\","},{"line_number":230,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server, \u0027key_prefix\u0027: key_prefix})"},{"line_number":231,"context_line":"        elif isinstance(e, (socket.error, MemcacheConnectionError)):"},{"line_number":232,"context_line":"            self.logger.error("},{"line_number":233,"context_line":"                \"Error %(action)s to memcached: %(server)s: %(err)s\""}],"source_content_type":"text/x-python","patch_set":6,"id":"68226ece_8c6f8c9c","line":230,"updated":"2023-04-24 16:29:57.000000000","message":"It would be good if we could in include the configured timeout value in the message, but also the actual elapsed time if possible?","commit_id":"42d7b35f91c7e45d684e02680938c95ae7f5e6a5"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"6905dbd539d32eafae1043d2efd4daf6d1e1ccc6","unresolved":true,"context_lines":[{"line_number":227,"context_line":"            self.logger.error("},{"line_number":228,"context_line":"                \"Timeout %(action)s to memcached: %(server)s\""},{"line_number":229,"context_line":"                \": with key_prefix %(key_prefix)s\","},{"line_number":230,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server, \u0027key_prefix\u0027: key_prefix})"},{"line_number":231,"context_line":"        elif isinstance(e, (socket.error, MemcacheConnectionError)):"},{"line_number":232,"context_line":"            self.logger.error("},{"line_number":233,"context_line":"                \"Error %(action)s to memcached: %(server)s: %(err)s\""}],"source_content_type":"text/x-python","patch_set":6,"id":"c6687cab_682212be","line":230,"in_reply_to":"68226ece_8c6f8c9c","updated":"2023-04-25 05:17:54.000000000","message":"yes, that\u0027ll be useful.","commit_id":"42d7b35f91c7e45d684e02680938c95ae7f5e6a5"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"ae848cc6373df60d4415511c49f46286028a05d8","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            self.logger.error("},{"line_number":228,"context_line":"                \"Timeout %(action)s to memcached: %(server)s\""},{"line_number":229,"context_line":"                \": with key_prefix %(key_prefix)s\","},{"line_number":230,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server, \u0027key_prefix\u0027: key_prefix})"},{"line_number":231,"context_line":"        elif isinstance(e, (socket.error, MemcacheConnectionError)):"},{"line_number":232,"context_line":"            self.logger.error("},{"line_number":233,"context_line":"                \"Error %(action)s to memcached: %(server)s: %(err)s\""}],"source_content_type":"text/x-python","patch_set":6,"id":"69b01fc4_e92b0a02","line":230,"in_reply_to":"c6687cab_682212be","updated":"2023-04-25 22:08:46.000000000","message":"Done","commit_id":"42d7b35f91c7e45d684e02680938c95ae7f5e6a5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"80f803ab0f05f370cd89c2574135f8caa0a098a4","unresolved":true,"context_lines":[{"line_number":370,"context_line":"            except (Exception, Timeout) as e:"},{"line_number":371,"context_line":"                self._exception_occurred("},{"line_number":372,"context_line":"                    server, e, key_prefix, sock\u003dsock, fp\u003dfp)"},{"line_number":373,"context_line":"                if type(e) \u003d\u003d Timeout:"},{"line_number":374,"context_line":"                    timeout_occurred \u003d True"},{"line_number":375,"context_line":"        if raise_on_error:"},{"line_number":376,"context_line":"            raise MemcacheTimeoutError("}],"source_content_type":"text/x-python","patch_set":6,"id":"bc26ddce_cdd60f04","line":373,"range":{"start_line":373,"start_character":19,"end_line":373,"end_character":23},"updated":"2023-04-24 15:09:16.000000000","message":"use isinstance because that will return True when e is a subclass of Timeout","commit_id":"42d7b35f91c7e45d684e02680938c95ae7f5e6a5"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"ebe4074e17bdbb853b671b8ce15e9f6217935f9a","unresolved":false,"context_lines":[{"line_number":370,"context_line":"            except (Exception, Timeout) as e:"},{"line_number":371,"context_line":"                self._exception_occurred("},{"line_number":372,"context_line":"                    server, e, key_prefix, sock\u003dsock, fp\u003dfp)"},{"line_number":373,"context_line":"                if type(e) \u003d\u003d Timeout:"},{"line_number":374,"context_line":"                    timeout_occurred \u003d True"},{"line_number":375,"context_line":"        if raise_on_error:"},{"line_number":376,"context_line":"            raise MemcacheTimeoutError("}],"source_content_type":"text/x-python","patch_set":6,"id":"a07b9cfa_54c7b0eb","line":373,"range":{"start_line":373,"start_character":19,"end_line":373,"end_character":23},"in_reply_to":"bc26ddce_cdd60f04","updated":"2023-04-25 05:17:24.000000000","message":"Done","commit_id":"42d7b35f91c7e45d684e02680938c95ae7f5e6a5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"80f803ab0f05f370cd89c2574135f8caa0a098a4","unresolved":true,"context_lines":[{"line_number":377,"context_line":"                \"Timeout talking to memcached.\""},{"line_number":378,"context_line":"            ) if timeout_occurred else MemcacheConnectionError("},{"line_number":379,"context_line":"                \"No memcached connections succeeded.\""},{"line_number":380,"context_line":"            )"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    @memcached_timing_stats(sample_rate\u003dTIMING_SAMPLE_RATE_MEDIUM)"},{"line_number":383,"context_line":"    def get(self, key, raise_on_error\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3384d195_d2e21802","line":380,"updated":"2023-04-24 15:09:16.000000000","message":"hmmm, we\u0027re losing info because we only raise on exception when multiple exceptions may have occurred. \n\nHow about capturing all the exceptions and enclosing them in the MemcacheConnectionError?\n\n```\n            errors \u003d []\n      \n            ...\n\n            except (Exception, Timeout) as e:\n                self._exception_occurred(\n                    server, e, key_prefix, sock\u003dsock, fp\u003dfp)\n                errors.append(e)\n        if raise_on_error:\n            raise MemcacheConnectionError(\n                \"No memcached connections succeeded.\",\n                errors\u003derrors\n            )\n```\n\nthen in the decorator, iterate over errors, test the error type and emit a timeout or error timing stat as appropriate","commit_id":"42d7b35f91c7e45d684e02680938c95ae7f5e6a5"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"ebe4074e17bdbb853b671b8ce15e9f6217935f9a","unresolved":true,"context_lines":[{"line_number":377,"context_line":"                \"Timeout talking to memcached.\""},{"line_number":378,"context_line":"            ) if timeout_occurred else MemcacheConnectionError("},{"line_number":379,"context_line":"                \"No memcached connections succeeded.\""},{"line_number":380,"context_line":"            )"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    @memcached_timing_stats(sample_rate\u003dTIMING_SAMPLE_RATE_MEDIUM)"},{"line_number":383,"context_line":"    def get(self, key, raise_on_error\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":6,"id":"b87e1985_89ce5ad9","line":380,"in_reply_to":"3384d195_d2e21802","updated":"2023-04-25 05:17:24.000000000","message":"will that make those exceptions (like MemcacheTimeoutError) less visible to upper layers? if someone omits common/utils/__init__.py, he won\u0027t notice it emits MemcacheTimeoutError under the hood. I am still not used to python exception conventions though.","commit_id":"42d7b35f91c7e45d684e02680938c95ae7f5e6a5"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"ae848cc6373df60d4415511c49f46286028a05d8","unresolved":false,"context_lines":[{"line_number":377,"context_line":"                \"Timeout talking to memcached.\""},{"line_number":378,"context_line":"            ) if timeout_occurred else MemcacheConnectionError("},{"line_number":379,"context_line":"                \"No memcached connections succeeded.\""},{"line_number":380,"context_line":"            )"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    @memcached_timing_stats(sample_rate\u003dTIMING_SAMPLE_RATE_MEDIUM)"},{"line_number":383,"context_line":"    def get(self, key, raise_on_error\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":6,"id":"cc39ec96_87503503","line":380,"in_reply_to":"b87e1985_89ce5ad9","updated":"2023-04-25 22:08:46.000000000","message":"moved exceptions metrics to _exception_occurred, per offline discussion.","commit_id":"42d7b35f91c7e45d684e02680938c95ae7f5e6a5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":48,"context_line":"import six"},{"line_number":49,"context_line":"import json"},{"line_number":50,"context_line":"import logging"},{"line_number":51,"context_line":"import time as tm"},{"line_number":52,"context_line":"from bisect import bisect"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"from eventlet.green import socket, ssl"}],"source_content_type":"text/x-python","patch_set":9,"id":"d1d5e953_15277714","line":51,"updated":"2023-04-26 14:28:58.000000000","message":"I don\u0027t see the need for this - we have time.time() throughout the codebase and I think it would be helpful to remain consistent","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":48,"context_line":"import six"},{"line_number":49,"context_line":"import json"},{"line_number":50,"context_line":"import logging"},{"line_number":51,"context_line":"import time as tm"},{"line_number":52,"context_line":"from bisect import bisect"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"from eventlet.green import socket, ssl"}],"source_content_type":"text/x-python","patch_set":9,"id":"532dc50c_dcbc7811","line":51,"in_reply_to":"d1d5e953_15277714","updated":"2023-04-27 05:51:02.000000000","message":"Memcached client APIs have “time” input parameter, which would cause traceback when we call time.time() within those functions. I don\u0027t want to change function signature which could break some other part of services. As discuss, I will add a comment.","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class MemcacheConnectionError(Exception):"},{"line_number":132,"context_line":"    pass"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"class MemcacheConnPool(Pool):"}],"source_content_type":"text/x-python","patch_set":9,"id":"2d548e93_c2fb2be6","line":132,"updated":"2023-04-26 14:28:58.000000000","message":"unnecessary change?","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class MemcacheConnectionError(Exception):"},{"line_number":132,"context_line":"    pass"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"class MemcacheConnPool(Pool):"}],"source_content_type":"text/x-python","patch_set":9,"id":"fb1a230f_be7dd487","line":132,"in_reply_to":"2d548e93_c2fb2be6","updated":"2023-04-27 05:51:02.000000000","message":"Ack","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":233,"context_line":"                \"config_timeout %(config_timeout)s, time_spent %(time_spent)s\","},{"line_number":234,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server,"},{"line_number":235,"context_line":"                 \u0027key_prefix\u0027: key_prefix, \u0027method\u0027: method,"},{"line_number":236,"context_line":"                 \u0027config_timeout\u0027: self._io_timeout,"},{"line_number":237,"context_line":"                 \u0027time_spent\u0027: tm.time() - conn_start_time})"},{"line_number":238,"context_line":"            self.logger.timing_since("},{"line_number":239,"context_line":"                \u0027memcached.\u0027 + method + \u0027.timeout.timing\u0027, conn_start_time)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7f8e66a4_bd941f44","line":236,"range":{"start_line":236,"start_character":35,"end_line":236,"end_character":51},"updated":"2023-04-26 14:28:58.000000000","message":"_get_conns may catch a Timeout from MemcacheConnPool.get() which uses self._connect_timeout\n\nBut the Timeout (and therefore also MemcachePoolTimeout) instance has a seconds attribute which can be used here to get the correct value for the timeout at has been raise.","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":233,"context_line":"                \"config_timeout %(config_timeout)s, time_spent %(time_spent)s\","},{"line_number":234,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server,"},{"line_number":235,"context_line":"                 \u0027key_prefix\u0027: key_prefix, \u0027method\u0027: method,"},{"line_number":236,"context_line":"                 \u0027config_timeout\u0027: self._io_timeout,"},{"line_number":237,"context_line":"                 \u0027time_spent\u0027: tm.time() - conn_start_time})"},{"line_number":238,"context_line":"            self.logger.timing_since("},{"line_number":239,"context_line":"                \u0027memcached.\u0027 + method + \u0027.timeout.timing\u0027, conn_start_time)"}],"source_content_type":"text/x-python","patch_set":9,"id":"cd84fdb1_00957be0","line":236,"range":{"start_line":236,"start_character":35,"end_line":236,"end_character":51},"in_reply_to":"7f8e66a4_bd941f44","updated":"2023-04-27 05:51:02.000000000","message":"good point!","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":244,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server, \u0027err\u0027: e,"},{"line_number":245,"context_line":"                 \u0027key_prefix\u0027: key_prefix})"},{"line_number":246,"context_line":"            self.logger.timing_since("},{"line_number":247,"context_line":"                \u0027memcached.\u0027 + method + \u0027.conn_err.timing\u0027, conn_start_time)"},{"line_number":248,"context_line":"        else:"},{"line_number":249,"context_line":"            self.logger.exception(\"Error %(action)s to memcached: %(server)s\""},{"line_number":250,"context_line":"                                  \": with key_prefix %(key_prefix)s\","}],"source_content_type":"text/x-python","patch_set":9,"id":"481074f6_3ac083f2","line":247,"updated":"2023-04-26 14:28:58.000000000","message":"is this case covered in tests?","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server, \u0027err\u0027: e,"},{"line_number":245,"context_line":"                 \u0027key_prefix\u0027: key_prefix})"},{"line_number":246,"context_line":"            self.logger.timing_since("},{"line_number":247,"context_line":"                \u0027memcached.\u0027 + method + \u0027.conn_err.timing\u0027, conn_start_time)"},{"line_number":248,"context_line":"        else:"},{"line_number":249,"context_line":"            self.logger.exception(\"Error %(action)s to memcached: %(server)s\""},{"line_number":250,"context_line":"                                  \": with key_prefix %(key_prefix)s\","}],"source_content_type":"text/x-python","patch_set":9,"id":"f69c4821_002ea046","line":247,"in_reply_to":"481074f6_3ac083f2","updated":"2023-04-27 05:51:02.000000000","message":"Done","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":287,"context_line":"        Retrieves a server conn from the pool, or connects a new one."},{"line_number":288,"context_line":"        Chooses the server based on a consistent hash of \"key\"."},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        :param key_prefix: the prefix of user provided key."},{"line_number":291,"context_line":"        :param hash_key: the consistent hash of user key, or server key for"},{"line_number":292,"context_line":"                         set_multi and get_multi."},{"line_number":293,"context_line":"        :return: generator to serve memcached connection"}],"source_content_type":"text/x-python","patch_set":9,"id":"21ac71fc_70c49d9d","line":290,"updated":"2023-04-26 14:28:58.000000000","message":"docstring needs the method param","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        Retrieves a server conn from the pool, or connects a new one."},{"line_number":288,"context_line":"        Chooses the server based on a consistent hash of \"key\"."},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        :param key_prefix: the prefix of user provided key."},{"line_number":291,"context_line":"        :param hash_key: the consistent hash of user key, or server key for"},{"line_number":292,"context_line":"                         set_multi and get_multi."},{"line_number":293,"context_line":"        :return: generator to serve memcached connection"}],"source_content_type":"text/x-python","patch_set":9,"id":"a7a36cda_0b3648d6","line":290,"in_reply_to":"21ac71fc_70c49d9d","updated":"2023-04-27 05:51:02.000000000","message":"Done","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":460,"context_line":"            command \u003d b\u0027decr\u0027"},{"line_number":461,"context_line":"        delta \u003d str(abs(int(delta))).encode(\u0027ascii\u0027)"},{"line_number":462,"context_line":"        timeout \u003d sanitize_timeout(time)"},{"line_number":463,"context_line":"        method \u003d \u0027incr\u0027 if command \u003d\u003d b\u0027incr\u0027 else \u0027decr\u0027"},{"line_number":464,"context_line":"        for (server, fp, sock) in self._get_conns(method, key_prefix,"},{"line_number":465,"context_line":"                                                  hash_key):"},{"line_number":466,"context_line":"            conn_start_time \u003d tm.time()"}],"source_content_type":"text/x-python","patch_set":9,"id":"473e9715_a5fbb570","line":463,"updated":"2023-04-26 14:28:58.000000000","message":"simpler: method \u003d command.decode()\n\nor\n\ncommand \u003d \u0027incr\u0027 and then command.encode(\u0027ascii\u0027) in the 2 places it is passed to sendall, then there is no need for a method var (I find method vs command a little confusing)","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":460,"context_line":"            command \u003d b\u0027decr\u0027"},{"line_number":461,"context_line":"        delta \u003d str(abs(int(delta))).encode(\u0027ascii\u0027)"},{"line_number":462,"context_line":"        timeout \u003d sanitize_timeout(time)"},{"line_number":463,"context_line":"        method \u003d \u0027incr\u0027 if command \u003d\u003d b\u0027incr\u0027 else \u0027decr\u0027"},{"line_number":464,"context_line":"        for (server, fp, sock) in self._get_conns(method, key_prefix,"},{"line_number":465,"context_line":"                                                  hash_key):"},{"line_number":466,"context_line":"            conn_start_time \u003d tm.time()"}],"source_content_type":"text/x-python","patch_set":9,"id":"b8ccd86a_41e55f3c","line":463,"in_reply_to":"473e9715_a5fbb570","updated":"2023-04-27 05:51:02.000000000","message":"Done","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":498,"context_line":"                    server, e, key_prefix, method, conn_start_time,"},{"line_number":499,"context_line":"                    sock\u003dsock, fp\u003dfp)"},{"line_number":500,"context_line":"        raise MemcacheConnectionError("},{"line_number":501,"context_line":"            \"No memcached connections succeeded.\")"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"    @memcached_timing_stats(sample_rate\u003dTIMING_SAMPLE_RATE_LOW)"},{"line_number":504,"context_line":"    def decr(self, key, delta\u003d1, time\u003d0):"}],"source_content_type":"text/x-python","patch_set":9,"id":"a70b041b_fad13bfe","line":501,"updated":"2023-04-26 14:28:58.000000000","message":"is the newline needed, looks like length is the same?","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":498,"context_line":"                    server, e, key_prefix, method, conn_start_time,"},{"line_number":499,"context_line":"                    sock\u003dsock, fp\u003dfp)"},{"line_number":500,"context_line":"        raise MemcacheConnectionError("},{"line_number":501,"context_line":"            \"No memcached connections succeeded.\")"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"    @memcached_timing_stats(sample_rate\u003dTIMING_SAMPLE_RATE_LOW)"},{"line_number":504,"context_line":"    def decr(self, key, delta\u003d1, time\u003d0):"}],"source_content_type":"text/x-python","patch_set":9,"id":"85673796_b3cb9936","line":501,"in_reply_to":"a70b041b_fad13bfe","updated":"2023-04-27 05:51:02.000000000","message":"Ack","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"141d493a0b4bfe8bcca685996745464d7f3b8e2e","unresolved":true,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        for (server, fp, sock) in self._get_conns(\u0027set\u0027, key_prefix, hash_key):"},{"line_number":365,"context_line":"            # the name of \u0027time\u0027 module is changed to \u0027tm\u0027, to avoid change the"},{"line_number":366,"context_line":"            # signature of this function."},{"line_number":367,"context_line":"            conn_start_time \u003d tm.time()"},{"line_number":368,"context_line":"            try:"},{"line_number":369,"context_line":"                with Timeout(self._io_timeout):"}],"source_content_type":"text/x-python","patch_set":10,"id":"c0314b1d_5a8f75d3","line":366,"updated":"2023-04-27 11:19:22.000000000","message":"+1\n\nnit: might be helpful to move this to the actual import statement line 51, which is where future us are likely to scratch our heads 😊","commit_id":"4fe4b3c0dabf1477f8d267ff5736d2c4dde499bd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"74cf31d0850afa65b67d49a9230b78bf28eba1f6","unresolved":false,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        for (server, fp, sock) in self._get_conns(\u0027set\u0027, key_prefix, hash_key):"},{"line_number":365,"context_line":"            # the name of \u0027time\u0027 module is changed to \u0027tm\u0027, to avoid change the"},{"line_number":366,"context_line":"            # signature of this function."},{"line_number":367,"context_line":"            conn_start_time \u003d tm.time()"},{"line_number":368,"context_line":"            try:"},{"line_number":369,"context_line":"                with Timeout(self._io_timeout):"}],"source_content_type":"text/x-python","patch_set":10,"id":"b161848d_cc96072d","line":366,"in_reply_to":"c0314b1d_5a8f75d3","updated":"2023-05-10 20:28:25.000000000","message":"Done","commit_id":"4fe4b3c0dabf1477f8d267ff5736d2c4dde499bd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a967e90b53896a978b7f3d52da791deef01da46e","unresolved":true,"context_lines":[{"line_number":242,"context_line":"                \"Error %(action)s to memcached: %(server)s: \""},{"line_number":243,"context_line":"                \"with key_prefix %(key_prefix)s: %(err)s\","},{"line_number":244,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server, \u0027err\u0027: e,"},{"line_number":245,"context_line":"                 \u0027key_prefix\u0027: key_prefix})"},{"line_number":246,"context_line":"            self.logger.timing_since("},{"line_number":247,"context_line":"                \u0027memcached.\u0027 + method + \u0027.conn_err.timing\u0027, conn_start_time)"},{"line_number":248,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"d24fb52a_d01f76d5","line":245,"updated":"2023-05-09 18:37:15.000000000","message":"@JianJian what do you think about also logging time_spent and method here? see https://review.opendev.org/c/openstack/swift/+/882740/1?usp\u003drelated-change","commit_id":"4d19482b9c25ee3f4a8399210273740f884b2ce6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"676975c19c8c1d0bf49d46c0dfab499c2d14b67c","unresolved":true,"context_lines":[{"line_number":242,"context_line":"                \"Error %(action)s to memcached: %(server)s: \""},{"line_number":243,"context_line":"                \"with key_prefix %(key_prefix)s: %(err)s\","},{"line_number":244,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server, \u0027err\u0027: e,"},{"line_number":245,"context_line":"                 \u0027key_prefix\u0027: key_prefix})"},{"line_number":246,"context_line":"            self.logger.timing_since("},{"line_number":247,"context_line":"                \u0027memcached.\u0027 + method + \u0027.conn_err.timing\u0027, conn_start_time)"},{"line_number":248,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9df626ba_edbddd75","line":245,"in_reply_to":"9a53fb39_89e7c860","updated":"2023-05-10 09:24:34.000000000","message":"shall I squash https://review.opendev.org/c/openstack/swift/+/882740/1?usp\u003drelated-change into this patch?","commit_id":"4d19482b9c25ee3f4a8399210273740f884b2ce6"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"74cf31d0850afa65b67d49a9230b78bf28eba1f6","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                \"Error %(action)s to memcached: %(server)s: \""},{"line_number":243,"context_line":"                \"with key_prefix %(key_prefix)s: %(err)s\","},{"line_number":244,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server, \u0027err\u0027: e,"},{"line_number":245,"context_line":"                 \u0027key_prefix\u0027: key_prefix})"},{"line_number":246,"context_line":"            self.logger.timing_since("},{"line_number":247,"context_line":"                \u0027memcached.\u0027 + method + \u0027.conn_err.timing\u0027, conn_start_time)"},{"line_number":248,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"08e1ef8d_2ecd8a83","line":245,"in_reply_to":"9df626ba_edbddd75","updated":"2023-05-10 20:28:25.000000000","message":"Done","commit_id":"4d19482b9c25ee3f4a8399210273740f884b2ce6"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"22d02207287cc3af6e851b2601f0c74d3e3841c4","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                \"Error %(action)s to memcached: %(server)s: \""},{"line_number":243,"context_line":"                \"with key_prefix %(key_prefix)s: %(err)s\","},{"line_number":244,"context_line":"                {\u0027action\u0027: action, \u0027server\u0027: server, \u0027err\u0027: e,"},{"line_number":245,"context_line":"                 \u0027key_prefix\u0027: key_prefix})"},{"line_number":246,"context_line":"            self.logger.timing_since("},{"line_number":247,"context_line":"                \u0027memcached.\u0027 + method + \u0027.conn_err.timing\u0027, conn_start_time)"},{"line_number":248,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a53fb39_89e7c860","line":245,"in_reply_to":"d24fb52a_d01f76d5","updated":"2023-05-09 23:02:39.000000000","message":"yes, it\u0027s good to have them here too.","commit_id":"4d19482b9c25ee3f4a8399210273740f884b2ce6"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"2a25a89b943c0373ab75750716d3eaff47520105","unresolved":true,"context_lines":[{"line_number":1394,"context_line":"                #   Timeouts and Exceptions, but we might want to separate the"},{"line_number":1395,"context_line":"                #   two for timing stats (timeouts are slow by design)"},{"line_number":1396,"context_line":"                cache.logger.timing_since("},{"line_number":1397,"context_line":"                    \u0027memcached.\u0027 + method + \u0027.errors.timing\u0027,"},{"line_number":1398,"context_line":"                    start_time, **dec_kwargs)"},{"line_number":1399,"context_line":"                raise"},{"line_number":1400,"context_line":"            cache.logger.timing_since(\u0027memcached.\u0027 + method + \u0027.timing\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"71ef273b_30b9959e","line":1397,"updated":"2023-04-17 22:24:06.000000000","message":"new timing metrics on errors is great, yes, that\u0027ll be even better timeouts and connection errors can have their own metrics.","commit_id":"4db3bd29d04ef7bc7726a464872b8a60f9999417"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"b16f3e265bcf80b25c55f827f268dc05f51c5970","unresolved":false,"context_lines":[{"line_number":1394,"context_line":"                #   Timeouts and Exceptions, but we might want to separate the"},{"line_number":1395,"context_line":"                #   two for timing stats (timeouts are slow by design)"},{"line_number":1396,"context_line":"                cache.logger.timing_since("},{"line_number":1397,"context_line":"                    \u0027memcached.\u0027 + method + \u0027.errors.timing\u0027,"},{"line_number":1398,"context_line":"                    start_time, **dec_kwargs)"},{"line_number":1399,"context_line":"                raise"},{"line_number":1400,"context_line":"            cache.logger.timing_since(\u0027memcached.\u0027 + method + \u0027.timing\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"c00df77b_2062ee81","line":1397,"in_reply_to":"71ef273b_30b9959e","updated":"2023-04-21 23:40:16.000000000","message":"Ack","commit_id":"4db3bd29d04ef7bc7726a464872b8a60f9999417"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"80f803ab0f05f370cd89c2574135f8caa0a098a4","unresolved":true,"context_lines":[{"line_number":1389,"context_line":"            start_time \u003d time.time()"},{"line_number":1390,"context_line":"            try:"},{"line_number":1391,"context_line":"                result \u003d func(cache, *args, **kwargs)"},{"line_number":1392,"context_line":"            except swift.common.exceptions.MemcacheTimeoutError as err:  # noqa"},{"line_number":1393,"context_line":"                cache.logger.timing_since("},{"line_number":1394,"context_line":"                    \u0027memcached.\u0027 + method + \u0027.timeout.timing\u0027,"},{"line_number":1395,"context_line":"                    start_time, **dec_kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3223416f_e16914a0","line":1392,"updated":"2023-04-24 15:09:16.000000000","message":"following on from my comment in memcached.py, here there could be:\n\n```\nexcept MemcacheConnectionError as err:\n    for e in err.errors:\n        category \u003d \u0027timeout\u0027 if isinstance(e, Timeout) else \u0027error\u0027\n        cache.logger.timing_since(\n            \u0027.\u0027.join([\u0027memcached\u0027, method, category, \u0027timing\u0027]),\n            start_time, **dec_kwargs)\n    raise\n...\n```","commit_id":"42d7b35f91c7e45d684e02680938c95ae7f5e6a5"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"ae848cc6373df60d4415511c49f46286028a05d8","unresolved":false,"context_lines":[{"line_number":1389,"context_line":"            start_time \u003d time.time()"},{"line_number":1390,"context_line":"            try:"},{"line_number":1391,"context_line":"                result \u003d func(cache, *args, **kwargs)"},{"line_number":1392,"context_line":"            except swift.common.exceptions.MemcacheTimeoutError as err:  # noqa"},{"line_number":1393,"context_line":"                cache.logger.timing_since("},{"line_number":1394,"context_line":"                    \u0027memcached.\u0027 + method + \u0027.timeout.timing\u0027,"},{"line_number":1395,"context_line":"                    start_time, **dec_kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"666c371f_6f4205da","line":1392,"in_reply_to":"3223416f_e16914a0","updated":"2023-04-25 22:08:46.000000000","message":"moved exceptions metrics to _exception_occurred, per offline discussion.","commit_id":"42d7b35f91c7e45d684e02680938c95ae7f5e6a5"}],"test/unit/common/test_memcached.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":984,"context_line":""},{"line_number":985,"context_line":"        self.assertEqual(pending[\u00271.2.3.5\u0027], 8)"},{"line_number":986,"context_line":"        self.assertEqual(len(memcache_client._errors[\u00271.2.3.5:11211\u0027]), 8)"},{"line_number":987,"context_line":"        error_logs \u003d self.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":988,"context_line":"        for each_log in error_logs:"},{"line_number":989,"context_line":"            self.assertIn("},{"line_number":990,"context_line":"                \u0027Timeout getting a connection to memcached: 1.2.3.5:11211: \u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"8260b8e8_5e9c0e30","line":987,"updated":"2023-04-26 14:28:58.000000000","message":"self.assertTrue(error_logs) to be sure the \u0027for each_log...\u0027 actually iterates over a non-empty list\n\nor self.assertEqual( number, len(error_logs)","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":984,"context_line":""},{"line_number":985,"context_line":"        self.assertEqual(pending[\u00271.2.3.5\u0027], 8)"},{"line_number":986,"context_line":"        self.assertEqual(len(memcache_client._errors[\u00271.2.3.5:11211\u0027]), 8)"},{"line_number":987,"context_line":"        error_logs \u003d self.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":988,"context_line":"        for each_log in error_logs:"},{"line_number":989,"context_line":"            self.assertIn("},{"line_number":990,"context_line":"                \u0027Timeout getting a connection to memcached: 1.2.3.5:11211: \u0027"}],"source_content_type":"text/x-python","patch_set":9,"id":"91e7c624_f85f9907","line":987,"in_reply_to":"8260b8e8_5e9c0e30","updated":"2023-04-27 05:51:02.000000000","message":"Ack","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":1135,"context_line":"            self.assertEqual(\u0027memcached.delete.timing\u0027, last_stats[0][0])"},{"line_number":1136,"context_line":"            self.assertEqual(last_stats[0][1], 7000.99)"},{"line_number":1137,"context_line":""},{"line_number":1138,"context_line":"    def test_operations_timing_stats_with_exceptions(self):"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"},{"line_number":1141,"context_line":"                                                 logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":9,"id":"71ce28ec_a1be1c86","line":1138,"updated":"2023-04-26 14:28:58.000000000","message":"nit: could be two separate tests - there is very little setup code before the two cases","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"            self.assertEqual(\u0027memcached.delete.timing\u0027, last_stats[0][0])"},{"line_number":1136,"context_line":"            self.assertEqual(last_stats[0][1], 7000.99)"},{"line_number":1137,"context_line":""},{"line_number":1138,"context_line":"    def test_operations_timing_stats_with_exceptions(self):"},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"},{"line_number":1141,"context_line":"                                                 logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":9,"id":"338099de_93a69b1d","line":1138,"in_reply_to":"71ce28ec_a1be1c86","updated":"2023-04-27 05:51:02.000000000","message":"Done","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":1164,"context_line":"        with patch(\u0027time.time\u0027, ) as mock_time:"},{"line_number":1165,"context_line":"            with mock.patch.object(mock_memcache, \u0027handle_set\u0027, handle_set):"},{"line_number":1166,"context_line":"                mock_time.return_value \u003d 4000.99"},{"line_number":1167,"context_line":"                with self.assertRaises(MemcacheConnectionError):"},{"line_number":1168,"context_line":"                    memcache_client.set("},{"line_number":1169,"context_line":"                        \u0027set_key\u0027, [1, 2, 3],"},{"line_number":1170,"context_line":"                        raise_on_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"dae806af_2a503c3f","line":1167,"updated":"2023-04-26 14:28:58.000000000","message":"the test passes but I see\n\n```\ntest ERROR: Error talking to memcached: 1.2.3.4:11211: with key_prefix set_key: \nTraceback (most recent call last):\n  File \"/Users/acoles/0dev/openstack/swift/swift/common/memcached.py\", line 367, in set\n    sock.sendall(set_msg(hash_key, flags, timeout, value))\n  File \"/Users/acoles/0dev/openstack/swift/test/unit/common/test_memcached.py\", line 109, in sendall\n    raise ValueError(\u0027Unhandled command: %s\u0027 % parts[0])\nValueError: Unhandled command: 5\n```\n\nwhich I think is because the mock handle_add method does not drain the sendall buf - maybe a reason to split into two test cases?","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":1164,"context_line":"        with patch(\u0027time.time\u0027, ) as mock_time:"},{"line_number":1165,"context_line":"            with mock.patch.object(mock_memcache, \u0027handle_set\u0027, handle_set):"},{"line_number":1166,"context_line":"                mock_time.return_value \u003d 4000.99"},{"line_number":1167,"context_line":"                with self.assertRaises(MemcacheConnectionError):"},{"line_number":1168,"context_line":"                    memcache_client.set("},{"line_number":1169,"context_line":"                        \u0027set_key\u0027, [1, 2, 3],"},{"line_number":1170,"context_line":"                        raise_on_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"8eb20cf8_6597681d","line":1167,"in_reply_to":"dae806af_2a503c3f","updated":"2023-04-27 05:51:02.000000000","message":"Done","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":1172,"context_line":"                last_stats \u003d self.logger.log_dict[\u0027timing_since\u0027][-1]"},{"line_number":1173,"context_line":"                self.assertEqual(\u0027memcached.set.errors.timing\u0027,"},{"line_number":1174,"context_line":"                                 last_stats[0][0])"},{"line_number":1175,"context_line":"                self.assertEqual(last_stats[0][1], 4000.99)"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":"    def test_operations_timing_stats_with_incr_timeout(self):"},{"line_number":1178,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"6b7a276f_c89becc9","line":1175,"updated":"2023-04-26 14:28:58.000000000","message":"this test could also have the assertions for log message, similar to the next test","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":1172,"context_line":"                last_stats \u003d self.logger.log_dict[\u0027timing_since\u0027][-1]"},{"line_number":1173,"context_line":"                self.assertEqual(\u0027memcached.set.errors.timing\u0027,"},{"line_number":1174,"context_line":"                                 last_stats[0][0])"},{"line_number":1175,"context_line":"                self.assertEqual(last_stats[0][1], 4000.99)"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":"    def test_operations_timing_stats_with_incr_timeout(self):"},{"line_number":1178,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"411aa8b0_67de428b","line":1175,"in_reply_to":"6b7a276f_c89becc9","updated":"2023-04-27 05:51:02.000000000","message":"Done","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":1184,"context_line":"            [(mock_memcache, mock_memcache)] * 2)"},{"line_number":1185,"context_line":""},{"line_number":1186,"context_line":"        def handle_add(key, flags, exptime, num_bytes, noreply\u003db\u0027\u0027):"},{"line_number":1187,"context_line":"            sleep(2.0)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":"        with mock.patch.object(mock_memcache, \u0027handle_add\u0027, handle_add):"},{"line_number":1190,"context_line":"            with self.assertRaises(MemcacheConnectionError):"}],"source_content_type":"text/x-python","patch_set":9,"id":"1504e38e_9dd52b36","line":1187,"range":{"start_line":1187,"start_character":18,"end_line":1187,"end_character":21},"updated":"2023-04-26 14:28:58.000000000","message":"I\u0027d suggest using shorter timeout (0.05) and sleep (0.1) to make the tests quicker","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":1184,"context_line":"            [(mock_memcache, mock_memcache)] * 2)"},{"line_number":1185,"context_line":""},{"line_number":1186,"context_line":"        def handle_add(key, flags, exptime, num_bytes, noreply\u003db\u0027\u0027):"},{"line_number":1187,"context_line":"            sleep(2.0)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":"        with mock.patch.object(mock_memcache, \u0027handle_add\u0027, handle_add):"},{"line_number":1190,"context_line":"            with self.assertRaises(MemcacheConnectionError):"}],"source_content_type":"text/x-python","patch_set":9,"id":"eee7f31b_c2b8b4e1","line":1187,"range":{"start_line":1187,"start_character":18,"end_line":1187,"end_character":21},"in_reply_to":"1504e38e_9dd52b36","updated":"2023-04-27 05:51:02.000000000","message":"Done","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":1193,"context_line":"            last_stats \u003d self.logger.log_dict[\u0027timing_since\u0027][-1]"},{"line_number":1194,"context_line":"            self.assertEqual(\u0027memcached.incr.timeout.timing\u0027,"},{"line_number":1195,"context_line":"                             last_stats[0][0])"},{"line_number":1196,"context_line":"            error_logs \u003d self.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":1197,"context_line":"            self.assertIn(\u0027Timeout talking to memcached: 1.2.3.4:11211: \u0027,"},{"line_number":1198,"context_line":"                          error_logs[0])"},{"line_number":1199,"context_line":"            self.assertIn(\u0027with key_prefix nvratelimit/v2/wf, \u0027, error_logs[0])"}],"source_content_type":"text/x-python","patch_set":9,"id":"399bcd37_ed5599e4","line":1196,"updated":"2023-04-26 14:28:58.000000000","message":"this test doesn\u0027t assert the value of the stat (like the previous test did)","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":1193,"context_line":"            last_stats \u003d self.logger.log_dict[\u0027timing_since\u0027][-1]"},{"line_number":1194,"context_line":"            self.assertEqual(\u0027memcached.incr.timeout.timing\u0027,"},{"line_number":1195,"context_line":"                             last_stats[0][0])"},{"line_number":1196,"context_line":"            error_logs \u003d self.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":1197,"context_line":"            self.assertIn(\u0027Timeout talking to memcached: 1.2.3.4:11211: \u0027,"},{"line_number":1198,"context_line":"                          error_logs[0])"},{"line_number":1199,"context_line":"            self.assertIn(\u0027with key_prefix nvratelimit/v2/wf, \u0027, error_logs[0])"}],"source_content_type":"text/x-python","patch_set":9,"id":"5ddaac59_01fbeeb9","line":1196,"in_reply_to":"399bcd37_ed5599e4","updated":"2023-04-27 05:51:02.000000000","message":"Done","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":1200,"context_line":"            self.assertIn(\u0027method incr, \u0027, error_logs[0])"},{"line_number":1201,"context_line":"            self.assertIn(\u0027config_timeout 0.5, time_spent \u0027, error_logs[0])"},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"    def test_operations_timing_stats_with_set_timeout(self):"},{"line_number":1204,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"},{"line_number":1205,"context_line":"                                                 io_timeout\u003d0.5,"},{"line_number":1206,"context_line":"                                                 logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":9,"id":"df2ffa92_fd08a850","line":1203,"updated":"2023-04-26 14:28:58.000000000","message":"same comments re times and stat value assertion","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":1200,"context_line":"            self.assertIn(\u0027method incr, \u0027, error_logs[0])"},{"line_number":1201,"context_line":"            self.assertIn(\u0027config_timeout 0.5, time_spent \u0027, error_logs[0])"},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"    def test_operations_timing_stats_with_set_timeout(self):"},{"line_number":1204,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"},{"line_number":1205,"context_line":"                                                 io_timeout\u003d0.5,"},{"line_number":1206,"context_line":"                                                 logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":9,"id":"c9e10d87_1f9db85e","line":1203,"in_reply_to":"df2ffa92_fd08a850","updated":"2023-04-27 05:51:02.000000000","message":"Done","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":1227,"context_line":"            self.assertIn("},{"line_number":1228,"context_line":"                \u0027with key_prefix shard-updating-v2/acc, \u0027, error_logs[0])"},{"line_number":1229,"context_line":"            self.assertIn(\u0027method set, \u0027, error_logs[0])"},{"line_number":1230,"context_line":"            self.assertIn(\u0027config_timeout 0.5, time_spent \u0027, error_logs[0])"},{"line_number":1231,"context_line":""},{"line_number":1232,"context_line":"    def test_operations_timing_stats_with_get_timeout(self):"},{"line_number":1233,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ca862b6_731fa49f","line":1230,"updated":"2023-04-26 14:28:58.000000000","message":"ok!\n\n  PASSED [100%]test ERROR: Timeout talking to memcached: 1.2.3.4:11211: with key_prefix shard-updating-v2/acc, method set, config_timeout 0.5, time_spent 0.5050690174102783","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"            self.assertIn("},{"line_number":1228,"context_line":"                \u0027with key_prefix shard-updating-v2/acc, \u0027, error_logs[0])"},{"line_number":1229,"context_line":"            self.assertIn(\u0027method set, \u0027, error_logs[0])"},{"line_number":1230,"context_line":"            self.assertIn(\u0027config_timeout 0.5, time_spent \u0027, error_logs[0])"},{"line_number":1231,"context_line":""},{"line_number":1232,"context_line":"    def test_operations_timing_stats_with_get_timeout(self):"},{"line_number":1233,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"1eda7849_3fa534f8","line":1230,"in_reply_to":"1ca862b6_731fa49f","updated":"2023-04-27 05:51:02.000000000","message":"Ack","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":1229,"context_line":"            self.assertIn(\u0027method set, \u0027, error_logs[0])"},{"line_number":1230,"context_line":"            self.assertIn(\u0027config_timeout 0.5, time_spent \u0027, error_logs[0])"},{"line_number":1231,"context_line":""},{"line_number":1232,"context_line":"    def test_operations_timing_stats_with_get_timeout(self):"},{"line_number":1233,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"},{"line_number":1234,"context_line":"                                                 io_timeout\u003d0.5,"},{"line_number":1235,"context_line":"                                                 logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":9,"id":"e652506e_84ce0803","line":1232,"updated":"2023-04-26 14:28:58.000000000","message":"same comments re times and stat value assertion","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"            self.assertIn(\u0027method set, \u0027, error_logs[0])"},{"line_number":1230,"context_line":"            self.assertIn(\u0027config_timeout 0.5, time_spent \u0027, error_logs[0])"},{"line_number":1231,"context_line":""},{"line_number":1232,"context_line":"    def test_operations_timing_stats_with_get_timeout(self):"},{"line_number":1233,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"},{"line_number":1234,"context_line":"                                                 io_timeout\u003d0.5,"},{"line_number":1235,"context_line":"                                                 logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fe8ca858_1911b176","line":1232,"in_reply_to":"e652506e_84ce0803","updated":"2023-04-27 05:51:02.000000000","message":"Ack","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07fec925d777c1d878aa60fe3d9640ccf93ddca1","unresolved":true,"context_lines":[{"line_number":1255,"context_line":"            self.assertIn("},{"line_number":1256,"context_line":"                \u0027with key_prefix shard-updating-v2/acc, \u0027, error_logs[0])"},{"line_number":1257,"context_line":"            self.assertIn(\u0027method get, \u0027, error_logs[0])"},{"line_number":1258,"context_line":"            self.assertIn(\u0027config_timeout 0.5, time_spent \u0027, error_logs[0])"},{"line_number":1259,"context_line":""},{"line_number":1260,"context_line":""},{"line_number":1261,"context_line":"class ExcConfigParser(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"6047ec0d_3f42fb80","line":1258,"updated":"2023-04-26 14:28:58.000000000","message":"great tests! but I don\u0027t see the \u0027conn_err\u0027 case covered","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"5c07a8315781e6c343eeb8ac655e6a01657b7597","unresolved":false,"context_lines":[{"line_number":1255,"context_line":"            self.assertIn("},{"line_number":1256,"context_line":"                \u0027with key_prefix shard-updating-v2/acc, \u0027, error_logs[0])"},{"line_number":1257,"context_line":"            self.assertIn(\u0027method get, \u0027, error_logs[0])"},{"line_number":1258,"context_line":"            self.assertIn(\u0027config_timeout 0.5, time_spent \u0027, error_logs[0])"},{"line_number":1259,"context_line":""},{"line_number":1260,"context_line":""},{"line_number":1261,"context_line":"class ExcConfigParser(object):"}],"source_content_type":"text/x-python","patch_set":9,"id":"5e16eac0_5ae8e198","line":1258,"in_reply_to":"6047ec0d_3f42fb80","updated":"2023-04-27 05:51:02.000000000","message":"Ack","commit_id":"bdcd5e53618610141dca2e4d6691d5544d2386f1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"141d493a0b4bfe8bcca685996745464d7f3b8e2e","unresolved":true,"context_lines":[{"line_number":1252,"context_line":""},{"line_number":1253,"context_line":"        with patch(\u0027time.time\u0027, ) as mock_time:"},{"line_number":1254,"context_line":"            with mock.patch.object(mock_memcache, \u0027handle_add\u0027, handle_add):"},{"line_number":1255,"context_line":"                mock_time.return_value \u003d 4000.99"},{"line_number":1256,"context_line":"                with self.assertRaises(MemcacheConnectionError):"},{"line_number":1257,"context_line":"                    memcache_client.incr(\u0027nvratelimit/v2/wf/124593\u0027, delta\u003d5)"},{"line_number":1258,"context_line":"                self.assertTrue(self.logger.log_dict[\u0027timing_since\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"b67ac63c_7990f274","line":1255,"updated":"2023-04-27 11:19:22.000000000","message":"side_effect can be used to return a sequence of values...","commit_id":"4fe4b3c0dabf1477f8d267ff5736d2c4dde499bd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"bd4823dbf2143b1144427fa9f96701e256c1f9aa","unresolved":false,"context_lines":[{"line_number":1252,"context_line":""},{"line_number":1253,"context_line":"        with patch(\u0027time.time\u0027, ) as mock_time:"},{"line_number":1254,"context_line":"            with mock.patch.object(mock_memcache, \u0027handle_add\u0027, handle_add):"},{"line_number":1255,"context_line":"                mock_time.return_value \u003d 4000.99"},{"line_number":1256,"context_line":"                with self.assertRaises(MemcacheConnectionError):"},{"line_number":1257,"context_line":"                    memcache_client.incr(\u0027nvratelimit/v2/wf/124593\u0027, delta\u003d5)"},{"line_number":1258,"context_line":"                self.assertTrue(self.logger.log_dict[\u0027timing_since\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ad4c90e_14b8a68f","line":1255,"in_reply_to":"b67ac63c_7990f274","updated":"2023-04-27 21:52:02.000000000","message":"Thanks for the improvement, itertools is cool!","commit_id":"4fe4b3c0dabf1477f8d267ff5736d2c4dde499bd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"141d493a0b4bfe8bcca685996745464d7f3b8e2e","unresolved":true,"context_lines":[{"line_number":1267,"context_line":"                    \u0027with key_prefix nvratelimit/v2/wf, \u0027, error_logs[0])"},{"line_number":1268,"context_line":"                self.assertIn(\u0027method incr, \u0027, error_logs[0])"},{"line_number":1269,"context_line":"                self.assertIn("},{"line_number":1270,"context_line":"                    \u0027config_timeout 0.01, time_spent \u0027, error_logs[0])"},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"    def test_operations_timing_stats_with_set_timeout(self):"},{"line_number":1273,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"f1f927e0_6e745c72","line":1270,"range":{"start_line":1270,"start_character":52,"end_line":1270,"end_character":53},"updated":"2023-04-27 11:19:22.000000000","message":"...and then assert a value for time_spent","commit_id":"4fe4b3c0dabf1477f8d267ff5736d2c4dde499bd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"bd4823dbf2143b1144427fa9f96701e256c1f9aa","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"                    \u0027with key_prefix nvratelimit/v2/wf, \u0027, error_logs[0])"},{"line_number":1268,"context_line":"                self.assertIn(\u0027method incr, \u0027, error_logs[0])"},{"line_number":1269,"context_line":"                self.assertIn("},{"line_number":1270,"context_line":"                    \u0027config_timeout 0.01, time_spent \u0027, error_logs[0])"},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"    def test_operations_timing_stats_with_set_timeout(self):"},{"line_number":1273,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"5388098e_40dadedc","line":1270,"range":{"start_line":1270,"start_character":52,"end_line":1270,"end_character":53},"in_reply_to":"f1f927e0_6e745c72","updated":"2023-04-27 21:52:02.000000000","message":"Ack","commit_id":"4fe4b3c0dabf1477f8d267ff5736d2c4dde499bd"}]}
