Большой двоичный объект хранилища загрузки Azure Python возвращает «Условие, указанное с использованием условных заголовков HTTP, не выполнено».

#python #azure #azure-blob-storage

#python #azure #azure-blob-storage

Вопрос:

С помощью следующего кода:

 
import os
from azure.identity import (
    ClientSecretCredential
)

# Import the client object from the Azure library
from azure.storage.blob import BlobClient

t_id = "<tenant_id>"
c_id = "<client_id>"
s_acct = "<storage_account_name>"
s_acct_url = "%s.blob.core.windows.net" % s_acct
sek = "<client_sekret>"

print("  Setup credentials.")
credential = ClientSecretCredential(t_id, c_id, sek)
print("  Setup Blob Client")
bobc = BlobClient(s_acct_url, <container_name>, <blob_name>,
                  credential=credential)
print("  Setup streamer")
ssd = bobc.download_blob()
print("  Get properties")
print(ssd.get_blob_properties())
 

Но я получаю следующую ошибку:

 $ python azdown.py
  Setting up stream
 
  Download stream:
     Size: 136365212160
Traceback (most recent call last):
  File "C:gitpython38libsite-packagesazurestorageblob_download.py", line 192, in _download_chunk
    _, response = self.client.download(
  File "C:gitpython38libsite-packagesazurestorageblob_generatedoperations_blob_operations.py", line 179, in download
    raise models.StorageErrorException(response, self._deserialize)
azure.storage.blob._generated.models._models_py3.StorageErrorException: Operation returned an invalid status 'The condition specified using HTTP conditional header(s) is not met.'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "azdown.py", line 29, in <module>
    download_stream.download_to_stream(my_blob)
  File "C:gitpython38libsite-packagesazurestorageblob_download.py", line 579, in download_to_stream
    self.readinto(stream)
  File "C:gitpython38libsite-packagesazurestorageblob_download.py", line 561, in readinto
    downloader.process_chunk(chunk)
  File "C:gitpython38libsite-packagesazurestorageblob_download.py", line 125, in process_chunk
    chunk_data = self._download_chunk(chunk_start, chunk_end - 1)
  File "C:gitpython38libsite-packagesazurestorageblob_download.py", line 201, in _download_chunk
    process_storage_error(error)
  File "C:gitpython38libsite-packagesazurestorageblob_sharedresponse_handlers.py", line 147, in process_storage_error
    raise error
azure.core.exceptions.ResourceModifiedError: The condition specified using HTTP conditional header(s) is not met.
RequestId:<request id>
Time:2021-01-10T01:23:24.8981731Z
ErrorCode:ConditionNotMet
Error:None
 

Я просмотрел [1], но я использую download_to_stream() . Затем я попробовал [2], но мое хранилище представляет собой контейнер gen1. Была ссылка на то, что это как-то связано с сетевыми разрешениями контейнера, но контейнер настроен так, чтобы разрешить загрузку всем. Проблема в том, что он загружается до определенной точки (atm, 1.2G из 120G), а затем он прерывается. Так что это не проблема с разрешением, а какое-то условие гонки.

[1] — https://social.msdn.microsoft.com/Forums/azure/en-US/3b4df832-3340-4415-8d93-d71662e1c540/azure-blob-the-condition-specified-using-http-conditional-headers-is-not-met

[2] — https://forums.databricks.com/questions/20415/intermittent-http-error-when-loading-files-from-ad.html

[править]

Я также пытался использовать метод connection_string:

 credential = DefaultAzureCredential()

    blob_url = "DefaultEndpointsProtocol=https;AccountName=<storage_acct>;"   
               "AccountKey=<account_key>;"   
               "EndpointSuffix=core.windows.net"

    # Create the client object using the storage URL and the credential
    blob_client = BlobClient.from_connection_string(
        blob_url,
        container_name=<container_name>,
        blob_name=<blob_item>)

    if download_now:
        with open(<blob_item>, "wb") as my_blob:
            print("  Setting up stream")
            download_stream = blob_client.download_blob()
            print(" ")
            print("  Download stream:")
            print("     Size: %d" % download_stream.size)
            download_stream.download_to_stream(my_blob)

    else:
        print(blob_client.get_blob_properties())
 

Я получаю такую же ошибку даже после того, как она транслировала концерт или около того.

Ошибка:

 Traceback (most recent call last):
  File "C:gitpython38libsite-packagesazurestorageblob_download.py", line 192, in _download_chunk
    _, response = self.client.download(
  File "C:gitpython38libsite-packagesazurestorageblob_generatedoperations_blob_operations.py", line 179, in download
    raise models.StorageErrorException(response, self._deserialize)
azure.storage.blob._generated.models._models_py3.StorageErrorException: Operation returned an invalid status 'The condition specified using HTTP conditional header(s) is not met.'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "azuredl.py", line 52, in <module>
    download_stream.download_to_stream(my_blob)
  File "C:gitpython38libsite-packagesazurestorageblob_download.py", line 579, in download_to_stream
    self.readinto(stream)
  File "C:gitpython38libsite-packagesazurestorageblob_download.py", line 561, in readinto
    downloader.process_chunk(chunk)
  File "C:gitpython38libsite-packagesazurestorageblob_download.py", line 125, in process_chunk
    chunk_data = self._download_chunk(chunk_start, chunk_end - 1)
  File "C:gitpython38libsite-packagesazurestorageblob_download.py", line 201, in _download_chunk
    process_storage_error(error)
  File "C:gitpython38libsite-packagesazurestorageblob_sharedresponse_handlers.py", line 147, in process_storage_error
    raise error
azure.core.exceptions.ResourceModifiedError: The condition specified using HTTP conditional header(s) is not met.
RequestId:<request id>
Time:2021-01-10T07:43:24.4927426Z
ErrorCode:ConditionNotMet
Error:None

 

У кого-нибудь могут быть какие-либо идеи?

Ответ №1:

Я могу повторить эту проблему, когда я делаю некоторые обновления (например, изменяю содержимое или добавляю некоторые метаданные) в загружаемый файл: введите описание изображения здесь

Эта проблема связана с тем, что после обновления большого двоичного объекта его Etag изменяется одновременно. Что вызывает эту проблему. Подробности см. В этом документе .

Чтобы решить эту проблему, вы можете потребовать, чтобы Lise для этого большого двоичного объекта добавлял блокировку, чтобы этот большой двоичный объект не редактировался или не удалялся во время загрузки.

Попробуйте код ниже:

 blob_client = BlobClient.from_connection_string(conn_str='', container_name='',blob_name='')

#require lease that never expires
lease = blob_client.acquire_lease(lease_duration=-1)

with open("<some path>", "wb") as my_blob:
            print("  Setting up stream")
            download_stream = blob_client.download_blob()
            print(" ")
            print("  Download stream:")
            print("     Size: %d" % download_stream.size)
            download_stream.download_to_stream(my_blob)

#break lease after download
lease.break_lease()
 

Комментарии:

1. Спасибо! Я думаю, что это именно то, что облажается. Я не понял (или не запомнил) У меня было что-то, обновляющее этот большой двоичный объект. Здесь сложная проблема.

2. @ewong, рад узнать, что мой пост полезен 🙂