)]}'
{"swiftclient/client.py":[{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"9076e202ce6652342e8a2f278a18a5b005212bd7","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            if self.conn.attempts \u003e self.conn.retries:"},{"line_number":238,"context_line":"                logger.exception(e)"},{"line_number":239,"context_line":"                raise"},{"line_number":240,"context_line":"        expected_length \u003d int(self.resp.getheader(\u0027Content-Length\u0027))"},{"line_number":241,"context_line":"        if (not buf and self.bytes_read \u003c expected_length and"},{"line_number":242,"context_line":"                self.conn.attempts \u003c\u003d self.conn.retries):"},{"line_number":243,"context_line":"            self.headers[\u0027Range\u0027] \u003d \u0027bytes\u003d%d-\u0027 % self.bytes_read"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_d6e890b5","line":240,"range":{"start_line":240,"start_character":8,"end_line":240,"end_character":23},"updated":"2016-01-11 10:48:59.000000000","message":"Unlike the etag, the content-length will change from request to request. So this changes behaviour I think.\n\nA quick test seems to suggest the whole object won\u0027t be downloaded unless we keep using the original content-length.","commit_id":"7172c7177e39723488da277606523da2e31bc89c"},{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"9076e202ce6652342e8a2f278a18a5b005212bd7","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        if (not buf and self.bytes_read \u003c expected_length and"},{"line_number":242,"context_line":"                self.conn.attempts \u003c\u003d self.conn.retries):"},{"line_number":243,"context_line":"            self.headers[\u0027Range\u0027] \u003d \u0027bytes\u003d%d-\u0027 % self.bytes_read"},{"line_number":244,"context_line":"            self.headers[\u0027If-Match\u0027] \u003d self.resp.getheader(\u0027ETag\u0027)"},{"line_number":245,"context_line":"            hdrs, body \u003d self.conn._retry(None, get_object,"},{"line_number":246,"context_line":"                                          self.container, self.obj,"},{"line_number":247,"context_line":"                                          resp_chunk_size\u003dself.chunk_size,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_74e51fa2","line":244,"range":{"start_line":244,"start_character":60,"end_line":244,"end_character":64},"updated":"2016-01-11 10:48:59.000000000","message":"Ok, so each time we check that the etag hasn\u0027t changed from the last try (almost like induction). So the last one must be the same as the first one.","commit_id":"7172c7177e39723488da277606523da2e31bc89c"},{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"7d9de5f4ae23d788af07ee4f0e8847a9bd8cf282","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        if (not buf and self.bytes_read \u003c self.expected_length and"},{"line_number":242,"context_line":"                self.conn.attempts \u003c\u003d self.conn.retries):"},{"line_number":243,"context_line":"            self.headers[\u0027Range\u0027] \u003d \u0027bytes\u003d%d-\u0027 % self.bytes_read"},{"line_number":244,"context_line":"            self.headers[\u0027If-Match\u0027] \u003d self.resp.getheader(\u0027ETag\u0027)"},{"line_number":245,"context_line":"            hdrs, body \u003d self.conn._retry(None, get_object,"},{"line_number":246,"context_line":"                                          self.container, self.obj,"},{"line_number":247,"context_line":"                                          resp_chunk_size\u003dself.chunk_size,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da6ed579_c8529513","line":244,"range":{"start_line":244,"start_character":59,"end_line":244,"end_character":64},"updated":"2016-01-12 18:23:05.000000000","message":"Ok, so in the super-large DLO case (when there is no content-length) there is still an Etag.","commit_id":"5050027610cb4c8f20c85b7c60c1cc7f2c44121c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"640da4ce322857de03ebd5b3de5a27e85af4cf1f","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        if (not buf and self.bytes_read \u003c self.expected_length and"},{"line_number":242,"context_line":"                self.conn.attempts \u003c\u003d self.conn.retries):"},{"line_number":243,"context_line":"            self.headers[\u0027Range\u0027] \u003d \u0027bytes\u003d%d-\u0027 % self.bytes_read"},{"line_number":244,"context_line":"            self.headers[\u0027If-Match\u0027] \u003d self.resp.getheader(\u0027ETag\u0027)"},{"line_number":245,"context_line":"            hdrs, body \u003d self.conn._retry(None, get_object,"},{"line_number":246,"context_line":"                                          self.container, self.obj,"},{"line_number":247,"context_line":"                                          resp_chunk_size\u003dself.chunk_size,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da6ed579_7c732eb2","line":244,"range":{"start_line":244,"start_character":59,"end_line":244,"end_character":64},"in_reply_to":"da6ed579_c8529513","updated":"2016-01-12 18:35:21.000000000","message":"Yes. It\u0027s just not terribly useful as it doesn\u0027t depend on the contents of the large object. In the extra-large DLO (DXLO?) case, Swift falls back to the etag of the manifest itself; typically, this is just md5(\u0027\u0027).hexdigest().","commit_id":"5050027610cb4c8f20c85b7c60c1cc7f2c44121c"},{"author":{"_account_id":455,"name":"Stuart McLaren","email":"stuart.mclaren@hpe.com","username":"stuart-mclaren"},"change_message_id":"aa9c113c729bcdcc60876826d9892d8de0695fba","unresolved":false,"context_lines":[{"line_number":1591,"context_line":"        retry_is_possible \u003d ("},{"line_number":1592,"context_line":"            is_not_range_request and resp_chunk_size and"},{"line_number":1593,"context_line":"            self.attempts \u003c\u003d self.retries and"},{"line_number":1594,"context_line":"            rheaders.get(\u0027transfer-encoding\u0027) is None)"},{"line_number":1595,"context_line":"        if retry_is_possible:"},{"line_number":1596,"context_line":"            body \u003d _RetryBody(body.resp, self, container, obj,"},{"line_number":1597,"context_line":"                              resp_chunk_size\u003dresp_chunk_size,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da6ed579_2ee7cfe5","line":1594,"range":{"start_line":1594,"start_character":35,"end_line":1594,"end_character":43},"updated":"2016-01-12 13:24:59.000000000","message":"Hi Tim,\n\nA quick query (I\u0027m not that familiar with DLOs).\n\nYou\u0027ve added the extra \u0027transfer-encoding\u0027 condition -- is that because a GET of a DLO doesn\u0027t always contain a content-length?\n\nI\u0027ve been approaching the retry from a Glance point of view. Image data can be stored as Swift objects and can often be many GBs. If the retry logic doesn\u0027t work for DLOs that could potentially impact Glance in the future (no retries for image download). Glance will actually know the size of the image it\u0027s trying to download (it\u0027s stored in its database). Maybe we could use that in some way?","commit_id":"5050027610cb4c8f20c85b7c60c1cc7f2c44121c"}],"tests/unit/test_swiftclient.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"01b7cf329390800f98c996810eda415c31c07bc6","unresolved":false,"context_lines":[{"line_number":885,"context_line":"                \u0027if-match\u0027: \u0027some etag\u0027,"},{"line_number":886,"context_line":"                \u0027x-auth-token\u0027: \u0027tToken\u0027,"},{"line_number":887,"context_line":"            }),"},{"line_number":888,"context_line":"        ])"},{"line_number":889,"context_line":""},{"line_number":890,"context_line":"    def test_get_object_with_resp_chunk_size_zero(self):"},{"line_number":891,"context_line":"        def get_connection(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da6ed579_b9518610","line":888,"updated":"2016-01-13 19:53:31.000000000","message":"nice","commit_id":"5050027610cb4c8f20c85b7c60c1cc7f2c44121c"}]}
