)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":18784,"name":"Michael Carden","email":"mike.carden@gmail.com","username":"mcarden"},"change_message_id":"885bdcc601c66b28bfd09a42fb9b4c153082af36","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Fix memcached exception out of range stacktrace"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When a memecached server goes offline in the middle of a"},{"line_number":10,"context_line":"MemcahceRing (swift memcache client) session then a request"},{"line_number":11,"context_line":"to memcached returns nothing and the client inside swift"},{"line_number":12,"context_line":"leaves an \"IndexError: list index out of range\" stacktrace."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5a74a57a_7efa8144","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":12},"updated":"2016-11-28 04:48:46.000000000","message":"nit: MemcacheRing","commit_id":"88e4eed3bb967c0fbed89d4c064a2b6d3676556e"}],"swift/common/memcached.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3694714b3c6ef410a88cdf9c5cdc472eb2aa429b","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                    sock.sendall(\u0027%s %s %s\\r\\n\u0027 % (command, key, delta))"},{"line_number":333,"context_line":"                    line \u003d fp.readline().strip().split()"},{"line_number":334,"context_line":"                    if not line:"},{"line_number":335,"context_line":"                        break"},{"line_number":336,"context_line":"                    if line[0].upper() \u003d\u003d \u0027NOT_FOUND\u0027:"},{"line_number":337,"context_line":"                        add_val \u003d delta"},{"line_number":338,"context_line":"                        if command \u003d\u003d \u0027decr\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_d9f5ad58","line":335,"range":{"start_line":335,"start_character":24,"end_line":335,"end_character":29},"updated":"2017-04-28 22:22:59.000000000","message":"break, or continue? Should we try another conn if available?","commit_id":"88e4eed3bb967c0fbed89d4c064a2b6d3676556e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4307e90cd05e656be4757a8608f84f8fe7c88f34","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                    sock.sendall(\u0027%s %s %s\\r\\n\u0027 % (command, key, delta))"},{"line_number":333,"context_line":"                    line \u003d fp.readline().strip().split()"},{"line_number":334,"context_line":"                    if not line:"},{"line_number":335,"context_line":"                        break"},{"line_number":336,"context_line":"                    if line[0].upper() \u003d\u003d \u0027NOT_FOUND\u0027:"},{"line_number":337,"context_line":"                        add_val \u003d delta"},{"line_number":338,"context_line":"                        if command \u003d\u003d \u0027decr\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7f287b81_f0ef0ae7","line":335,"range":{"start_line":335,"start_character":24,"end_line":335,"end_character":29},"in_reply_to":"5ff73747_d9f5ad58","updated":"2017-08-22 20:06:07.000000000","message":"Or really, to match the others,\n\n raise MemcacheConnectionError()\n\nso we log about it.","commit_id":"88e4eed3bb967c0fbed89d4c064a2b6d3676556e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb742767932e08fc74e43409d71881c033b58a1","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                          {\u0027action\u0027: action, \u0027server\u0027: server})"},{"line_number":167,"context_line":"        elif isinstance(e, socket.error):"},{"line_number":168,"context_line":"            logging.error(\"Error %(action)s to memcached: %(server)s: %(err)s\","},{"line_number":169,"context_line":"                          {\u0027action\u0027: action, \u0027server\u0027: server, \u0027err\u0027: e})"},{"line_number":170,"context_line":"        else:"},{"line_number":171,"context_line":"            logging.exception(\"Error %(action)s to memcached: %(server)s\","},{"line_number":172,"context_line":"                              {\u0027action\u0027: action, \u0027server\u0027: server})"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_f0c254e9","line":169,"updated":"2017-09-22 18:31:59.000000000","message":"do we need to add a case here to log at error level for the specific exception?","commit_id":"92b9a1133200c452adf0982485b2d50937cc60a5"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6207cbd38136234b7df0bd254b02eb4e9f69d5f7","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                          {\u0027action\u0027: action, \u0027server\u0027: server})"},{"line_number":167,"context_line":"        elif isinstance(e, socket.error):"},{"line_number":168,"context_line":"            logging.error(\"Error %(action)s to memcached: %(server)s: %(err)s\","},{"line_number":169,"context_line":"                          {\u0027action\u0027: action, \u0027server\u0027: server, \u0027err\u0027: e})"},{"line_number":170,"context_line":"        else:"},{"line_number":171,"context_line":"            logging.exception(\"Error %(action)s to memcached: %(server)s\","},{"line_number":172,"context_line":"                              {\u0027action\u0027: action, \u0027server\u0027: server})"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_f13ea427","line":169,"in_reply_to":"7f515b1d_4404c617","updated":"2017-09-26 01:16:54.000000000","message":"Done","commit_id":"92b9a1133200c452adf0982485b2d50937cc60a5"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a59af0d379465ce1a37ee5da4ff723076ccfad04","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                          {\u0027action\u0027: action, \u0027server\u0027: server})"},{"line_number":167,"context_line":"        elif isinstance(e, socket.error):"},{"line_number":168,"context_line":"            logging.error(\"Error %(action)s to memcached: %(server)s: %(err)s\","},{"line_number":169,"context_line":"                          {\u0027action\u0027: action, \u0027server\u0027: server, \u0027err\u0027: e})"},{"line_number":170,"context_line":"        else:"},{"line_number":171,"context_line":"            logging.exception(\"Error %(action)s to memcached: %(server)s\","},{"line_number":172,"context_line":"                              {\u0027action\u0027: action, \u0027server\u0027: server})"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_4404c617","line":169,"in_reply_to":"7f515b1d_f0c254e9","updated":"2017-09-25 20:42:53.000000000","message":"Yup. And since we\u0027re using plain old logging, it has to be here, not in LogAdapter.exception (see https://github.com/openstack/swift/blob/2.15.1/swift/common/utils.py#L1735-L1759)","commit_id":"92b9a1133200c452adf0982485b2d50937cc60a5"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6207cbd38136234b7df0bd254b02eb4e9f69d5f7","unresolved":false,"context_lines":[{"line_number":355,"context_line":"                    return ret"},{"line_number":356,"context_line":"            except (Exception, Timeout) as e:"},{"line_number":357,"context_line":"                self._exception_occurred(server, e, sock\u003dsock, fp\u003dfp)"},{"line_number":358,"context_line":"        raise MemcacheConnectionError(\"No Memcached connections succeeded.\")"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"    def decr(self, key, delta\u003d1, time\u003d0):"},{"line_number":361,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_714cf49d","line":358,"updated":"2017-09-26 01:16:54.000000000","message":"We should probably have more catch-alls like this :-/\n\nBut I\u0027m gonna punt on it for now.","commit_id":"92b9a1133200c452adf0982485b2d50937cc60a5"}],"test/unit/common/test_memcached.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb742767932e08fc74e43409d71881c033b58a1","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        # trace if there is one raised."},{"line_number":360,"context_line":"        logger \u003d debug_logger()"},{"line_number":361,"context_line":"        with patch(\"sys.stdout\", fake_stdout),\\"},{"line_number":362,"context_line":"                patch(\u0027logging.exception\u0027, logger.exception),\\"},{"line_number":363,"context_line":"                patch(\u0027logging.error\u0027, logger.error):"},{"line_number":364,"context_line":"            mock.read_return_empty_str \u003d True"},{"line_number":365,"context_line":"            self.assertEqual(memcache_client.get(\u0027some_key\u0027), None)"},{"line_number":366,"context_line":"            self.assertFalse(not_expected in fake_stdout.getvalue())"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_f099341f","line":363,"range":{"start_line":362,"start_character":17,"end_line":363,"end_character":53},"updated":"2017-09-22 18:31:59.000000000","message":"this isn\u0027t patching the logging in memcached - that would need patch(\u0027swift.common.memcached.logging.exception\u0027, logger.exception)\n\nbut I\u0027m not sure it is necessary anyway?","commit_id":"92b9a1133200c452adf0982485b2d50937cc60a5"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6207cbd38136234b7df0bd254b02eb4e9f69d5f7","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        # trace if there is one raised."},{"line_number":360,"context_line":"        logger \u003d debug_logger()"},{"line_number":361,"context_line":"        with patch(\"sys.stdout\", fake_stdout),\\"},{"line_number":362,"context_line":"                patch(\u0027logging.exception\u0027, logger.exception),\\"},{"line_number":363,"context_line":"                patch(\u0027logging.error\u0027, logger.error):"},{"line_number":364,"context_line":"            mock.read_return_empty_str \u003d True"},{"line_number":365,"context_line":"            self.assertEqual(memcache_client.get(\u0027some_key\u0027), None)"},{"line_number":366,"context_line":"            self.assertFalse(not_expected in fake_stdout.getvalue())"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_b176ec05","line":363,"range":{"start_line":362,"start_character":17,"end_line":363,"end_character":53},"in_reply_to":"7f515b1d_f099341f","updated":"2017-09-26 01:16:54.000000000","message":"Sure it is, it\u0027s just *also* patching logging.exception everywhere else, too. We\u0027d run into trouble if we started using something like\n\n from logging import exception\n\nin memcached.py, though.","commit_id":"92b9a1133200c452adf0982485b2d50937cc60a5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb742767932e08fc74e43409d71881c033b58a1","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                patch(\u0027logging.error\u0027, logger.error):"},{"line_number":364,"context_line":"            mock.read_return_empty_str \u003d True"},{"line_number":365,"context_line":"            self.assertEqual(memcache_client.get(\u0027some_key\u0027), None)"},{"line_number":366,"context_line":"            self.assertFalse(not_expected in fake_stdout.getvalue())"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    def test_incr(self):"},{"line_number":369,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_708544ad","line":366,"range":{"start_line":366,"start_character":13,"end_line":366,"end_character":68},"updated":"2017-09-22 18:31:59.000000000","message":"ok that\u0027s good but we still have a traceback in the logs\n\n  self.assertIn(\u0027Traceback\u0027, fake_stdout.getvalue())\n\nand I\u0027m not sure whether the goal was to not have a traceback but just have a log error? or to just have a traceback that is less generic?","commit_id":"92b9a1133200c452adf0982485b2d50937cc60a5"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6207cbd38136234b7df0bd254b02eb4e9f69d5f7","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                patch(\u0027logging.error\u0027, logger.error):"},{"line_number":364,"context_line":"            mock.read_return_empty_str \u003d True"},{"line_number":365,"context_line":"            self.assertEqual(memcache_client.get(\u0027some_key\u0027), None)"},{"line_number":366,"context_line":"            self.assertFalse(not_expected in fake_stdout.getvalue())"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    def test_incr(self):"},{"line_number":369,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_71c75414","line":366,"range":{"start_line":366,"start_character":13,"end_line":366,"end_character":68},"in_reply_to":"7f515b1d_708544ad","updated":"2017-09-26 01:16:54.000000000","message":"...otherwise your assertIn wouldn\u0027t work, right?","commit_id":"92b9a1133200c452adf0982485b2d50937cc60a5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e65e4d1177bcb5af7dc938308bbcedd2ea0f8400","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                patch(\u0027logging.error\u0027, logger.error):"},{"line_number":364,"context_line":"            mock.read_return_empty_str \u003d True"},{"line_number":365,"context_line":"            self.assertEqual(memcache_client.get(\u0027some_key\u0027), None)"},{"line_number":366,"context_line":"            self.assertFalse(not_expected in fake_stdout.getvalue())"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    def test_incr(self):"},{"line_number":369,"context_line":"        memcache_client \u003d memcached.MemcacheRing([\u00271.2.3.4:11211\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f515b1d_61ead40f","line":366,"range":{"start_line":366,"start_character":13,"end_line":366,"end_character":68},"in_reply_to":"7f515b1d_71c75414","updated":"2017-09-26 10:48:18.000000000","message":"it seems to, and logger.get_log_lines_for_level(\u0027error\u0027) is empty","commit_id":"92b9a1133200c452adf0982485b2d50937cc60a5"}]}
