)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f2bbc202d921b0f4d03984e39eeb36d88dd71aec","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-09-21 23:29:57 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix proxy hadling of EC client disconnect"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The ECObjectController was unconditionally sending down the frag archive"},{"line_number":10,"context_line":"commit document after the client source stream terminated - even if the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ba15a1d1_dcf24806","line":7,"updated":"2015-09-22 15:04:00.000000000","message":"s/hadling/handling/","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3154488ff1ca0439973ce110d664f198b72b428d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-09-21 23:29:57 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix proxy hadling of EC client disconnect"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The ECObjectController was unconditionally sending down the frag archive"},{"line_number":10,"context_line":"commit document after the client source stream terminated - even if the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ba15a1d1_f24ba157","line":7,"in_reply_to":"ba15a1d1_dcf24806","updated":"2015-09-22 16:42:03.000000000","message":"#willfix","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"67d9108c240d1156d616de883ebfc492e1678516","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-09-21 23:29:57 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix proxy hadling of EC client disconnect"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The ECObjectController was unconditionally sending down the frag archive"},{"line_number":10,"context_line":"commit document after the client source stream terminated - even if the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ba15a1d1_5757d801","line":7,"in_reply_to":"ba15a1d1_f24ba157","updated":"2015-09-22 19:19:14.000000000","message":"Done","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":15932,"name":"Bill Huber","email":"wbhuber@us.ibm.com","username":"wbhuber"},"change_message_id":"4d4f193473522abefb3dee82adf141a2333f0a60","unresolved":false,"context_lines":[{"line_number":2183,"context_line":""},{"line_number":2184,"context_line":"                if req.content_length and ("},{"line_number":2185,"context_line":"                        bytes_transferred \u003c req.content_length):"},{"line_number":2186,"context_line":"                    req.client_disconnect \u003d True"},{"line_number":2187,"context_line":"                    self.app.logger.warn("},{"line_number":2188,"context_line":"                        _(\u0027Client disconnected without sending enough data\u0027))"},{"line_number":2189,"context_line":"                    self.app.logger.increment(\u0027client_disconnects\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_e72a6c2f","line":2186,"updated":"2015-09-18 23:05:23.000000000","message":"How is this different from line 2244?  if the client ever disconnects, we would get ChunkReadTimeout or ChunkReadError exception.  Dup?","commit_id":"f4b2253f56acbe00c45492b7f73ea2501d5c0a09"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"62798417e0b358e40b7f116cf73611b1ec9d48a5","unresolved":false,"context_lines":[{"line_number":2183,"context_line":""},{"line_number":2184,"context_line":"                if req.content_length and ("},{"line_number":2185,"context_line":"                        bytes_transferred \u003c req.content_length):"},{"line_number":2186,"context_line":"                    req.client_disconnect \u003d True"},{"line_number":2187,"context_line":"                    self.app.logger.warn("},{"line_number":2188,"context_line":"                        _(\u0027Client disconnected without sending enough data\u0027))"},{"line_number":2189,"context_line":"                    self.app.logger.increment(\u0027client_disconnects\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_b730e99f","line":2186,"in_reply_to":"ba15a1d1_3ca04090","updated":"2015-09-21 19:20:51.000000000","message":"yeah, this case is actually covered by test.unit.proxy.test_server.TestObjectDisconnectCleanup.test_ec_disconnect_cleans_up\n\n... coming back to this change fresh after the weekend I think the tests are pretty good actually.","commit_id":"f4b2253f56acbe00c45492b7f73ea2501d5c0a09"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1759d651b6341944b3bc1ea456169a5b5aecce46","unresolved":false,"context_lines":[{"line_number":2183,"context_line":""},{"line_number":2184,"context_line":"                if req.content_length and ("},{"line_number":2185,"context_line":"                        bytes_transferred \u003c req.content_length):"},{"line_number":2186,"context_line":"                    req.client_disconnect \u003d True"},{"line_number":2187,"context_line":"                    self.app.logger.warn("},{"line_number":2188,"context_line":"                        _(\u0027Client disconnected without sending enough data\u0027))"},{"line_number":2189,"context_line":"                    self.app.logger.increment(\u0027client_disconnects\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_3ca04090","line":2186,"in_reply_to":"ba15a1d1_e72a6c2f","updated":"2015-09-21 19:06:43.000000000","message":"I think a content-length transfer that cleanly disconnects might end up looking like an empty string, which would shutdown the iteration but not raise ChunkReadError.  I\u0027ll try to test for this explicitly to be sure.\n\nThanks!","commit_id":"f4b2253f56acbe00c45492b7f73ea2501d5c0a09"},{"author":{"_account_id":15932,"name":"Bill Huber","email":"wbhuber@us.ibm.com","username":"wbhuber"},"change_message_id":"4d4f193473522abefb3dee82adf141a2333f0a60","unresolved":false,"context_lines":[{"line_number":2243,"context_line":"        except ChunkReadError:"},{"line_number":2244,"context_line":"            req.client_disconnect \u003d True"},{"line_number":2245,"context_line":"            self.app.logger.warn("},{"line_number":2246,"context_line":"                _(\u0027Client disconnected without sending last chunk\u0027))"},{"line_number":2247,"context_line":"            self.app.logger.increment(\u0027client_disconnects\u0027)"},{"line_number":2248,"context_line":"            raise HTTPClientDisconnect(request\u003dreq)"},{"line_number":2249,"context_line":"        except HTTPException:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_e7b82ceb","line":2246,"updated":"2015-09-18 23:05:23.000000000","message":"Pardon me if I\u0027m going after the word too much.  \"last\" is the last chunk upon which this exception is handled, however it makes it sound that the \"last\" of all chunks is lost over a disconnected client, but there could have bee more chunks after this lost chunk being sent.  Is \"latest\" clearer?","commit_id":"f4b2253f56acbe00c45492b7f73ea2501d5c0a09"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1759d651b6341944b3bc1ea456169a5b5aecce46","unresolved":false,"context_lines":[{"line_number":2243,"context_line":"        except ChunkReadError:"},{"line_number":2244,"context_line":"            req.client_disconnect \u003d True"},{"line_number":2245,"context_line":"            self.app.logger.warn("},{"line_number":2246,"context_line":"                _(\u0027Client disconnected without sending last chunk\u0027))"},{"line_number":2247,"context_line":"            self.app.logger.increment(\u0027client_disconnects\u0027)"},{"line_number":2248,"context_line":"            raise HTTPClientDisconnect(request\u003dreq)"},{"line_number":2249,"context_line":"        except HTTPException:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_fc9ba870","line":2246,"in_reply_to":"ba15a1d1_e7b82ceb","updated":"2015-09-21 19:06:43.000000000","message":"I\u0027m not sure it\u0027s the *best* wording, but I think it\u0027s ok.\n\nThe point with Transfer-Encoding: chunked is we don\u0027t know how many chunks to expect.  All we know is that the stream is broke and we didn\u0027t get a \u00270\\r\\n\\r\\n\u0027 (this is the how the protocol indicates the last/final/end chunk which means the client is done sending us the body).\n\nThere\u0027s a number of things that *could* cause the eventlet.wsgi chunked parser to blow up, but the most common by far is the empty string on disconnect - which could show up anywhere in the stream before the last/final/end chunk, but we have no context to say how far we were or how many were left.  Really all we know is that there was a protocol error (probably disconnect) \"before the end/final/last chunk\"\n\nI think what\u0027s there now communicates this concept better than \"latest\" - got any other ideas?","commit_id":"f4b2253f56acbe00c45492b7f73ea2501d5c0a09"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f2bbc202d921b0f4d03984e39eeb36d88dd71aec","unresolved":false,"context_lines":[{"line_number":2179,"context_line":"                            if bytes_transferred \u003e constraints.MAX_FILE_SIZE:"},{"line_number":2180,"context_line":"                                raise HTTPRequestEntityTooLarge(request\u003dreq)"},{"line_number":2181,"context_line":""},{"line_number":2182,"context_line":"                            send_chunk(chunk)"},{"line_number":2183,"context_line":""},{"line_number":2184,"context_line":"                if req.content_length and ("},{"line_number":2185,"context_line":"                        bytes_transferred \u003c req.content_length):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_d2254f5c","line":2182,"updated":"2015-09-22 15:04:00.000000000","message":"I\u0027m not sure this matters or not, but since i have noticed it I will mention that this send_chunk has been indented so that it now gets called inside the ChunkReadTimeout. The send_chunk ends up putting chunks onto a finite depth queue which could block (correct?) particularly if the operator messes with config options to reduce queue length.\n\nSo might we end up with the put queue wait time eating into the client read timeout?\n\nSeems like everything works with send_chunk outside of the ChunkReadTimeout","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"67d9108c240d1156d616de883ebfc492e1678516","unresolved":false,"context_lines":[{"line_number":2179,"context_line":"                            if bytes_transferred \u003e constraints.MAX_FILE_SIZE:"},{"line_number":2180,"context_line":"                                raise HTTPRequestEntityTooLarge(request\u003dreq)"},{"line_number":2181,"context_line":""},{"line_number":2182,"context_line":"                            send_chunk(chunk)"},{"line_number":2183,"context_line":""},{"line_number":2184,"context_line":"                if req.content_length and ("},{"line_number":2185,"context_line":"                        bytes_transferred \u003c req.content_length):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_3747c41e","line":2182,"in_reply_to":"ba15a1d1_9229053a","updated":"2015-09-22 19:19:14.000000000","message":"Done","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3154488ff1ca0439973ce110d664f198b72b428d","unresolved":false,"context_lines":[{"line_number":2179,"context_line":"                            if bytes_transferred \u003e constraints.MAX_FILE_SIZE:"},{"line_number":2180,"context_line":"                                raise HTTPRequestEntityTooLarge(request\u003dreq)"},{"line_number":2181,"context_line":""},{"line_number":2182,"context_line":"                            send_chunk(chunk)"},{"line_number":2183,"context_line":""},{"line_number":2184,"context_line":"                if req.content_length and ("},{"line_number":2185,"context_line":"                        bytes_transferred \u003c req.content_length):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_9229053a","line":2182,"in_reply_to":"ba15a1d1_d2254f5c","updated":"2015-09-22 16:42:03.000000000","message":"yah I think that\u0027s crappy - and I\u0027m even sure why I used the else clause looking at it two days later?\n\nThe only code that get\u0027s executed in the exception is the break - so the non exception case looks like\u0027s already conditional on success...\n\n#willfix","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f2bbc202d921b0f4d03984e39eeb36d88dd71aec","unresolved":false,"context_lines":[{"line_number":6136,"context_line":"        def exploding_body():"},{"line_number":6137,"context_line":"            for i in range(3):"},{"line_number":6138,"context_line":"                yield \u0027\\x00\u0027 * (64 * 2 ** 10)"},{"line_number":6139,"context_line":"            raise Exception(\u0027kaboom!\u0027)"},{"line_number":6140,"context_line":""},{"line_number":6141,"context_line":"        headers \u003d {}"},{"line_number":6142,"context_line":"        if is_chunked:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_c2dd7a15","line":6139,"updated":"2015-09-22 15:04:00.000000000","message":"[python question] I didn\u0027t understand why the exception was needed here, so I removed it and watched the test PUT reach the client read timeout. So how come we need to raise an Exception here in order to see a StopIteration in obj.py? Why doesn\u0027t the fact that the exploding_body generator exits cause it to raise a StopIteration?","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3154488ff1ca0439973ce110d664f198b72b428d","unresolved":false,"context_lines":[{"line_number":6136,"context_line":"        def exploding_body():"},{"line_number":6137,"context_line":"            for i in range(3):"},{"line_number":6138,"context_line":"                yield \u0027\\x00\u0027 * (64 * 2 ** 10)"},{"line_number":6139,"context_line":"            raise Exception(\u0027kaboom!\u0027)"},{"line_number":6140,"context_line":""},{"line_number":6141,"context_line":"        headers \u003d {}"},{"line_number":6142,"context_line":"        if is_chunked:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_f92f0c86","line":6139,"in_reply_to":"ba15a1d1_c2dd7a15","updated":"2015-09-22 16:42:03.000000000","message":"remember this exception and the proxy are on different ends of a socket.  This is just to force the put method to blow up and stop sending bytes and close the socket.  If you don\u0027t raise the Exception the put method drops into blocking on getresponse while the proxy is blocking on read until timeout.","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f2bbc202d921b0f4d03984e39eeb36d88dd71aec","unresolved":false,"context_lines":[{"line_number":6140,"context_line":""},{"line_number":6141,"context_line":"        headers \u003d {}"},{"line_number":6142,"context_line":"        if is_chunked:"},{"line_number":6143,"context_line":"            headers[\u0027Transfer-Encoding\u0027] \u003d \u0027chunked\u0027"},{"line_number":6144,"context_line":"        else:"},{"line_number":6145,"context_line":"            headers[\u0027Content-Length\u0027] \u003d 64 * 2 ** 20"},{"line_number":6146,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_024ff2bd","line":6143,"updated":"2015-09-22 15:04:00.000000000","message":"let me be sure i understand this: if chunked then when the body explodes, wsgi will fail to find the chunk delimiter and raise its nasty ValueError or IOError, which we now morph to a ChunkReadError.\n\nIf not chunked, wsgi will generate a StopIteration when body explodes, and received bytes \u003c\u003c content-length.\n\ncorrect?","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3154488ff1ca0439973ce110d664f198b72b428d","unresolved":false,"context_lines":[{"line_number":6140,"context_line":""},{"line_number":6141,"context_line":"        headers \u003d {}"},{"line_number":6142,"context_line":"        if is_chunked:"},{"line_number":6143,"context_line":"            headers[\u0027Transfer-Encoding\u0027] \u003d \u0027chunked\u0027"},{"line_number":6144,"context_line":"        else:"},{"line_number":6145,"context_line":"            headers[\u0027Content-Length\u0027] \u003d 64 * 2 ** 20"},{"line_number":6146,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_925a6529","line":6143,"in_reply_to":"ba15a1d1_024ff2bd","updated":"2015-09-22 16:42:03.000000000","message":"correct\n\n... maybe I should have said that in the commit message.","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"67d9108c240d1156d616de883ebfc492e1678516","unresolved":false,"context_lines":[{"line_number":6140,"context_line":""},{"line_number":6141,"context_line":"        headers \u003d {}"},{"line_number":6142,"context_line":"        if is_chunked:"},{"line_number":6143,"context_line":"            headers[\u0027Transfer-Encoding\u0027] \u003d \u0027chunked\u0027"},{"line_number":6144,"context_line":"        else:"},{"line_number":6145,"context_line":"            headers[\u0027Content-Length\u0027] \u003d 64 * 2 ** 20"},{"line_number":6146,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_57ab5889","line":6143,"in_reply_to":"ba15a1d1_925a6529","updated":"2015-09-22 19:19:14.000000000","message":"i sorta guess I already did have something in the commit message, but I updated it with some excerpts from your comment - and *now* you\u0027re a Co-Author, muwhahahaah","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3154488ff1ca0439973ce110d664f198b72b428d","unresolved":false,"context_lines":[{"line_number":6154,"context_line":"        else:"},{"line_number":6155,"context_line":"            self.fail(\u0027obj put connection did not ka-splod\u0027)"},{"line_number":6156,"context_line":""},{"line_number":6157,"context_line":"        sleep(0.1)"},{"line_number":6158,"context_line":""},{"line_number":6159,"context_line":"    def find_files(self):"},{"line_number":6160,"context_line":"        found_files \u003d defaultdict(list)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_728311cd","line":6157,"updated":"2015-09-22 16:42:03.000000000","message":"since everyone is the same process we want to give spawned eventlet servers time to notice the socket was closed and shutdown.  If they were blocking on some app.*_timeout then this wouldn\u0027t be enough.","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"67d9108c240d1156d616de883ebfc492e1678516","unresolved":false,"context_lines":[{"line_number":6154,"context_line":"        else:"},{"line_number":6155,"context_line":"            self.fail(\u0027obj put connection did not ka-splod\u0027)"},{"line_number":6156,"context_line":""},{"line_number":6157,"context_line":"        sleep(0.1)"},{"line_number":6158,"context_line":""},{"line_number":6159,"context_line":"    def find_files(self):"},{"line_number":6160,"context_line":"        found_files \u003d defaultdict(list)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_f7c38c55","line":6157,"in_reply_to":"ba15a1d1_728311cd","updated":"2015-09-22 19:19:14.000000000","message":"Done\n\n... just added a comment","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f2bbc202d921b0f4d03984e39eeb36d88dd71aec","unresolved":false,"context_lines":[{"line_number":6164,"context_line":"                found_files[ext].append(os.path.join(root, fname))"},{"line_number":6165,"context_line":"        return found_files"},{"line_number":6166,"context_line":""},{"line_number":6167,"context_line":"    def test_repl_disconnect_cleans_up(self):"},{"line_number":6168,"context_line":"        self._check_disconnect_cleans_up(\u0027zero\u0027)"},{"line_number":6169,"context_line":"        found_files \u003d self.find_files()"},{"line_number":6170,"context_line":"        self.assertEqual(found_files[\u0027.data\u0027], [])"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_9157ca01","line":6167,"updated":"2015-09-22 15:04:00.000000000","message":"note to self: this should pass on master because the obj server will not write a data file if content length does not match received bytes","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3154488ff1ca0439973ce110d664f198b72b428d","unresolved":false,"context_lines":[{"line_number":6164,"context_line":"                found_files[ext].append(os.path.join(root, fname))"},{"line_number":6165,"context_line":"        return found_files"},{"line_number":6166,"context_line":""},{"line_number":6167,"context_line":"    def test_repl_disconnect_cleans_up(self):"},{"line_number":6168,"context_line":"        self._check_disconnect_cleans_up(\u0027zero\u0027)"},{"line_number":6169,"context_line":"        found_files \u003d self.find_files()"},{"line_number":6170,"context_line":"        self.assertEqual(found_files[\u0027.data\u0027], [])"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_d229bd8a","line":6167,"in_reply_to":"ba15a1d1_9157ca01","updated":"2015-09-22 16:42:03.000000000","message":"yeah I just added it for completeness and sanity check.","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f2bbc202d921b0f4d03984e39eeb36d88dd71aec","unresolved":false,"context_lines":[{"line_number":6169,"context_line":"        found_files \u003d self.find_files()"},{"line_number":6170,"context_line":"        self.assertEqual(found_files[\u0027.data\u0027], [])"},{"line_number":6171,"context_line":""},{"line_number":6172,"context_line":"    def test_ec_disconnect_cleans_up(self):"},{"line_number":6173,"context_line":"        self._check_disconnect_cleans_up(\u0027ec\u0027)"},{"line_number":6174,"context_line":"        found_files \u003d self.find_files()"},{"line_number":6175,"context_line":"        self.assertEqual(found_files[\u0027.durable\u0027], [])"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_f13ac697","line":6172,"updated":"2015-09-22 15:04:00.000000000","message":"I see this fail on master but I need to increase the sleep at line 6157 for it to be consistent\n\n(I\u0027m not sure why it doesn\u0027t pass on master for same reasons as the repl version - backend detect mismatch between received bytes and content length)","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3154488ff1ca0439973ce110d664f198b72b428d","unresolved":false,"context_lines":[{"line_number":6169,"context_line":"        found_files \u003d self.find_files()"},{"line_number":6170,"context_line":"        self.assertEqual(found_files[\u0027.data\u0027], [])"},{"line_number":6171,"context_line":""},{"line_number":6172,"context_line":"    def test_ec_disconnect_cleans_up(self):"},{"line_number":6173,"context_line":"        self._check_disconnect_cleans_up(\u0027ec\u0027)"},{"line_number":6174,"context_line":"        found_files \u003d self.find_files()"},{"line_number":6175,"context_line":"        self.assertEqual(found_files[\u0027.durable\u0027], [])"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba15a1d1_57083f2d","line":6172,"in_reply_to":"ba15a1d1_f13ac697","updated":"2015-09-22 16:42:03.000000000","message":"chunked-transfer - no content-length","commit_id":"d4926e419444cc2e1842fa1f1d201f70f7aeca86"}]}
