)]}'
{"swift/proxy/controllers/obj.py":[{"author":{"_account_id":15932,"name":"Bill Huber","email":"wbhuber@us.ibm.com","username":"wbhuber"},"change_message_id":"eb02e685ae6895528860c5da6ff8f3fbae7bcf90","unresolved":false,"context_lines":[{"line_number":990,"context_line":"            self.app.logger.increment(\u0027client_disconnects\u0027)"},{"line_number":991,"context_line":"            raise HTTPClientDisconnect(request\u003dreq)"},{"line_number":992,"context_line":"        except (Exception, Timeout):"},{"line_number":993,"context_line":"            self.app.logger.exception("},{"line_number":994,"context_line":"                _(\u0027ERROR Exception causing client disconnect\u0027))"},{"line_number":995,"context_line":"            raise HTTPClientDisconnect(request\u003dreq)"},{"line_number":996,"context_line":"        if req.content_length and bytes_transferred \u003c req.content_length:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_54bc7305","line":993,"updated":"2015-10-16 16:46:00.000000000","message":"Same as below. \n\nShould we change HTTPClientDisconnect to HTTPInternalServerError to depict 500 instead of 499? We might need to split several classes under Timeout and/or Exception to clearly distinguish one from the other to identify the error better.","commit_id":"8163482bcdaa3848325ec2f581996815cb05b4dd"},{"author":{"_account_id":15932,"name":"Bill Huber","email":"wbhuber@us.ibm.com","username":"wbhuber"},"change_message_id":"eb02e685ae6895528860c5da6ff8f3fbae7bcf90","unresolved":false,"context_lines":[{"line_number":2282,"context_line":"            raise"},{"line_number":2283,"context_line":"        except (Exception, Timeout):"},{"line_number":2284,"context_line":"            self.app.logger.exception("},{"line_number":2285,"context_line":"                _(\u0027ERROR Exception causing client disconnect\u0027))"},{"line_number":2286,"context_line":"            raise HTTPClientDisconnect(request\u003dreq)"},{"line_number":2287,"context_line":""},{"line_number":2288,"context_line":"    def _have_adequate_responses("}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_748baf68","line":2285,"updated":"2015-10-16 16:46:00.000000000","message":"Should we change HTTPClientDisconnect to HTTPInternalServerError to depict 500 instead of 499?  We might need to split several classes under Timeout and/or Exception to clearly distinguish one from the other to identify the error better.","commit_id":"8163482bcdaa3848325ec2f581996815cb05b4dd"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"42696479b20908e4ee2f56528d5a334c6d58061e","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            raise HTTPRequestTimeout(request\u003dreq)"},{"line_number":984,"context_line":"        except HTTPException:"},{"line_number":985,"context_line":"            raise"},{"line_number":986,"context_line":"        except (ChunkReadError, Timeout):"},{"line_number":987,"context_line":"            req.client_disconnect \u003d True"},{"line_number":988,"context_line":"            self.app.logger.warn("},{"line_number":989,"context_line":"                _(\u0027Client disconnected without sending last chunk\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a29b11f_d29348f9","line":986,"updated":"2015-10-19 12:59:22.000000000","message":"Not sure but this Timeout except sequence might not be needed anymore. It seems that we have enough handles for both ChunkReadTimeout and ChunkWriteTimeout, I might be missing any other place which might raise a Timeout exception tho.","commit_id":"1ea7783b2796b7fab92458511090659a2e590e53"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"56b6fbd2e71cc885a3e31a4c5418016114d174e3","unresolved":false,"context_lines":[{"line_number":991,"context_line":"            raise HTTPClientDisconnect(request\u003dreq)"},{"line_number":992,"context_line":"        except (Exception, Timeout):"},{"line_number":993,"context_line":"            self.app.logger.exception("},{"line_number":994,"context_line":"                _(\u0027ERROR Exception causing client disconnect\u0027))"},{"line_number":995,"context_line":"            raise HTTPClientDisconnect(request\u003dreq)"},{"line_number":996,"context_line":"        if req.content_length and bytes_transferred \u003c req.content_length:"},{"line_number":997,"context_line":"            req.client_disconnect \u003d True"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa80f949_0c1452f3","side":"PARENT","line":994,"updated":"2015-11-03 21:26:23.000000000","message":"does this exception message still make sense if we\u0027re not handling Timeout?","commit_id":"b59868f3533533897095779f224698ae4068c622"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"56b6fbd2e71cc885a3e31a4c5418016114d174e3","unresolved":false,"context_lines":[{"line_number":2280,"context_line":"            raise HTTPClientDisconnect(request\u003dreq)"},{"line_number":2281,"context_line":"        except HTTPException:"},{"line_number":2282,"context_line":"            raise"},{"line_number":2283,"context_line":"        except Exception:"},{"line_number":2284,"context_line":"            self.app.logger.exception("},{"line_number":2285,"context_line":"                _(\u0027ERROR Exception causing client disconnect\u0027))"},{"line_number":2286,"context_line":"            raise HTTPInternalServerError(request\u003dreq)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa80f949_6c6cfe9c","line":2283,"updated":"2015-11-03 21:26:23.000000000","message":"I\u0027m pretty scared of letting those Timeouts bleed out...","commit_id":"8583cc039c541ac7857398cd87e7233e59dced48"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"f1ddb8d1161ea4e98cf112ee00a104f10d7f5873","unresolved":false,"context_lines":[{"line_number":990,"context_line":"            self.app.logger.increment(\u0027client_disconnects\u0027)"},{"line_number":991,"context_line":"            raise HTTPClientDisconnect(request\u003dreq)"},{"line_number":992,"context_line":"        except (Exception, Timeout):"},{"line_number":993,"context_line":"            self.logger.exception("},{"line_number":994,"context_line":"                _(\u0027ERROR _transfer_data error with %(method)s\u0027"},{"line_number":995,"context_line":"                  \u0027 %(path)s \u0027), {\u0027method\u0027: req.method,"},{"line_number":996,"context_line":"                                  \u0027path\u0027: req.path})"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa80f949_bd54e8fe","line":993,"updated":"2015-11-06 07:30:44.000000000","message":"we should use \"self.app.logger\" instead of self.logger because ObjectController doesn\u0027t have a logger attribute. This will cause a no attribute error. (I know that is 500, too)","commit_id":"7c82f655ff5bc37d170446ff5c0ed986309b759e"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"f1ddb8d1161ea4e98cf112ee00a104f10d7f5873","unresolved":false,"context_lines":[{"line_number":2283,"context_line":"        except HTTPException:"},{"line_number":2284,"context_line":"            raise"},{"line_number":2285,"context_line":"        except (Exception, Timeout):"},{"line_number":2286,"context_line":"            self.logger.exception("},{"line_number":2287,"context_line":"                _(\u0027ERROR _transfer_data error with %(method)s\u0027"},{"line_number":2288,"context_line":"                  \u0027 %(path)s \u0027), {\u0027method\u0027: req.method,"},{"line_number":2289,"context_line":"                                  \u0027path\u0027: req.path})"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa80f949_3d41d838","line":2286,"updated":"2015-11-06 07:30:44.000000000","message":"same as above.","commit_id":"7c82f655ff5bc37d170446ff5c0ed986309b759e"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"92528e45d072ef0c359504b0a606402adf654050","unresolved":false,"context_lines":[{"line_number":995,"context_line":"            raise HTTPClientDisconnect(request\u003dreq)"},{"line_number":996,"context_line":"        except Exception:"},{"line_number":997,"context_line":"            self.app.logger.exception("},{"line_number":998,"context_line":"                _(\u0027ERROR _transfer_data error with %(method)s\u0027"},{"line_number":999,"context_line":"                  \u0027 %(path)s \u0027), {\u0027method\u0027: req.method,"},{"line_number":1000,"context_line":"                                  \u0027path\u0027: req.path})"},{"line_number":1001,"context_line":"            raise HTTPInternalServerError(request\u003dreq)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_13b86ac7","line":998,"updated":"2015-11-06 17:28:42.000000000","message":"might be just a nit, but I\u0027m not a big fan of using _transfer_data in the log. This is an internal method name, not sure it would be very useful to ops","commit_id":"834293ca0a8e8ee001983823473ad0243f9f7f0d"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":15932,"name":"Bill Huber","email":"wbhuber@us.ibm.com","username":"wbhuber"},"change_message_id":"7994573e518decc1c37556d21295e22ebf7e6667","unresolved":false,"context_lines":[{"line_number":627,"context_line":"                resp \u003d req.get_response(self.app)"},{"line_number":628,"context_line":"        except exceptions.ChunkReadError:"},{"line_number":629,"context_line":"            pass"},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"        self.assertEqual(resp.status_int, 499)"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"    def test_PUT_timeout_during_transfer_data(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_74672fb7","line":630,"updated":"2015-10-16 16:49:25.000000000","message":"Evidently, deciding which errors belong to for ChunkReadError and else would alter the return code from 499 to one we as a group determine the best.","commit_id":"8163482bcdaa3848325ec2f581996815cb05b4dd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"79833c1935344f0cc21a9f12885c3c7028e1453b","unresolved":false,"context_lines":[{"line_number":627,"context_line":"                resp \u003d req.get_response(self.app)"},{"line_number":628,"context_line":"        except exceptions.ChunkReadError:"},{"line_number":629,"context_line":"            pass"},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"        self.assertEqual(resp.status_int, 499)"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"    def test_PUT_timeout_during_transfer_data(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_a7ecae2a","line":630,"in_reply_to":"5a2ca52d_74672fb7","updated":"2015-10-16 20:46:07.000000000","message":"yeah I think if we raised a ValueError or KeyError indicating some sort of application level error it\u0027d be nice to give the client a 500","commit_id":"8163482bcdaa3848325ec2f581996815cb05b4dd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"79833c1935344f0cc21a9f12885c3c7028e1453b","unresolved":false,"context_lines":[{"line_number":633,"context_line":"    def test_PUT_timeout_during_transfer_data(self):"},{"line_number":634,"context_line":"        class FakeReader():"},{"line_number":635,"context_line":"            def read(self, size):"},{"line_number":636,"context_line":"                raise exceptions.ChunkReadTimeout(60)"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"        req \u003d swob.Request.blank(\u0027/v1/a/c/o.jpg\u0027, method\u003d\u0027PUT\u0027,"},{"line_number":639,"context_line":"                                 body\u003d\u0027test body\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_47aefae6","line":636,"updated":"2015-10-16 20:46:07.000000000","message":"I\u0027ve learned to become dubious of creating instances of eventlet.Timeout with non-None values in unittests.  They tend to run the risk of getting fired later!","commit_id":"8163482bcdaa3848325ec2f581996815cb05b4dd"},{"author":{"_account_id":15932,"name":"Bill Huber","email":"wbhuber@us.ibm.com","username":"wbhuber"},"change_message_id":"7994573e518decc1c37556d21295e22ebf7e6667","unresolved":false,"context_lines":[{"line_number":1301,"context_line":"        with set_http_connect(*codes, expect_headers\u003dexpect_headers):"},{"line_number":1302,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1303,"context_line":"        self.assertEqual(resp.status_int, 201)"},{"line_number":1304,"context_line":""},{"line_number":1305,"context_line":"    def test_PUT_ec_error_during_transfer_data(self):"},{"line_number":1306,"context_line":"        class FakeReader():"},{"line_number":1307,"context_line":"            def read(self, size):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_34c1b754","line":1304,"updated":"2015-10-16 16:49:25.000000000","message":"Seems the mixin class above isn\u0027t designed to hit both _trasnfer_data methods in separate controllers to test the same output/results.","commit_id":"8163482bcdaa3848325ec2f581996815cb05b4dd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"79833c1935344f0cc21a9f12885c3c7028e1453b","unresolved":false,"context_lines":[{"line_number":1301,"context_line":"        with set_http_connect(*codes, expect_headers\u003dexpect_headers):"},{"line_number":1302,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1303,"context_line":"        self.assertEqual(resp.status_int, 201)"},{"line_number":1304,"context_line":""},{"line_number":1305,"context_line":"    def test_PUT_ec_error_during_transfer_data(self):"},{"line_number":1306,"context_line":"        class FakeReader():"},{"line_number":1307,"context_line":"            def read(self, size):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a2ca52d_e76146d4","line":1304,"in_reply_to":"5a2ca52d_34c1b754","updated":"2015-10-16 20:46:07.000000000","message":"are you sure this test doesn\u0027t work on the replicated - using self.replicas() seems generic enough.  But having two tests is fine as well.","commit_id":"8163482bcdaa3848325ec2f581996815cb05b4dd"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"42696479b20908e4ee2f56528d5a334c6d58061e","unresolved":false,"context_lines":[{"line_number":622,"context_line":""},{"line_number":623,"context_line":"        req.environ[\u0027wsgi.input\u0027] \u003d FakeReader()"},{"line_number":624,"context_line":"        req.headers[\u0027content-length\u0027] \u003d \u00276\u0027"},{"line_number":625,"context_line":"        try:"},{"line_number":626,"context_line":"            with set_http_connect(201, 201, 201):"},{"line_number":627,"context_line":"                resp \u003d req.get_response(self.app)"},{"line_number":628,"context_line":"        except exceptions.ChunkReadError:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a29b11f_a78d3033","line":625,"updated":"2015-10-19 12:59:22.000000000","message":"we don\u0027t have to use try/except in these unit tests because the proxy server app absolutely hide the error and translate to the error into a HTTP response code (e.g. 499)","commit_id":"1ea7783b2796b7fab92458511090659a2e590e53"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"92528e45d072ef0c359504b0a606402adf654050","unresolved":false,"context_lines":[{"line_number":655,"context_line":"        with set_http_connect(201, 201, 201):"},{"line_number":656,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"        self.assertEqual(resp.status_int, 500)"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    def test_GET_simple(self):"},{"line_number":661,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027/v1/a/c/o\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa80f949_13f06a66","line":658,"updated":"2015-11-06 17:28:42.000000000","message":"I see tests for ChunkReadError, ChunkReadTimeout and Exception, but not for Timeout, is that else where? what about for EC, only ChunkReadError is needed?","commit_id":"834293ca0a8e8ee001983823473ad0243f9f7f0d"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"11268c2636c848bfc33c5448f60dcbc486355bd3","unresolved":false,"context_lines":[{"line_number":660,"context_line":"    def test_PUT_exception_during_transfer_data(self):"},{"line_number":661,"context_line":"        class FakeReader(object):"},{"line_number":662,"context_line":"            def read(self, size):"},{"line_number":663,"context_line":"                raise Exception"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"        req \u003d swob.Request.blank(\u0027/v1/a/c/o.jpg\u0027, method\u003d\u0027PUT\u0027,"},{"line_number":666,"context_line":"                                 body\u003d\u0027test body\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_b1715c78","line":663,"updated":"2015-11-11 15:41:54.000000000","message":"I\u0027ll fix to instantiate the Exception.","commit_id":"66dc1eebb1db51c81891b1f7bcc3e85aef9b8c1d"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"ced46a6365fc46aed5fc5d26183dfa65e21d1dc9","unresolved":false,"context_lines":[{"line_number":3593,"context_line":"                    self.sent \u003d 0"},{"line_number":3594,"context_line":""},{"line_number":3595,"context_line":"                def read(self, size\u003d-1):"},{"line_number":3596,"context_line":"                    return \u0027\u0027"},{"line_number":3597,"context_line":""},{"line_number":3598,"context_line":"            req \u003d Request.blank(\u0027/v1/a/c/o\u0027,"},{"line_number":3599,"context_line":"                                environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a29b11f_35944a41","line":3596,"updated":"2015-10-22 06:48:55.000000000","message":"I guess this is a right thing because I confirmed closing socket form client side causes StopIteration with my patch. [1]\n\n1: https://review.openstack.org/#/c/238379/","commit_id":"8583cc039c541ac7857398cd87e7233e59dced48"}]}
