Можно ли проверить, есть ли аренда для определенного c Azure большого двоичного объекта, используя Python SDK? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть фрагмент кода, который часто запускается несколькими процессами, в котором определенный blob-файл должен быть обновлен какой-то новой информацией. Поскольку я не хочу, чтобы эти процессы одновременно выполняли запись в этот файл - что могло бы вызвать конфликтные ошибки - я назначил аренду файла, когда процесс начинает его изменять, и хочу разорвать эту аренду, как только он завершит ее изменение.

Теперь проблема в том, что мне нужно проверять для каждого процесса, есть ли уже аренда блоб-файла, и если нет, продолжать ждать, пока аренда не будет нарушена, а затем получить аренду для текущего процесса. Теперь я понимаю, как это можно сделать, запустив следующий код:

stream = io.BytesIO()
if self.blob_service.exists(self.container, self.changelog):
   while True:
       try:
          self.blob_service.acquire_blob_lease(self.container, self.changelog,
                                                         lease_duration=-1)
          break
       except AzureConflictHttpError:
          pass
   self.blob_service.get_blob_to_stream(self.container, self.changelog, stream)
   stream.seek(0)

   .... do some processing and write to blobfile
   self.blob_service.break_blob_lease(self.container, self.changelog)

blob_service - это экземпляр BlockBlobService. Однако это приводит к непрерывному потоку регистрации 2020-04-19 16:19:51,517 ERROR Client-Request-ID=d53b7e6e-8248-11ea-a073-dca90492a6b8 Retry policy did not allow for a retry: Server-Timestamp=Sun, 19 Apr 2020 14:19:50 GMT, Server-Request-ID=c339439f-e01e-0058-1d55-16e3bc000000, HTTP status code=409, Exception=There is already a lease present. ErrorCode: LeaseAlreadyPresent<?xml version="1.0" encoding="utf-8"?>LeaseAlreadyPresent Уже есть арендный договор. RequestId: c339439f-e01e-0058-1d55-16e3bc000000Время: 2020-04-19T14: 19: 51.5047575Z . Это будет go включаться до тех пор, пока процесс 1 не прервет аренду и процесс 2 не сможет получить аренду.

Теперь, конечно, есть способы подавить это ведение журнала, но я бы предпочел сделать что-то подобное.

while True:
    if self.blob_service.blob_has_lease(self.container, self.changelog):
        continue
    else:
        self.blob_service.acquire_blob_lease(self.container, self.changelog,
                                                         lease_duration=-1)

В if self.blob_service.blob_has_lease(self.container, self.changelog) я что-то придумал себя. Однако я никоим образом не могу найти такой метод или свойство для проверки, есть ли у определенного BLOB-объекта аренда на данный момент. Есть ли такой метод или обходной путь, в котором я мог бы написать свой код, как в примере, который я привел выше?

1 Ответ

1 голос
/ 19 апреля 2020

Вы можете вызвать метод get_blob_properties, чтобы получить свойства BLOB-объекта. Если блоб сдан в аренду, вы должны получить некоторое значение в переменной lease в blob's properties.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...