Skip to content

Commit 692c819

Browse files
authored
disable retry (#17078)
* disable retry * update * Updates
1 parent 1025c0b commit 692c819

File tree

7 files changed

+161
-253
lines changed

7 files changed

+161
-253
lines changed

sdk/core/azure-core/CHANGELOG.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
- Added `azure.core.messaging.CloudEvent` model that follows the cloud event spec.
88
- Added `azure.core.serialization.NULL` sentinel value
9+
- Improve `repr`s for `HttpRequest` and `HttpResponse`s #16972
910

1011
### Bug Fixes
1112

12-
- Improve `repr`s for `HttpRequest` and `HttpResponse`s #16972
13+
- Disable retry in stream downloading. (thanks to @jochen-ott-by @hoffmann for the contribution) #16723
1314

1415
## 1.11.0 (2021-02-08)
1516

sdk/core/azure-core/azure/core/pipeline/transport/_aiohttp.py

+15-39
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,7 @@
3030
import asyncio
3131
import aiohttp
3232
from multidict import CIMultiDict
33-
34-
from requests.exceptions import (
35-
ChunkedEncodingError,
36-
StreamConsumedError)
33+
from requests.exceptions import StreamConsumedError
3734

3835
from azure.core.configuration import ConnectionConfiguration
3936
from azure.core.exceptions import ServiceRequestError, ServiceResponseError
@@ -215,41 +212,20 @@ def __len__(self):
215212
return self.content_length
216213

217214
async def __anext__(self):
218-
retry_active = True
219-
retry_total = 3
220-
retry_interval = 1 # 1 second
221-
while retry_active:
222-
try:
223-
chunk = await self.response.internal_response.content.read(self.block_size)
224-
if not chunk:
225-
raise _ResponseStopIteration()
226-
self.downloaded += self.block_size
227-
return chunk
228-
except _ResponseStopIteration:
229-
self.response.internal_response.close()
230-
raise StopAsyncIteration()
231-
except (ChunkedEncodingError, ConnectionError):
232-
retry_total -= 1
233-
if retry_total <= 0:
234-
retry_active = False
235-
else:
236-
await asyncio.sleep(retry_interval)
237-
headers = {'range': 'bytes=' + str(self.downloaded) + '-'}
238-
resp = await self.pipeline.run(self.request, stream=True, headers=headers)
239-
if resp.http_response.status_code == 416:
240-
raise
241-
chunk = await self.response.internal_response.content.read(self.block_size)
242-
if not chunk:
243-
raise StopAsyncIteration()
244-
self.downloaded += len(chunk)
245-
return chunk
246-
continue
247-
except StreamConsumedError:
248-
raise
249-
except Exception as err:
250-
_LOGGER.warning("Unable to stream download: %s", err)
251-
self.response.internal_response.close()
252-
raise
215+
try:
216+
chunk = await self.response.internal_response.content.read(self.block_size)
217+
if not chunk:
218+
raise _ResponseStopIteration()
219+
return chunk
220+
except _ResponseStopIteration:
221+
self.response.internal_response.close()
222+
raise StopAsyncIteration()
223+
except StreamConsumedError:
224+
raise
225+
except Exception as err:
226+
_LOGGER.warning("Unable to stream download: %s", err)
227+
self.response.internal_response.close()
228+
raise
253229

254230
class AioHttpTransportResponse(AsyncHttpResponse):
255231
"""Methods for accessing response body data.

sdk/core/azure-core/azure/core/pipeline/transport/_requests_asyncio.py

+18-44
Original file line numberDiff line numberDiff line change
@@ -155,50 +155,24 @@ def __len__(self):
155155

156156
async def __anext__(self):
157157
loop = _get_running_loop()
158-
retry_active = True
159-
retry_total = 3
160-
retry_interval = 1 # 1 second
161-
while retry_active:
162-
try:
163-
chunk = await loop.run_in_executor(
164-
None,
165-
_iterate_response_content,
166-
self.iter_content_func,
167-
)
168-
if not chunk:
169-
raise _ResponseStopIteration()
170-
self.downloaded += self.block_size
171-
return chunk
172-
except _ResponseStopIteration:
173-
self.response.internal_response.close()
174-
raise StopAsyncIteration()
175-
except (requests.exceptions.ChunkedEncodingError,
176-
requests.exceptions.ConnectionError):
177-
retry_total -= 1
178-
if retry_total <= 0:
179-
retry_active = False
180-
else:
181-
await asyncio.sleep(retry_interval)
182-
headers = {'range': 'bytes=' + str(self.downloaded) + '-'}
183-
resp = self.pipeline.run(self.request, stream=True, headers=headers)
184-
if resp.status_code == 416:
185-
raise
186-
chunk = await loop.run_in_executor(
187-
None,
188-
_iterate_response_content,
189-
self.iter_content_func,
190-
)
191-
if not chunk:
192-
raise StopIteration()
193-
self.downloaded += len(chunk)
194-
return chunk
195-
continue
196-
except requests.exceptions.StreamConsumedError:
197-
raise
198-
except Exception as err:
199-
_LOGGER.warning("Unable to stream download: %s", err)
200-
self.response.internal_response.close()
201-
raise
158+
try:
159+
chunk = await loop.run_in_executor(
160+
None,
161+
_iterate_response_content,
162+
self.iter_content_func,
163+
)
164+
if not chunk:
165+
raise _ResponseStopIteration()
166+
return chunk
167+
except _ResponseStopIteration:
168+
self.response.internal_response.close()
169+
raise StopAsyncIteration()
170+
except requests.exceptions.StreamConsumedError:
171+
raise
172+
except Exception as err:
173+
_LOGGER.warning("Unable to stream download: %s", err)
174+
self.response.internal_response.close()
175+
raise
202176

203177

204178
class AsyncioRequestsTransportResponse(AsyncHttpResponse, RequestsTransportResponse): # type: ignore

sdk/core/azure-core/azure/core/pipeline/transport/_requests_basic.py

+13-37
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
from __future__ import absolute_import
2727
import logging
2828
from typing import Iterator, Optional, Any, Union, TypeVar
29-
import time
3029
import urllib3 # type: ignore
3130
from urllib3.util.retry import Retry # type: ignore
3231
import requests
@@ -107,7 +106,6 @@ def __init__(self, pipeline, response):
107106
self.block_size = response.block_size
108107
self.iter_content_func = self.response.internal_response.iter_content(self.block_size)
109108
self.content_length = int(response.headers.get('Content-Length', 0))
110-
self.downloaded = 0
111109

112110
def __len__(self):
113111
return self.content_length
@@ -116,42 +114,20 @@ def __iter__(self):
116114
return self
117115

118116
def __next__(self):
119-
retry_active = True
120-
retry_total = 3
121-
retry_interval = 1 # 1 second
122-
while retry_active:
123-
try:
124-
chunk = next(self.iter_content_func)
125-
if not chunk:
126-
raise StopIteration()
127-
self.downloaded += self.block_size
128-
return chunk
129-
except StopIteration:
130-
self.response.internal_response.close()
117+
try:
118+
chunk = next(self.iter_content_func)
119+
if not chunk:
131120
raise StopIteration()
132-
except (requests.exceptions.ChunkedEncodingError,
133-
requests.exceptions.ConnectionError):
134-
retry_total -= 1
135-
if retry_total <= 0:
136-
retry_active = False
137-
else:
138-
time.sleep(retry_interval)
139-
headers = {'range': 'bytes=' + str(self.downloaded) + '-'}
140-
resp = self.pipeline.run(self.request, stream=True, headers=headers)
141-
if resp.http_response.status_code == 416:
142-
raise
143-
chunk = next(self.iter_content_func)
144-
if not chunk:
145-
raise StopIteration()
146-
self.downloaded += len(chunk)
147-
return chunk
148-
continue
149-
except requests.exceptions.StreamConsumedError:
150-
raise
151-
except Exception as err:
152-
_LOGGER.warning("Unable to stream download: %s", err)
153-
self.response.internal_response.close()
154-
raise
121+
return chunk
122+
except StopIteration:
123+
self.response.internal_response.close()
124+
raise StopIteration()
125+
except requests.exceptions.StreamConsumedError:
126+
raise
127+
except Exception as err:
128+
_LOGGER.warning("Unable to stream download: %s", err)
129+
self.response.internal_response.close()
130+
raise
155131
next = __next__ # Python 2 compatibility.
156132

157133

sdk/core/azure-core/azure/core/pipeline/transport/_requests_trio.py

+22-52
Original file line numberDiff line numberDiff line change
@@ -68,59 +68,29 @@ def __len__(self):
6868
return self.content_length
6969

7070
async def __anext__(self):
71-
retry_active = True
72-
retry_total = 3
73-
while retry_active:
71+
try:
7472
try:
75-
try:
76-
chunk = await trio.to_thread.run_sync(
77-
_iterate_response_content,
78-
self.iter_content_func,
79-
)
80-
except AttributeError: # trio < 0.12.1
81-
chunk = await trio.run_sync_in_worker_thread( # pylint: disable=no-member
82-
_iterate_response_content,
83-
self.iter_content_func,
84-
)
85-
if not chunk:
86-
raise _ResponseStopIteration()
87-
self.downloaded += self.block_size
88-
return chunk
89-
except _ResponseStopIteration:
90-
self.response.internal_response.close()
91-
raise StopAsyncIteration()
92-
except (requests.exceptions.ChunkedEncodingError,
93-
requests.exceptions.ConnectionError):
94-
retry_total -= 1
95-
if retry_total <= 0:
96-
retry_active = False
97-
else:
98-
await trio.sleep(1)
99-
headers = {'range': 'bytes=' + str(self.downloaded) + '-'}
100-
resp = self.pipeline.run(self.request, stream=True, headers=headers)
101-
if resp.status_code == 416:
102-
raise
103-
try:
104-
chunk = await trio.to_thread.run_sync(
105-
_iterate_response_content,
106-
self.iter_content_func,
107-
)
108-
except AttributeError: # trio < 0.12.1
109-
chunk = await trio.run_sync_in_worker_thread( # pylint: disable=no-member
110-
_iterate_response_content,
111-
self.iter_content_func,
112-
)
113-
if not chunk:
114-
raise StopIteration()
115-
self.downloaded += len(chunk)
116-
return chunk
117-
continue
118-
except requests.exceptions.StreamConsumedError:
119-
raise
120-
except Exception as err:
121-
_LOGGER.warning("Unable to stream download: %s", err)
122-
self.response.internal_response.close()
123-
raise
73+
chunk = await trio.to_thread.run_sync(
74+
_iterate_response_content,
75+
self.iter_content_func,
76+
)
77+
except AttributeError: # trio < 0.12.1
78+
chunk = await trio.run_sync_in_worker_thread( # pylint: disable=no-member
79+
_iterate_response_content,
80+
self.iter_content_func,
81+
)
82+
if not chunk:
83+
raise _ResponseStopIteration()
84+
return chunk
85+
except _ResponseStopIteration:
86+
self.response.internal_response.close()
87+
raise StopAsyncIteration()
88+
except requests.exceptions.StreamConsumedError:
89+
raise
90+
except Exception as err:
91+
_LOGGER.warning("Unable to stream download: %s", err)
92+
self.response.internal_response.close()
93+
raise
12494

12595
class TrioRequestsTransportResponse(AsyncHttpResponse, RequestsTransportResponse): # type: ignore
12696
"""Asynchronous streaming of data from the response.

0 commit comments

Comments
 (0)