)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"b24908dd1b0b120907fd0f4ad9b6a3c64971444b","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"For example:"},{"line_number":14,"context_line":"- Considering the case that almost of object-servers fail by 422"},{"line_number":15,"context_line":"  Unpronounceable Entity"},{"line_number":16,"context_line":"- Using ec scheme 4 + 2"},{"line_number":17,"context_line":"- 5 (quorum size) object-server failed with 422, 1 object-servers"},{"line_number":18,"context_line":"  succeeded as 201 created"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_79852857","line":15,"updated":"2015-09-03 17:57:57.000000000","message":"nit: unprocessable\n\n(secretly, I\u0027m amused at an object named \u0027fhqhwgads\u0027 returning that error though :D )","commit_id":"b1e4791f039891d4d841242463b8909c956c2a5a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b0b34a6dc5592d7ae47e113676d24304ab0e209e","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"For example:"},{"line_number":14,"context_line":"- Considering the case that almost of object-servers fail by 422"},{"line_number":15,"context_line":"  Unpronounceable Entity"},{"line_number":16,"context_line":"- Using ec scheme 4 + 2"},{"line_number":17,"context_line":"- 5 (quorum size) object-server failed with 422, 1 object-servers"},{"line_number":18,"context_line":"  succeeded as 201 created"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"da20952f_c603230f","line":15,"in_reply_to":"da20952f_79852857","updated":"2015-09-04 00:02:14.000000000","message":"Hah! I also am interested in how we catch the unpronounceable object with Python :/\n\nNice cactch, will fix.","commit_id":"b1e4791f039891d4d841242463b8909c956c2a5a"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":14867,"name":"Jaivish Kothari(janonymous)","email":"janonymous.codevulture@gmail.com","username":"Janonymous"},"change_message_id":"77e4c5a3e95905444a8c2c07cd1f8cd55c534455","unresolved":false,"context_lines":[{"line_number":1551,"context_line":"                except ValueError:"},{"line_number":1552,"context_line":"                    # All statuses were indices to avoid"},{"line_number":1553,"context_line":"                    continue"},{"line_number":1554,"context_line":"                resp \u003d status_map[status](request\u003dreq)"},{"line_number":1555,"context_line":"                resp.status \u003d \u0027%s %s\u0027 % (status, reasons[status_index])"},{"line_number":1556,"context_line":"                resp.body \u003d bodies[status_index]"},{"line_number":1557,"context_line":"                if headers:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_8119b08a","line":1554,"updated":"2015-09-28 16:39:16.000000000","message":"Patch looks good to me  but could you check that status_map does not include HTTP_MULTIPLE_CHOICES(300) as per line:1540 in swob.py. Would that be a problem in future ?","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cdd6bfca775bdcf96d3383ebb02bb8385620bed5","unresolved":false,"context_lines":[{"line_number":1551,"context_line":"                except ValueError:"},{"line_number":1552,"context_line":"                    # All statuses were indices to avoid"},{"line_number":1553,"context_line":"                    continue"},{"line_number":1554,"context_line":"                resp \u003d status_map[status](request\u003dreq)"},{"line_number":1555,"context_line":"                resp.status \u003d \u0027%s %s\u0027 % (status, reasons[status_index])"},{"line_number":1556,"context_line":"                resp.body \u003d bodies[status_index]"},{"line_number":1557,"context_line":"                if headers:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_a4165453","line":1554,"updated":"2015-09-28 13:00:37.000000000","message":"nit : this change is unnecessary because the next line sets the response status.\n\nI tried removing the next line but there are tests that set non-standard reason strings.","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ec038aee78de8efc09714c84edb702839706e99","unresolved":false,"context_lines":[{"line_number":1551,"context_line":"                except ValueError:"},{"line_number":1552,"context_line":"                    # All statuses were indices to avoid"},{"line_number":1553,"context_line":"                    continue"},{"line_number":1554,"context_line":"                resp \u003d status_map[status](request\u003dreq)"},{"line_number":1555,"context_line":"                resp.status \u003d \u0027%s %s\u0027 % (status, reasons[status_index])"},{"line_number":1556,"context_line":"                resp.body \u003d bodies[status_index]"},{"line_number":1557,"context_line":"                if headers:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_ff2a658f","line":1554,"in_reply_to":"9a1a9d01_a4165453","updated":"2015-09-29 12:43:48.000000000","message":"Here, I\u0027d like to set an instance of raise-able swob.HTTPException instead of pure Response instance. If we employ this, we can raise the response if it is an error.","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"b24908dd1b0b120907fd0f4ad9b6a3c64971444b","unresolved":false,"context_lines":[{"line_number":2214,"context_line":"                                              quorum_size\u003dmin_conns)"},{"line_number":2215,"context_line":"                    if resp.status_int \u003d\u003d HTTP_UNPROCESSABLE_ENTITY:"},{"line_number":2216,"context_line":"                        # HTTP_UNPROCESSABLE_ENTITY is an error that etag"},{"line_number":2217,"context_line":"                        # mismatched between sent data from proxy and recieved"},{"line_number":2218,"context_line":"                        # data at object-server, so we should regard this as"},{"line_number":2219,"context_line":"                        # HTTPServiceUnavailable."},{"line_number":2220,"context_line":"                        raise HTTPServiceUnavailable(request\u003dreq)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_397fb067","line":2217,"updated":"2015-09-03 17:57:57.000000000","message":"nit: received","commit_id":"b1e4791f039891d4d841242463b8909c956c2a5a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b0b34a6dc5592d7ae47e113676d24304ab0e209e","unresolved":false,"context_lines":[{"line_number":2214,"context_line":"                                              quorum_size\u003dmin_conns)"},{"line_number":2215,"context_line":"                    if resp.status_int \u003d\u003d HTTP_UNPROCESSABLE_ENTITY:"},{"line_number":2216,"context_line":"                        # HTTP_UNPROCESSABLE_ENTITY is an error that etag"},{"line_number":2217,"context_line":"                        # mismatched between sent data from proxy and recieved"},{"line_number":2218,"context_line":"                        # data at object-server, so we should regard this as"},{"line_number":2219,"context_line":"                        # HTTPServiceUnavailable."},{"line_number":2220,"context_line":"                        raise HTTPServiceUnavailable(request\u003dreq)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_e600a704","line":2217,"in_reply_to":"da20952f_397fb067","updated":"2015-09-04 00:02:14.000000000","message":"Will fix.","commit_id":"b1e4791f039891d4d841242463b8909c956c2a5a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cdd6bfca775bdcf96d3383ebb02bb8385620bed5","unresolved":false,"context_lines":[{"line_number":2199,"context_line":"                final_phase \u003d False"},{"line_number":2200,"context_line":"                need_quorum \u003d True"},{"line_number":2201,"context_line":"                statuses, reasons, bodies, _junk, quorum \u003d \\"},{"line_number":2202,"context_line":"                    self._get_put_responses("},{"line_number":2203,"context_line":"                        req, putters, len(nodes), final_phase,"},{"line_number":2204,"context_line":"                        min_conns, need_quorum\u003dneed_quorum)"},{"line_number":2205,"context_line":"                if not quorum:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_27a561a1","line":2202,"updated":"2015-09-28 13:00:37.000000000","message":"with the change to _have_adequate_successes so that it now includes 1xx responses as \u0027successful\u0027, _get_put_responses can now return sooner than it does on master - on master I believe it will not return until all putters have responded or timed out, now it will return after a quorum of 1xx. \n\nThen at line 2229 we proceed to send commit to ALL putters, not just those which have returned 1xx. Is that OK? i.e. is it OK to send confirmation on a connection *before* receiving a 1xx response. The test won;t cover this scenario.","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ec038aee78de8efc09714c84edb702839706e99","unresolved":false,"context_lines":[{"line_number":2199,"context_line":"                final_phase \u003d False"},{"line_number":2200,"context_line":"                need_quorum \u003d True"},{"line_number":2201,"context_line":"                statuses, reasons, bodies, _junk, quorum \u003d \\"},{"line_number":2202,"context_line":"                    self._get_put_responses("},{"line_number":2203,"context_line":"                        req, putters, len(nodes), final_phase,"},{"line_number":2204,"context_line":"                        min_conns, need_quorum\u003dneed_quorum)"},{"line_number":2205,"context_line":"                if not quorum:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_5bdd9c6d","line":2202,"in_reply_to":"9a1a9d01_27a561a1","updated":"2015-09-29 12:43:48.000000000","message":"This is really good catch but I\u0027m not sure, right now.\n\nIn the discussion with Alistair on IRC, exactly this change will make a chance quorum 1xx responses to make commits for all nodes. I didn\u0027t care about the situation once I wrote this version. In addition, it might break the conversation between proxy-server and object-server because proxy-server could get 1xx in final phase from skipped object-server. I hope it would be just my concern and HTTPConnection.get_response() would pull out the final status more than 1xx (e.g. 2xx after 1xx) but I\u0027m not sure and I don\u0027t want to use it with such my slippery status.\n\nSo, following next patch set, I will revert the change on _have_adequate_successes and will make _have_adequate_informationl that checks the 1xx min_responses.","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cdd6bfca775bdcf96d3383ebb02bb8385620bed5","unresolved":false,"context_lines":[{"line_number":2220,"context_line":"                        raise HTTPServiceUnavailable(request\u003dreq)"},{"line_number":2221,"context_line":"                    else:"},{"line_number":2222,"context_line":"                        # Other errors should use raw best_response"},{"line_number":2223,"context_line":"                        raise resp"},{"line_number":2224,"context_line":"                # quorum achieved, start 2nd phase - send commit"},{"line_number":2225,"context_line":"                # confirmation to participating object servers"},{"line_number":2226,"context_line":"                # so they write a .durable state file indicating"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_27dfa16a","line":2223,"updated":"2015-09-28 13:00:37.000000000","message":"not sure about this - the 422 is translated to a 503 because the proxy messed up with the etags somehow. But here, if the proxy somehow sends a bad request to the object server, the client now gets a 400. That could get confusing for a client that is not sending a bad request.","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ec038aee78de8efc09714c84edb702839706e99","unresolved":false,"context_lines":[{"line_number":2220,"context_line":"                        raise HTTPServiceUnavailable(request\u003dreq)"},{"line_number":2221,"context_line":"                    else:"},{"line_number":2222,"context_line":"                        # Other errors should use raw best_response"},{"line_number":2223,"context_line":"                        raise resp"},{"line_number":2224,"context_line":"                # quorum achieved, start 2nd phase - send commit"},{"line_number":2225,"context_line":"                # confirmation to participating object servers"},{"line_number":2226,"context_line":"                # so they write a .durable state file indicating"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_0db2934c","line":2223,"in_reply_to":"9a1a9d01_27dfa16a","updated":"2015-09-29 12:43:48.000000000","message":"Good catch, 4xx status in this sequence must be proxy bad not a client one so I will change the check resp.status_int \u003d\u003d HTTP_UNPROCESSABLE_ENTITY into is_client_error(resp.status_int)","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cdd6bfca775bdcf96d3383ebb02bb8385620bed5","unresolved":false,"context_lines":[{"line_number":2356,"context_line":"                    reasons.append(\u0027\u0027)"},{"line_number":2357,"context_line":"                    bodies.append(\u0027\u0027)"},{"line_number":2358,"context_line":"            else:"},{"line_number":2359,"context_line":"                # intermediate response phase - set return value to true only"},{"line_number":2360,"context_line":"                # if there are enough 100-continue acknowledgements"},{"line_number":2361,"context_line":"                if self.have_quorum(statuses, num_nodes, quorum\u003dmin_responses):"},{"line_number":2362,"context_line":"                    quorum \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_64c11c80","line":2359,"updated":"2015-09-28 13:00:37.000000000","message":"It seems this comment is wrong - quorum will be True if there are enough responses having same value of *any* status","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ec038aee78de8efc09714c84edb702839706e99","unresolved":false,"context_lines":[{"line_number":2356,"context_line":"                    reasons.append(\u0027\u0027)"},{"line_number":2357,"context_line":"                    bodies.append(\u0027\u0027)"},{"line_number":2358,"context_line":"            else:"},{"line_number":2359,"context_line":"                # intermediate response phase - set return value to true only"},{"line_number":2360,"context_line":"                # if there are enough 100-continue acknowledgements"},{"line_number":2361,"context_line":"                if self.have_quorum(statuses, num_nodes, quorum\u003dmin_responses):"},{"line_number":2362,"context_line":"                    quorum \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_d633c3a9","line":2359,"in_reply_to":"9a1a9d01_64c11c80","updated":"2015-09-29 12:43:48.000000000","message":"yup, will fix, too","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"cfa6ecf1679c823ffa80cc69adeadf0d0afd1baa","unresolved":false,"context_lines":[{"line_number":2207,"context_line":"                        statuses.count(HTTP_CONTINUE))"},{"line_number":2208,"context_line":"                    raise HTTPServiceUnavailable(request\u003dreq)"},{"line_number":2209,"context_line":""},{"line_number":2210,"context_line":"                elif not self._have_adequate_informational("},{"line_number":2211,"context_line":"                        statuses, min_conns):"},{"line_number":2212,"context_line":"                    resp \u003d self.best_response(req, statuses, reasons, bodies,"},{"line_number":2213,"context_line":"                                              _(\u0027Object PUT\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_7e56372b","line":2210,"updated":"2015-09-29 20:34:41.000000000","message":"Plain if xxx: would suffice, I think.","commit_id":"8f1c7409e7b6a854125a234b8a2b969075d26dae"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"ddbc50c7c32a4ded4b36c1bdea38115449db5aa5","unresolved":false,"context_lines":[{"line_number":2207,"context_line":"                        statuses.count(HTTP_CONTINUE))"},{"line_number":2208,"context_line":"                    raise HTTPServiceUnavailable(request\u003dreq)"},{"line_number":2209,"context_line":""},{"line_number":2210,"context_line":"                elif not self._have_adequate_informational("},{"line_number":2211,"context_line":"                        statuses, min_conns):"},{"line_number":2212,"context_line":"                    resp \u003d self.best_response(req, statuses, reasons, bodies,"},{"line_number":2213,"context_line":"                                              _(\u0027Object PUT\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_bd55c3c2","line":2210,"updated":"2015-09-29 15:44:47.000000000","message":"shouldn\u0027t this if statement be \"_have_adequate_informational() or _have_adequate_successes()\"?","commit_id":"8f1c7409e7b6a854125a234b8a2b969075d26dae"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"edb01f33a1a11a7dbac550deb16eb97a46c7ef72","unresolved":false,"context_lines":[{"line_number":2207,"context_line":"                        statuses.count(HTTP_CONTINUE))"},{"line_number":2208,"context_line":"                    raise HTTPServiceUnavailable(request\u003dreq)"},{"line_number":2209,"context_line":""},{"line_number":2210,"context_line":"                elif not self._have_adequate_informational("},{"line_number":2211,"context_line":"                        statuses, min_conns):"},{"line_number":2212,"context_line":"                    resp \u003d self.best_response(req, statuses, reasons, bodies,"},{"line_number":2213,"context_line":"                                              _(\u0027Object PUT\u0027),"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_75b73a3a","line":2210,"in_reply_to":"9a1a9d01_bd55c3c2","updated":"2015-09-29 19:06:13.000000000","message":"I think it\u0027s okay like this because this is the EC object controller. EC always does the .durable file thing, so there\u0027s no way to get a 2xx here. The object server is either going to say 100 Continue or 4xx/5xx Knock It Off.","commit_id":"8f1c7409e7b6a854125a234b8a2b969075d26dae"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"cfa6ecf1679c823ffa80cc69adeadf0d0afd1baa","unresolved":false,"context_lines":[{"line_number":2274,"context_line":""},{"line_number":2275,"context_line":"    def _have_adequate_informational(self, statuses, min_responses):"},{"line_number":2276,"context_line":"        \"\"\""},{"line_number":2277,"context_line":"        Partial method of _have_adequate_responses for 2xx"},{"line_number":2278,"context_line":"        \"\"\""},{"line_number":2279,"context_line":"        return self._have_adequate_responses("},{"line_number":2280,"context_line":"            statuses, min_responses, is_informational)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_7eab9775","line":2277,"updated":"2015-09-29 20:34:41.000000000","message":"1xx here","commit_id":"8f1c7409e7b6a854125a234b8a2b969075d26dae"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"b24908dd1b0b120907fd0f4ad9b6a3c64971444b","unresolved":false,"context_lines":[{"line_number":2031,"context_line":""},{"line_number":2032,"context_line":"        call_count \u003d [0]"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"        def mock_commiter(self):"},{"line_number":2035,"context_line":"            call_count[0] +\u003d 1"},{"line_number":2036,"context_line":"            self.state \u003d DATA_ACKED"},{"line_number":2037,"context_line":"            if self.mime_boundary:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_197c2c71","line":2034,"updated":"2015-09-03 17:57:57.000000000","message":"nit: \"committer\"","commit_id":"b1e4791f039891d4d841242463b8909c956c2a5a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"b0b34a6dc5592d7ae47e113676d24304ab0e209e","unresolved":false,"context_lines":[{"line_number":2031,"context_line":""},{"line_number":2032,"context_line":"        call_count \u003d [0]"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"        def mock_commiter(self):"},{"line_number":2035,"context_line":"            call_count[0] +\u003d 1"},{"line_number":2036,"context_line":"            self.state \u003d DATA_ACKED"},{"line_number":2037,"context_line":"            if self.mime_boundary:"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_21120958","line":2034,"in_reply_to":"da20952f_197c2c71","updated":"2015-09-04 00:02:14.000000000","message":"will fix.","commit_id":"b1e4791f039891d4d841242463b8909c956c2a5a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cdd6bfca775bdcf96d3383ebb02bb8385620bed5","unresolved":false,"context_lines":[{"line_number":2032,"context_line":"        call_count \u003d [0]"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"        def mock_committer(self):"},{"line_number":2035,"context_line":"            call_count[0] +\u003d 1"},{"line_number":2036,"context_line":"            self.state \u003d DATA_ACKED"},{"line_number":2037,"context_line":"            if self.mime_boundary:"},{"line_number":2038,"context_line":"                body \u003d \"put_commit_confirmation\""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_8a7d5770","line":2035,"updated":"2015-09-28 13:00:37.000000000","message":"since the tests only ever assert that this method is NOT called then it is unnecessary to duplicate the original method here.","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ec038aee78de8efc09714c84edb702839706e99","unresolved":false,"context_lines":[{"line_number":2032,"context_line":"        call_count \u003d [0]"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"        def mock_committer(self):"},{"line_number":2035,"context_line":"            call_count[0] +\u003d 1"},{"line_number":2036,"context_line":"            self.state \u003d DATA_ACKED"},{"line_number":2037,"context_line":"            if self.mime_boundary:"},{"line_number":2038,"context_line":"                body \u003d \"put_commit_confirmation\""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_02682286","line":2035,"in_reply_to":"9a1a9d01_8a7d5770","updated":"2015-09-29 12:43:48.000000000","message":"Exactly, will fix. Nice.","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cdd6bfca775bdcf96d3383ebb02bb8385620bed5","unresolved":false,"context_lines":[{"line_number":2082,"context_line":"                                     \u0027a\u0027, \u0027ec-con\u0027, \u0027quorum\u0027,"},{"line_number":2083,"context_line":"                                     policy\u003dPOLICIES[3])"},{"line_number":2084,"context_line":"            try:"},{"line_number":2085,"context_line":"                files \u003d os.listdir(df._datadir)"},{"line_number":2086,"context_line":"                num_data_files \u003d len([f for f in files if f.endswith(\u0027.data\u0027)])"},{"line_number":2087,"context_line":"                self.assertEqual(0, num_data_files)"},{"line_number":2088,"context_line":"                num_durable_files \u003d len("}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_2a8d2b7b","line":2085,"updated":"2015-09-28 13:00:37.000000000","message":"nit: self.assertFalse(os.listdir(df._datadir)) would work here","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ec038aee78de8efc09714c84edb702839706e99","unresolved":false,"context_lines":[{"line_number":2082,"context_line":"                                     \u0027a\u0027, \u0027ec-con\u0027, \u0027quorum\u0027,"},{"line_number":2083,"context_line":"                                     policy\u003dPOLICIES[3])"},{"line_number":2084,"context_line":"            try:"},{"line_number":2085,"context_line":"                files \u003d os.listdir(df._datadir)"},{"line_number":2086,"context_line":"                num_data_files \u003d len([f for f in files if f.endswith(\u0027.data\u0027)])"},{"line_number":2087,"context_line":"                self.assertEqual(0, num_data_files)"},{"line_number":2088,"context_line":"                num_durable_files \u003d len("}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_22d446ea","line":2085,"in_reply_to":"9a1a9d01_2a8d2b7b","updated":"2015-09-29 12:43:48.000000000","message":"self.assertFalse(os.path.exists(df._datadir)) seems better but thanks. With your help, I can make it simpler. Will fix.","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cdd6bfca775bdcf96d3383ebb02bb8385620bed5","unresolved":false,"context_lines":[{"line_number":2104,"context_line":"        call_count \u003d [0]"},{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"        def mock_committer(self):"},{"line_number":2107,"context_line":"            call_count[0] +\u003d 1"},{"line_number":2108,"context_line":"            self.state \u003d DATA_ACKED"},{"line_number":2109,"context_line":"            if self.mime_boundary:"},{"line_number":2110,"context_line":"                body \u003d \"put_commit_confirmation\""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_6aac83ed","line":2107,"updated":"2015-09-28 13:00:37.000000000","message":"same as above - code not needed","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ec038aee78de8efc09714c84edb702839706e99","unresolved":false,"context_lines":[{"line_number":2104,"context_line":"        call_count \u003d [0]"},{"line_number":2105,"context_line":""},{"line_number":2106,"context_line":"        def mock_committer(self):"},{"line_number":2107,"context_line":"            call_count[0] +\u003d 1"},{"line_number":2108,"context_line":"            self.state \u003d DATA_ACKED"},{"line_number":2109,"context_line":"            if self.mime_boundary:"},{"line_number":2110,"context_line":"                body \u003d \"put_commit_confirmation\""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_620d5ee7","line":2107,"in_reply_to":"9a1a9d01_6aac83ed","updated":"2015-09-29 12:43:48.000000000","message":"same as above, will fix.","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cdd6bfca775bdcf96d3383ebb02bb8385620bed5","unresolved":false,"context_lines":[{"line_number":2160,"context_line":"                                     \u0027a\u0027, \u0027ec-con\u0027, \u0027quorum\u0027,"},{"line_number":2161,"context_line":"                                     policy\u003dPOLICIES[3])"},{"line_number":2162,"context_line":"            try:"},{"line_number":2163,"context_line":"                files \u003d os.listdir(df._datadir)"},{"line_number":2164,"context_line":"                num_data_files \u003d len([f for f in files if f.endswith(\u0027.data\u0027)])"},{"line_number":2165,"context_line":"                self.assertEqual(0, num_data_files)"},{"line_number":2166,"context_line":"                num_durable_files \u003d len("}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_8af477f2","line":2163,"updated":"2015-09-28 13:00:37.000000000","message":"nit: same as above, could simply test for empty directory","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ec038aee78de8efc09714c84edb702839706e99","unresolved":false,"context_lines":[{"line_number":2160,"context_line":"                                     \u0027a\u0027, \u0027ec-con\u0027, \u0027quorum\u0027,"},{"line_number":2161,"context_line":"                                     policy\u003dPOLICIES[3])"},{"line_number":2162,"context_line":"            try:"},{"line_number":2163,"context_line":"                files \u003d os.listdir(df._datadir)"},{"line_number":2164,"context_line":"                num_data_files \u003d len([f for f in files if f.endswith(\u0027.data\u0027)])"},{"line_number":2165,"context_line":"                self.assertEqual(0, num_data_files)"},{"line_number":2166,"context_line":"                num_durable_files \u003d len("}],"source_content_type":"text/x-python","patch_set":4,"id":"9a1a9d01_02d7c2ed","line":2163,"in_reply_to":"9a1a9d01_8af477f2","updated":"2015-09-29 12:43:48.000000000","message":"Same as above. Will fix.","commit_id":"98d17431f4b6e573466263a9fa6c48dd946d38c6"}]}
