2015-11-25 4 views
0

Я пытаюсь скопировать blob из исходного местоположения в место назначения в аренду. Для этого я использую модифицированную версию AutoRenewLease. Вот шаги в моем кодеStartCopyFromBlobAsync не поддерживает назначение AccessCondition, если аренда бесконечна

  1. Создание пустого блоб назначения, если пятно не существует
  2. Получить регулярную 30 секунды аренды (который я autorenew) на сгустке с leaseId
  3. Используйте leaseId для создать объект AccessCondition
  4. Передавайте объект AccessCondition к StartCopyFromBlobAsync в destAccessCondition

Фактический результат: удаленный служить r возвратила ошибку: (412) Идентификатор аренды согласован, но указанная аренда должна быть арендой с бесконечным сроком.

Есть ли способ обходить эту проблему и копировать блок без бесконечной аренды.

+0

Есть ли причина, по которой вы хотите приобрести аренду на капоте назначения? –

+0

Да, я хотел бы предотвратить одновременную запись в blob. Я предпочел взять арендную плату за реагирование на 409, если нет другого пути – Yam

+0

Спасибо. Второй вопрос. Есть ли причина, по которой вы не хотите бесконечной аренды на блобе? –

ответ

1

На основании документации here невозможно инициировать операцию копирования блочного кода, где конечный блок управления имеет конечную аренду.

enter image description here

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

Вот один из подходов, о котором я мог подумать: поскольку вы уже сдаете в аренду blob и постоянно обновляете аренду, мое предположение заключается в том, что вы где-то храните этот лизинг (ваша копия VM могла бы сбой в течение этих 30 секунд как Что ж). Итак, что вы можете сделать, это получить бесконечную аренду, сохранить идентификатор аренды на блобе в каком-то постоянном хранилище.

Затем вы постоянно проверяете статус копии капли назначения. Как только капля полностью скопирована, вы можете просто сломать аренду на блобе. Теперь есть возможность (как вы упомянули), чтобы ваша копия VM могла спуститься. В этом случае, как только копия VM вернется в сеть, вы снова начнете проверять статус копии. Также максимальное время, зарезервированное для операции копирования, составляет 2 недели. Если blob не копируется через 2 недели, вы можете просто разорвать договор аренды на этом блобе. Обратите внимание, что вам не нужен наименьший идентификатор при нарушении аренды на блобе.

0

Спасибо за ваше решение Gaurav. Очень странно, что любой может сломать аренду. Вот решение, с которым я решил пойти.

Вместо того, чтобы использовать лизинг на блоках, я проверяю статус 409 (HttpStatusCode.Conflict). Если 2 одновременных потока записываются в один и тот же блок, один из них получит конфликт 409. Я поместил ожидание на этот второй параллельный поток, который получил 409 в течение небольшого периода времени (так как я знаю размер скопированного изображения) и проверю метаданные на blob (progress = "done"). Более ранний поток, выполняющий копию, установит эти метаданные после завершения копирования. Я копирую очень маленькие капли, поэтому такой подход будет работать для меня. Если я не ожидаю появления метаданных, я пропущу второй запрос, чтобы пользователь мог повторить попытку. Я делаю это в соответствии с предположением, что лучше быстро потерпеть неудачу и позволить пользователю повторить попытку, чем ждать неопределенно долго.