)]}'
{"swift/proxy/controllers/base.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":1692,"context_line":"            if not resp:"},{"line_number":1693,"context_line":"                continue"},{"line_number":1694,"context_line":"            response.append(resp)"},{"line_number":1695,"context_line":"            statuses.append(resp[0])"},{"line_number":1696,"context_line":"        while len(response) \u003c node_number:"},{"line_number":1697,"context_line":"            response.append((HTTP_SERVICE_UNAVAILABLE, \u0027\u0027, \u0027\u0027, b\u0027\u0027))"},{"line_number":1698,"context_line":"        statuses, reasons, resp_headers, bodies \u003d zip(*response)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_d1d88e80","line":1695,"range":{"start_line":1695,"start_character":12,"end_line":1695,"end_character":36},"updated":"2019-02-06 19:56:33.000000000","message":"Off-topic: hey, this isn\u0027t actually useful, is it?","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":1692,"context_line":"            if not resp:"},{"line_number":1693,"context_line":"                continue"},{"line_number":1694,"context_line":"            response.append(resp)"},{"line_number":1695,"context_line":"            statuses.append(resp[0])"},{"line_number":1696,"context_line":"        while len(response) \u003c node_number:"},{"line_number":1697,"context_line":"            response.append((HTTP_SERVICE_UNAVAILABLE, \u0027\u0027, \u0027\u0027, b\u0027\u0027))"},{"line_number":1698,"context_line":"        statuses, reasons, resp_headers, bodies \u003d zip(*response)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_c63c51c1","line":1695,"range":{"start_line":1695,"start_character":12,"end_line":1695,"end_character":36},"in_reply_to":"9fdfeff1_d1d88e80","updated":"2019-02-06 21:34:30.000000000","message":"Well, I tried not to merge fixes with porting to py3.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":1694,"context_line":"            response.append(resp)"},{"line_number":1695,"context_line":"            statuses.append(resp[0])"},{"line_number":1696,"context_line":"        while len(response) \u003c node_number:"},{"line_number":1697,"context_line":"            response.append((HTTP_SERVICE_UNAVAILABLE, \u0027\u0027, \u0027\u0027, b\u0027\u0027))"},{"line_number":1698,"context_line":"        statuses, reasons, resp_headers, bodies \u003d zip(*response)"},{"line_number":1699,"context_line":"        return self.best_response(req, statuses, reasons, bodies,"},{"line_number":1700,"context_line":"                                  \u0027%s %s\u0027 % (self.server_type, req.method),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_7190c296","line":1697,"range":{"start_line":1697,"start_character":59,"end_line":1697,"end_character":61},"updated":"2019-02-06 19:56:33.000000000","message":"Off-topic: is resp_headers really a *string*? I was expecting a dict...","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":1694,"context_line":"            response.append(resp)"},{"line_number":1695,"context_line":"            statuses.append(resp[0])"},{"line_number":1696,"context_line":"        while len(response) \u003c node_number:"},{"line_number":1697,"context_line":"            response.append((HTTP_SERVICE_UNAVAILABLE, \u0027\u0027, \u0027\u0027, b\u0027\u0027))"},{"line_number":1698,"context_line":"        statuses, reasons, resp_headers, bodies \u003d zip(*response)"},{"line_number":1699,"context_line":"        return self.best_response(req, statuses, reasons, bodies,"},{"line_number":1700,"context_line":"                                  \u0027%s %s\u0027 % (self.server_type, req.method),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_4651410e","line":1697,"range":{"start_line":1697,"start_character":59,"end_line":1697,"end_character":61},"in_reply_to":"9fdfeff1_7190c296","updated":"2019-02-06 21:34:30.000000000","message":"Ditto, I didn\u0027t stop to think about it.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"    # the index of the first byte of the first fragment"},{"line_number":1565,"context_line":"    fragment_start \u003d (("},{"line_number":1566,"context_line":"        segment_start // segment_size * fragment_size)"},{"line_number":1567,"context_line":"        if segment_start is not None else None)"},{"line_number":1568,"context_line":"    # the index of the last byte of the last fragment"},{"line_number":1569,"context_line":"    fragment_end \u003d ("}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_71be8200","line":1566,"range":{"start_line":1566,"start_character":22,"end_line":1566,"end_character":24},"updated":"2019-02-06 19:56:33.000000000","message":"I wonder if we should start dropping\n\n from __future__ import division\n\neverywhere, just to force the issue... but maybe that\u0027d just lead to the same headaches we had with unicode_literals.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":1563,"context_line":""},{"line_number":1564,"context_line":"    # the index of the first byte of the first fragment"},{"line_number":1565,"context_line":"    fragment_start \u003d (("},{"line_number":1566,"context_line":"        segment_start // segment_size * fragment_size)"},{"line_number":1567,"context_line":"        if segment_start is not None else None)"},{"line_number":1568,"context_line":"    # the index of the last byte of the last fragment"},{"line_number":1569,"context_line":"    fragment_end \u003d ("}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_46886170","line":1566,"range":{"start_line":1566,"start_character":22,"end_line":1566,"end_character":24},"in_reply_to":"9fdfeff1_71be8200","updated":"2019-02-06 21:34:30.000000000","message":"Yeah, I\u0027d rather fix them one by one. We have some floating point divisions right in this file. Remember that our replication factor is a float now.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"}],"test/unit/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"        expect_headers \u003d next(expect_headers_iter)"},{"line_number":1046,"context_line":"        timestamp \u003d next(timestamps_iter)"},{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"        if isinstance(status, int) and status \u003c\u003d 0:"},{"line_number":1049,"context_line":"            raise HTTPException()"},{"line_number":1050,"context_line":"        if body_iter is None:"},{"line_number":1051,"context_line":"            body \u003d static_body or b\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_914be6ae","line":1048,"updated":"2019-02-06 19:56:33.000000000","message":"OK, I\u0027m reasonably content that this comparison could only ever have been true if status were an int:\n\n \u003e\u003e\u003e Exception \u003c\u003d 0\n False\n \u003e\u003e\u003e Exception() \u003c\u003d 0\n False\n \u003e\u003e\u003e Exception(-1) \u003c\u003d 0\n False\n \u003e\u003e\u003e (0, 0) \u003c\u003d 0\n False","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"        expect_headers \u003d next(expect_headers_iter)"},{"line_number":1046,"context_line":"        timestamp \u003d next(timestamps_iter)"},{"line_number":1047,"context_line":""},{"line_number":1048,"context_line":"        if isinstance(status, int) and status \u003c\u003d 0:"},{"line_number":1049,"context_line":"            raise HTTPException()"},{"line_number":1050,"context_line":"        if body_iter is None:"},{"line_number":1051,"context_line":"            body \u003d static_body or b\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_e6f15503","line":1048,"in_reply_to":"9fdfeff1_914be6ae","updated":"2019-02-06 21:34:30.000000000","message":"Yea, but tests stuff tuples like (100, Exception) into this, as well as instances of FakeStatus. Both order in py2 as if they were their memory addresses or id(), but become unorderable on py3. This check weeds those out. I think it\u0027s correct, neither of tuples or FakeStatus can ever be zero or less.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":1260,"context_line":"        if six.PY3:"},{"line_number":1261,"context_line":"            self.assertIn(req.swift_entity_path, log_lines[0])"},{"line_number":1262,"context_line":"        else:"},{"line_number":1263,"context_line":"            self.assertIn(req.swift_entity_path.decode(\u0027utf-8\u0027), log_lines[0])"},{"line_number":1264,"context_line":"        self.assertIn(\u0027re: Expect: 100-continue\u0027, log_lines[0])"},{"line_number":1265,"context_line":""},{"line_number":1266,"context_line":"    def test_PUT_get_expect_errors_with_unicode_path(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_b10cea42","line":1263,"updated":"2019-02-06 19:56:33.000000000","message":"I wonder if we should be more explicit here... it\u0027s not clear to me what\u0027s actually getting logged, or even what type it should have :-/","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":1260,"context_line":"        if six.PY3:"},{"line_number":1261,"context_line":"            self.assertIn(req.swift_entity_path, log_lines[0])"},{"line_number":1262,"context_line":"        else:"},{"line_number":1263,"context_line":"            self.assertIn(req.swift_entity_path.decode(\u0027utf-8\u0027), log_lines[0])"},{"line_number":1264,"context_line":"        self.assertIn(\u0027re: Expect: 100-continue\u0027, log_lines[0])"},{"line_number":1265,"context_line":""},{"line_number":1266,"context_line":"    def test_PUT_get_expect_errors_with_unicode_path(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_26d19d58","line":1263,"in_reply_to":"9fdfeff1_b10cea42","updated":"2019-02-06 21:34:30.000000000","message":"Do you mean the \"with /blah\" part of the log message? The status is logged, so you can see if it\u0027s 400 or 500.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":1353,"context_line":"            self.assertIn(\"ERROR 500 b\u0027\u0027 From Object Server\", log_lines[0])"},{"line_number":1354,"context_line":"            self.assertIn(req.path, log_lines[0])"},{"line_number":1355,"context_line":"        else:"},{"line_number":1356,"context_line":"            self.assertIn(\u0027ERROR 500  From Object Server\u0027, log_lines[0])"},{"line_number":1357,"context_line":"            self.assertIn(req.path.decode(\u0027utf-8\u0027), log_lines[0])"},{"line_number":1358,"context_line":""},{"line_number":1359,"context_line":"    def test_DELETE_errors(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_8c18ad75","line":1356,"range":{"start_line":1356,"start_character":36,"end_line":1356,"end_character":38},"updated":"2019-02-06 19:56:33.000000000","message":"Your comment makes me think we may want a %r, so we see the bad chars on py2 as well...","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":1353,"context_line":"            self.assertIn(\"ERROR 500 b\u0027\u0027 From Object Server\", log_lines[0])"},{"line_number":1354,"context_line":"            self.assertIn(req.path, log_lines[0])"},{"line_number":1355,"context_line":"        else:"},{"line_number":1356,"context_line":"            self.assertIn(\u0027ERROR 500  From Object Server\u0027, log_lines[0])"},{"line_number":1357,"context_line":"            self.assertIn(req.path.decode(\u0027utf-8\u0027), log_lines[0])"},{"line_number":1358,"context_line":""},{"line_number":1359,"context_line":"    def test_DELETE_errors(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_46d62152","line":1356,"range":{"start_line":1356,"start_character":36,"end_line":1356,"end_character":38},"in_reply_to":"9fdfeff1_8c18ad75","updated":"2019-02-06 21:34:30.000000000","message":"Maybe a useful change to py2 indeed.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":1925,"context_line":"            obj_part, footer_part \u003d mime_parts"},{"line_number":1926,"context_line":""},{"line_number":1927,"context_line":"            self.assertEqual(obj_part[\u0027X-Document\u0027], \u0027object body\u0027)"},{"line_number":1928,"context_line":"            self.assertEqual(test_body, obj_part.get_payload(decode\u003dTrue))"},{"line_number":1929,"context_line":""},{"line_number":1930,"context_line":"            # validate footer metadata"},{"line_number":1931,"context_line":"            self.assertEqual(footer_part[\u0027X-Document\u0027], \u0027object metadata\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_8cbbcd0c","line":1928,"range":{"start_line":1928,"start_character":61,"end_line":1928,"end_character":72},"updated":"2019-02-06 19:56:33.000000000","message":"That seems... weird...\n\ntest_body is still bytes, right? So what\u0027s with the decode? I would\u0027ve expected that to get us native strings...\n\nBut applying\n\n diff --git a/test/unit/proxy/controllers/test_obj.py b/test/unit/proxy/controllers/test_obj.py\n index 8e4326e00..fd0c44510 100644\n --- a/test/unit/proxy/controllers/test_obj.py\n +++ b/test/unit/proxy/controllers/test_obj.py\n @@ -1940,6 +1940,9 @@ class TestReplicatedObjControllerMimePutter(BaseObjectControllerMixin,\n      def test_PUT_with_body_and_footers(self):\n          self._test_PUT_with_footers(test_body\u003db\u0027asdf\u0027)\n \n +    def test_PUT_with_non_utf8_body_and_footers(self):\n +        self._test_PUT_with_footers(test_body\u003db\u0027\\xff\u0027)\n +\n      def test_PUT_with_no_body_and_footers(self):\n          self._test_PUT_with_footers()\n\nwe still pass on py3, so... I guess it\u0027s cool?","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":1925,"context_line":"            obj_part, footer_part \u003d mime_parts"},{"line_number":1926,"context_line":""},{"line_number":1927,"context_line":"            self.assertEqual(obj_part[\u0027X-Document\u0027], \u0027object body\u0027)"},{"line_number":1928,"context_line":"            self.assertEqual(test_body, obj_part.get_payload(decode\u003dTrue))"},{"line_number":1929,"context_line":""},{"line_number":1930,"context_line":"            # validate footer metadata"},{"line_number":1931,"context_line":"            self.assertEqual(footer_part[\u0027X-Document\u0027], \u0027object metadata\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_865089d6","line":1928,"range":{"start_line":1928,"start_character":61,"end_line":1928,"end_character":72},"in_reply_to":"9fdfeff1_8cbbcd0c","updated":"2019-02-06 21:34:30.000000000","message":"Without this decode thing, the output is that surrogate-escape sting that I whined about on IRC.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":2012,"context_line":"                             timestamp\u003dNone):"},{"line_number":2013,"context_line":"        policy \u003d policy or self.policy"},{"line_number":2014,"context_line":"        if isinstance(pattern, six.text_type):"},{"line_number":2015,"context_line":"            pattern \u003d pattern.encode(\u0027utf-8\u0027)"},{"line_number":2016,"context_line":"        test_body \u003d pattern * policy.ec_segment_size"},{"line_number":2017,"context_line":"        test_body \u003d test_body[:-random.randint(1, 1000)]"},{"line_number":2018,"context_line":"        return make_ec_object_stub(test_body, policy, timestamp)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_4c0965db","line":2015,"updated":"2019-02-06 19:56:33.000000000","message":"I woulda been tempted to just force callers to pass bytes... but I suppose that would\u0027ve been a lot more churn.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":2012,"context_line":"                             timestamp\u003dNone):"},{"line_number":2013,"context_line":"        policy \u003d policy or self.policy"},{"line_number":2014,"context_line":"        if isinstance(pattern, six.text_type):"},{"line_number":2015,"context_line":"            pattern \u003d pattern.encode(\u0027utf-8\u0027)"},{"line_number":2016,"context_line":"        test_body \u003d pattern * policy.ec_segment_size"},{"line_number":2017,"context_line":"        test_body \u003d test_body[:-random.randint(1, 1000)]"},{"line_number":2018,"context_line":"        return make_ec_object_stub(test_body, policy, timestamp)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_065ed9e5","line":2015,"in_reply_to":"9fdfeff1_4c0965db","updated":"2019-02-06 21:34:30.000000000","message":"That was my thought too. I started by adding b\u0027\u0027 everywhere and then though Ewwwwww. I remember that you were not happy when I insisted on doing the same to HTTPException, but it really did help there IMHO.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":2121,"context_line":"    def _add_frag_index(self, index, headers):"},{"line_number":2122,"context_line":"        # helper method to add a frag index header to an existing header dict"},{"line_number":2123,"context_line":"        hdr_name \u003d \u0027X-Object-Sysmeta-Ec-Frag-Index\u0027"},{"line_number":2124,"context_line":"        return dict(list(headers.items()) + [(hdr_name, index)])"},{"line_number":2125,"context_line":""},{"line_number":2126,"context_line":"    def test_determine_chunk_destinations(self):"},{"line_number":2127,"context_line":"        class FakePutter(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_cc1d5510","line":2124,"updated":"2019-02-06 19:56:33.000000000","message":"Or maybe\n\n result \u003d dict(headers)\n result[\u0027X-Object-Sysmeta-Ec-Frag-Index\u0027] \u003d index\n return result\n\n? *shrug*","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":2121,"context_line":"    def _add_frag_index(self, index, headers):"},{"line_number":2122,"context_line":"        # helper method to add a frag index header to an existing header dict"},{"line_number":2123,"context_line":"        hdr_name \u003d \u0027X-Object-Sysmeta-Ec-Frag-Index\u0027"},{"line_number":2124,"context_line":"        return dict(list(headers.items()) + [(hdr_name, index)])"},{"line_number":2125,"context_line":""},{"line_number":2126,"context_line":"    def test_determine_chunk_destinations(self):"},{"line_number":2127,"context_line":"        class FakePutter(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_a6e58d0c","line":2124,"in_reply_to":"9fdfeff1_cc1d5510","updated":"2019-02-06 21:34:30.000000000","message":"Indeed that would clarify the code. BTW, is index an int or string...","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":3007,"context_line":"        # frags for obj2 exists so will fetch them, requiring another 10"},{"line_number":3008,"context_line":"        # directed requests."},{"line_number":3009,"context_line":"        obj2 \u003d self._make_ec_object_stub(pattern\u003d\u0027obj2\u0027, timestamp\u003dself.ts())"},{"line_number":3010,"context_line":"        obj1 \u003d self._make_ec_object_stub(pattern\u003d\u0027obj1\u0027, timestamp\u003dself.ts())"},{"line_number":3011,"context_line":""},{"line_number":3012,"context_line":"        node_frags \u003d ["},{"line_number":3013,"context_line":"            [{\u0027obj\u0027: obj1, \u0027frag\u0027: 0, \u0027durable\u0027: False}],  # obj2 missing"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_eca93990","line":3010,"updated":"2019-02-06 19:56:33.000000000","message":"Oh, but we\u0027re doing a bunch of churn with these *anyways*... meh. Oh well.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":3007,"context_line":"        # frags for obj2 exists so will fetch them, requiring another 10"},{"line_number":3008,"context_line":"        # directed requests."},{"line_number":3009,"context_line":"        obj2 \u003d self._make_ec_object_stub(pattern\u003d\u0027obj2\u0027, timestamp\u003dself.ts())"},{"line_number":3010,"context_line":"        obj1 \u003d self._make_ec_object_stub(pattern\u003d\u0027obj1\u0027, timestamp\u003dself.ts())"},{"line_number":3011,"context_line":""},{"line_number":3012,"context_line":"        node_frags \u003d ["},{"line_number":3013,"context_line":"            [{\u0027obj\u0027: obj1, \u0027frag\u0027: 0, \u0027durable\u0027: False}],  # obj2 missing"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_c6cbf16f","line":3010,"in_reply_to":"9fdfeff1_eca93990","updated":"2019-02-06 21:34:30.000000000","message":"I dunno, I actually like these better and it\u0027s 100% equivalent on py2. A little bit of indirection, but not too bad.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":3202,"context_line":"                                                frag_archive_size),"},{"line_number":3203,"context_line":"            \u0027X-Object-Sysmeta-Ec-Content-Length\u0027: len(ec_stub[\u0027body\u0027]),"},{"line_number":3204,"context_line":"            \u0027X-Object-Sysmeta-Ec-Etag\u0027: ec_stub[\u0027etag\u0027],"},{"line_number":3205,"context_line":"            \u0027X-Timestamp\u0027: Timestamp(self.ts()).normal,"},{"line_number":3206,"context_line":"        }"},{"line_number":3207,"context_line":"        responses \u003d ["},{"line_number":3208,"context_line":"            StubResponse(206, frag_archives[0][:fragment_size], headers, 0),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_0c883d1d","line":3205,"range":{"start_line":3205,"start_character":27,"end_line":3205,"end_character":36},"updated":"2019-02-06 19:56:33.000000000","message":"ts already returns a Timetamp, yeah? should this just use\n\n self.ts().normal\n\n?","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":3202,"context_line":"                                                frag_archive_size),"},{"line_number":3203,"context_line":"            \u0027X-Object-Sysmeta-Ec-Content-Length\u0027: len(ec_stub[\u0027body\u0027]),"},{"line_number":3204,"context_line":"            \u0027X-Object-Sysmeta-Ec-Etag\u0027: ec_stub[\u0027etag\u0027],"},{"line_number":3205,"context_line":"            \u0027X-Timestamp\u0027: Timestamp(self.ts()).normal,"},{"line_number":3206,"context_line":"        }"},{"line_number":3207,"context_line":"        responses \u003d ["},{"line_number":3208,"context_line":"            StubResponse(206, frag_archives[0][:fragment_size], headers, 0),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_26a0bda5","line":3205,"range":{"start_line":3205,"start_character":27,"end_line":3205,"end_character":36},"in_reply_to":"9fdfeff1_0c883d1d","updated":"2019-02-06 21:34:30.000000000","message":"That thought crossed my mind. But it\u0027s a fix.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":3563,"context_line":"                   \u0027X-Object-Sysmeta-Ec-Etag\u0027: \u0027foo\u0027}"},{"line_number":3564,"context_line":""},{"line_number":3565,"context_line":"        # sucsessful HEAD"},{"line_number":3566,"context_line":"        responses \u003d [(200, b\u0027\u0027, headers)]"},{"line_number":3567,"context_line":"        status_codes, body_iter, headers \u003d zip(*responses)"},{"line_number":3568,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027HEAD\u0027)"},{"line_number":3569,"context_line":"        with set_http_connect(*status_codes, body_iter\u003dbody_iter,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_acca514c","line":3566,"range":{"start_line":3566,"start_character":27,"end_line":3566,"end_character":30},"updated":"2019-02-06 19:56:33.000000000","message":"Not [b\u0027\u0027] like on L3517?\n\nEh, no worse than before, anyway... good thing we don\u0027t provide a body though.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":3563,"context_line":"                   \u0027X-Object-Sysmeta-Ec-Etag\u0027: \u0027foo\u0027}"},{"line_number":3564,"context_line":""},{"line_number":3565,"context_line":"        # sucsessful HEAD"},{"line_number":3566,"context_line":"        responses \u003d [(200, b\u0027\u0027, headers)]"},{"line_number":3567,"context_line":"        status_codes, body_iter, headers \u003d zip(*responses)"},{"line_number":3568,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027HEAD\u0027)"},{"line_number":3569,"context_line":"        with set_http_connect(*status_codes, body_iter\u003dbody_iter,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_a6a10d98","line":3566,"range":{"start_line":3566,"start_character":27,"end_line":3566,"end_character":30},"in_reply_to":"9fdfeff1_acca514c","updated":"2019-02-06 21:34:30.000000000","message":"There\u0027s a ton of places where body is b\u0027asdf\u0027, so parts are resilient to getting int() from a sequence of bytes().","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":3755,"context_line":"        self.assertLessEqual(len(log), self.replicas())"},{"line_number":3756,"context_line":"        self.assertEqual(len(collected_responses), 1)"},{"line_number":3757,"context_line":""},{"line_number":3758,"context_line":"        etag, frags \u003d list(collected_responses.items())[0]"},{"line_number":3759,"context_line":"        # the backend requests will stop at enough ec_ndata responses"},{"line_number":3760,"context_line":"        self.assertEqual("},{"line_number":3761,"context_line":"            len(frags), self.policy.ec_ndata,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_ec8139c5","line":3758,"updated":"2019-02-06 19:56:33.000000000","message":"Yeah, this probably *is* more clear than\n\n (etag, frags), \u003d collected_responses.items()","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":3755,"context_line":"        self.assertLessEqual(len(log), self.replicas())"},{"line_number":3756,"context_line":"        self.assertEqual(len(collected_responses), 1)"},{"line_number":3757,"context_line":""},{"line_number":3758,"context_line":"        etag, frags \u003d list(collected_responses.items())[0]"},{"line_number":3759,"context_line":"        # the backend requests will stop at enough ec_ndata responses"},{"line_number":3760,"context_line":"        self.assertEqual("},{"line_number":3761,"context_line":"            len(frags), self.policy.ec_ndata,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_06b6d9da","line":3758,"in_reply_to":"9fdfeff1_ec8139c5","updated":"2019-02-06 21:34:30.000000000","message":"Either way.","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"37e006ba7d5cf0ddec5742659be4e225c1f3320e","unresolved":false,"context_lines":[{"line_number":3871,"context_line":"        self.assertEqual(len(list(collected_responses.keys())), 3)"},{"line_number":3872,"context_line":"        self.assertIn(obj1[\u0027etag\u0027], collected_responses)"},{"line_number":3873,"context_line":"        self.assertIn(obj2[\u0027etag\u0027], collected_responses)"},{"line_number":3874,"context_line":"        self.assertIn(None, collected_responses)"},{"line_number":3875,"context_line":""},{"line_number":3876,"context_line":"        # ... regardless we should never need to fetch more than ec_ndata"},{"line_number":3877,"context_line":"        # frags for any given etag"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_ac6b311d","line":3874,"updated":"2019-02-06 19:56:33.000000000","message":"Alternatively,\n\n self.assertEqual({obj1[\u0027etag\u0027], obj2[\u0027etag\u0027], None},\n                  set(collected_responses))","commit_id":"988e719232681761dcbbef91733b91382ada58c4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"56f260bd9808939d0a326e2e0cc2f760978a01e6","unresolved":false,"context_lines":[{"line_number":3871,"context_line":"        self.assertEqual(len(list(collected_responses.keys())), 3)"},{"line_number":3872,"context_line":"        self.assertIn(obj1[\u0027etag\u0027], collected_responses)"},{"line_number":3873,"context_line":"        self.assertIn(obj2[\u0027etag\u0027], collected_responses)"},{"line_number":3874,"context_line":"        self.assertIn(None, collected_responses)"},{"line_number":3875,"context_line":""},{"line_number":3876,"context_line":"        # ... regardless we should never need to fetch more than ec_ndata"},{"line_number":3877,"context_line":"        # frags for any given etag"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_c6c77145","line":3874,"in_reply_to":"9fdfeff1_ac6b311d","updated":"2019-02-06 21:34:30.000000000","message":"Wait, that works? Why are we sorting in the existing code then?","commit_id":"988e719232681761dcbbef91733b91382ada58c4"}]}
