Azure / azure-storage-python

Microsoft Azure Storage Library for Python
https://azure-storage.readthedocs.io
MIT License
338 stars 240 forks source link

When using user-defined retry callback, StorageClient._perform_request trips over undefined attribute context.count #568

Open rfernand2 opened 5 years ago

rfernand2 commented 5 years ago

Which service(blob, file, queue) does this issue concern?

blob

Which version of the SDK was used? Please provide the output of pip freeze.

azure-batch==6.0.0 azure-common==1.1.18 azure-storage-blob==1.4.0 azure-storage-common==1.4.0 azure-storage-file==1.4.0

What problem was encountered?

I defined a retry callback and set client.retry to use it. After the first retry callback on the error being handled (status=409), wherein my callback returned 10, I get the error shown below.

Analysis

_perform_request seems to be treating context.count field as a non-required but recognized property (line 391), but then references it unconditionally (line 418). If it is going to be referenced like this, it should probably just become a standard property of RetryContext class. As it is, its hard for a developer writing their own retry callback to know about this dependency.

Stack Trace

traceback (most recent call last): File "xt_test.py", line 114, in store_test(xt) File "xt_test.py", line 21, in store_test xt.create_workspace(ws_name) File "c:\github\ExperimentTools\xt\xt_store.py", line 65, in create_workspace self.helper.create_workspace(ws_name, description) File "c:\github\ExperimentTools\xt\xt_azure_store_blob.py", line 85, in create_workspace result = self.bs.create_container(ws_name) File "C:\Users\Roland\AppData\Local\Continuum\anaconda3\envs\exper\lib\site-packages\azure\storage\blob\baseblobservice.py", line 630, in create_container self._perform_request(request, expected_errors=[_CONTAINER_ALREADY_EXISTS_ERROR_CODE]) File "C:\Users\Roland\AppData\Local\Continuum\anaconda3\envs\exper\lib\site-packages\azure\storage\common\storageclient.py", line 418, in _perform_request retry_context.count, AttributeError: 'RetryContext' object has no attribute 'count'

Have you found a mitigation/solution?

Once you know to do it, a "count" property set to 0 can just be created on the retry_context argument of the custom retry callback.

Note: for table service, please post the issue here instead: https://github.com/Azure/azure-cosmosdb-python.

zezha-msft commented 5 years ago

Hi @rfernand2, thank you for the feedback!

I've taken a look and that part of the code is indeed pretty strange. I've logged an item to improve it. Thanks!