)]}'
{"swift/common/middleware/proxy_logging.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e2297709b4ab6a64a995cb6057203f7218674e9a","unresolved":false,"context_lines":[{"line_number":353,"context_line":"            # log disconnected clients as \u0027499\u0027 status code"},{"line_number":354,"context_line":"            if client_disconnect or input_proxy.client_disconnect:"},{"line_number":355,"context_line":"                ret_status_int \u003d 499"},{"line_number":356,"context_line":"            elif start_status is None:"},{"line_number":357,"context_line":"                ret_status_int \u003d int("},{"line_number":358,"context_line":"                    start_response_args[0][0].split(\u0027 \u0027, 1)[0])"},{"line_number":359,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_cffcfa3f","side":"PARENT","line":356,"updated":"2020-05-19 21:18:48.000000000","message":"I guess I don\u0027t understand when start_status is NOT None","commit_id":"70dede1ae9b714f0eed3804022b49517a562bdd6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8b48311cb39df791a966c195cf4f6b0a1471be64","unresolved":false,"context_lines":[{"line_number":353,"context_line":"            # log disconnected clients as \u0027499\u0027 status code"},{"line_number":354,"context_line":"            if client_disconnect or input_proxy.client_disconnect:"},{"line_number":355,"context_line":"                ret_status_int \u003d 499"},{"line_number":356,"context_line":"            elif start_status is None:"},{"line_number":357,"context_line":"                ret_status_int \u003d int("},{"line_number":358,"context_line":"                    start_response_args[0][0].split(\u0027 \u0027, 1)[0])"},{"line_number":359,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_63134567","side":"PARENT","line":356,"in_reply_to":"ff570b3c_cffcfa3f","updated":"2020-05-19 23:07:18.000000000","message":"Only spot I saw was in the exception handler. Seems poorly named.","commit_id":"70dede1ae9b714f0eed3804022b49517a562bdd6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e2297709b4ab6a64a995cb6057203f7218674e9a","unresolved":false,"context_lines":[{"line_number":356,"context_line":"            elif start_status is None:"},{"line_number":357,"context_line":"                status_line \u003d env.get(\u0027swift.status_for_logging\u0027,"},{"line_number":358,"context_line":"                                      start_response_args[0][0])"},{"line_number":359,"context_line":"                ret_status_int \u003d int(status_line.split(\u0027 \u0027, 1)[0])"},{"line_number":360,"context_line":"            else:"},{"line_number":361,"context_line":"                ret_status_int \u003d start_status"},{"line_number":362,"context_line":"            return ret_status_int"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_8f8b22c1","line":359,"updated":"2020-05-19 21:18:48.000000000","message":"was this parsing ultimately the reason we opted for the interface to be the string status line instead just the status_int","commit_id":"0fc9936b0aeba5047d74e04902d072489adf5631"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8b48311cb39df791a966c195cf4f6b0a1471be64","unresolved":false,"context_lines":[{"line_number":356,"context_line":"            elif start_status is None:"},{"line_number":357,"context_line":"                status_line \u003d env.get(\u0027swift.status_for_logging\u0027,"},{"line_number":358,"context_line":"                                      start_response_args[0][0])"},{"line_number":359,"context_line":"                ret_status_int \u003d int(status_line.split(\u0027 \u0027, 1)[0])"},{"line_number":360,"context_line":"            else:"},{"line_number":361,"context_line":"                ret_status_int \u003d start_status"},{"line_number":362,"context_line":"            return ret_status_int"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_43160157","line":359,"in_reply_to":"ff570b3c_8f8b22c1","updated":"2020-05-19 23:07:18.000000000","message":"Yeah, pretty much. I\u0027d be happy either way, though, w/e.","commit_id":"0fc9936b0aeba5047d74e04902d072489adf5631"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b5b46b74e63e67053b9b40ee1dafe7b1e1977f1","unresolved":false,"context_lines":[{"line_number":1381,"context_line":"        if status \u003d\u003d HTTP_SERVICE_UNAVAILABLE:"},{"line_number":1382,"context_line":"            raise ServiceUnavailable()"},{"line_number":1383,"context_line":"        if status in (HTTP_RATE_LIMITED, HTTP_TOO_MANY_REQUESTS):"},{"line_number":1384,"context_line":"            self.environ[\u0027swift.status_for_logging\u0027] \u003d resp.status"},{"line_number":1385,"context_line":"            raise SlowDown()"},{"line_number":1386,"context_line":""},{"line_number":1387,"context_line":"        raise InternalError(\u0027unexpected status code %d\u0027 % status)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_ec046f17","line":1384,"updated":"2020-05-19 17:19:50.000000000","message":"seems simple enough I suppose\n\ndoes this code ever actually see a 429?","commit_id":"0fc9936b0aeba5047d74e04902d072489adf5631"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"86d0fa072ac9dd78e33fd9b2d21fa1f4cc8e8980","unresolved":false,"context_lines":[{"line_number":1381,"context_line":"        if status \u003d\u003d HTTP_SERVICE_UNAVAILABLE:"},{"line_number":1382,"context_line":"            raise ServiceUnavailable()"},{"line_number":1383,"context_line":"        if status in (HTTP_RATE_LIMITED, HTTP_TOO_MANY_REQUESTS):"},{"line_number":1384,"context_line":"            self.environ[\u0027swift.status_for_logging\u0027] \u003d resp.status"},{"line_number":1385,"context_line":"            raise SlowDown()"},{"line_number":1386,"context_line":""},{"line_number":1387,"context_line":"        raise InternalError(\u0027unexpected status code %d\u0027 % status)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_cc47ebbb","line":1384,"in_reply_to":"ff570b3c_ec046f17","updated":"2020-05-19 17:55:26.000000000","message":"No, that was done just in case. FWIW, though, awscli *will* back-off and retry on a 429 but not a 498 -- it\u0027s probably not the only client like that. At some point we may want to make ratelimit configurable to be RFC-compliant, similar to what we did with ETags...","commit_id":"0fc9936b0aeba5047d74e04902d072489adf5631"}],"test/unit/common/middleware/s3api/test_bucket.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b5b46b74e63e67053b9b40ee1dafe7b1e1977f1","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        code \u003d elem.find(\u0027./Code\u0027).text"},{"line_number":199,"context_line":"        self.assertEqual(code, \u0027SlowDown\u0027)"},{"line_number":200,"context_line":"        self.assertEqual(req.environ.get(\u0027swift.status_for_logging\u0027),"},{"line_number":201,"context_line":"                         \u0027498 Rate Limited\u0027)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def test_bucket_GET(self):"},{"line_number":204,"context_line":"        bucket_name \u003d \u0027junk\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_cce52b3a","line":201,"updated":"2020-05-19 17:19:50.000000000","message":"so this is a pretty nice test - swift responds 498, s3api raises SlowDown and sets the status_for_logging","commit_id":"0fc9936b0aeba5047d74e04902d072489adf5631"}],"test/unit/common/middleware/test_proxy_logging.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b5b46b74e63e67053b9b40ee1dafe7b1e1977f1","unresolved":false,"context_lines":[{"line_number":338,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware(FakeApp(), {})"},{"line_number":339,"context_line":"        app.access_logger \u003d FakeLogger()"},{"line_number":340,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/\u0027, environ\u003d{"},{"line_number":341,"context_line":"            \u0027swift.status_for_logging\u0027: \u0027498 Rate Limited\u0027})"},{"line_number":342,"context_line":"        resp \u003d req.get_response(app)"},{"line_number":343,"context_line":"        b\u0027\u0027.join(resp.app_iter)"},{"line_number":344,"context_line":"        self.assertEqual(resp.status, \u0027200 OK\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_acb9d715","line":341,"updated":"2020-05-19 17:19:50.000000000","message":"the s3api test seems to also be setting this to the full status line and not just like a status_int sort of interface, but that\u0027s just my manual inspection.","commit_id":"0fc9936b0aeba5047d74e04902d072489adf5631"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b5b46b74e63e67053b9b40ee1dafe7b1e1977f1","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            \u0027swift.status_for_logging\u0027: \u0027498 Rate Limited\u0027})"},{"line_number":342,"context_line":"        resp \u003d req.get_response(app)"},{"line_number":343,"context_line":"        b\u0027\u0027.join(resp.app_iter)"},{"line_number":344,"context_line":"        self.assertEqual(resp.status, \u0027200 OK\u0027)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        log_parts \u003d self._log_parts(app)"},{"line_number":347,"context_line":"        self.assertEqual(log_parts[3], \u0027GET\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_ccb7eb39","line":344,"updated":"2020-05-19 17:19:50.000000000","message":"so this isn\u0027t testing the interaction of the new hook with s3api and the 503\u003d\u003e498 translation","commit_id":"0fc9936b0aeba5047d74e04902d072489adf5631"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e2297709b4ab6a64a995cb6057203f7218674e9a","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            \u0027swift.status_for_logging\u0027: \u0027498 Rate Limited\u0027})"},{"line_number":342,"context_line":"        resp \u003d req.get_response(app)"},{"line_number":343,"context_line":"        b\u0027\u0027.join(resp.app_iter)"},{"line_number":344,"context_line":"        self.assertEqual(resp.status, \u0027200 OK\u0027)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        log_parts \u003d self._log_parts(app)"},{"line_number":347,"context_line":"        self.assertEqual(log_parts[3], \u0027GET\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_123459fb","line":344,"in_reply_to":"ff570b3c_2c85c7cf","updated":"2020-05-19 21:18:48.000000000","message":"no I don\u0027t think that matters - if it\u0027s not an app wrapped with both s3api and ratelimiting it\u0027s not really giving us an integration test.\n\nAlthough I guess I would find it reasonable to produce such a unittest in a followup given that a functest seems problematic.","commit_id":"0fc9936b0aeba5047d74e04902d072489adf5631"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"86d0fa072ac9dd78e33fd9b2d21fa1f4cc8e8980","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            \u0027swift.status_for_logging\u0027: \u0027498 Rate Limited\u0027})"},{"line_number":342,"context_line":"        resp \u003d req.get_response(app)"},{"line_number":343,"context_line":"        b\u0027\u0027.join(resp.app_iter)"},{"line_number":344,"context_line":"        self.assertEqual(resp.status, \u0027200 OK\u0027)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"        log_parts \u003d self._log_parts(app)"},{"line_number":347,"context_line":"        self.assertEqual(log_parts[3], \u0027GET\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_2c85c7cf","line":344,"in_reply_to":"ff570b3c_ccb7eb39","updated":"2020-05-19 17:55:26.000000000","message":"Yeah, I was also lazy didn\u0027t hack up the FakeApp to be the one to set the override.","commit_id":"0fc9936b0aeba5047d74e04902d072489adf5631"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9b5b46b74e63e67053b9b40ee1dafe7b1e1977f1","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        self.assertEqual(log_parts[3], \u0027GET\u0027)"},{"line_number":348,"context_line":"        self.assertEqual(log_parts[4], \u0027/v1/a/c/\u0027)"},{"line_number":349,"context_line":"        self.assertEqual(log_parts[5], \u0027HTTP/1.0\u0027)"},{"line_number":350,"context_line":"        self.assertEqual(log_parts[6], \u0027498\u0027)"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        timing_calls \u003d app.access_logger.log_dict[\u0027timing\u0027]"},{"line_number":353,"context_line":"        self.assertEqual(sorted(timing_calls), ["}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_acb27747","line":350,"updated":"2020-05-19 17:19:50.000000000","message":"but the proxy logging hook itself is certainly being demonstrated to work as expected","commit_id":"0fc9936b0aeba5047d74e04902d072489adf5631"}]}
