0

リース中のコピー元の場所からコピー先の場所に BLOB をコピーしようとしています。これを行うために、修正版のAutoRenewLeaseを使用しています。これが私のコードの手順です

  1. BLOB が存在しない場合は、空の宛先 BLOB を作成します
  2. leaseId を使用して、BLOB で通常の 30 秒のリース (自動更新) を取得します。
  3. leaseId を使用して AccessCondition オブジェクトを作成する
  4. AccessCondition オブジェクトを destAccessCondition として StartCopyFromBlobAsync に渡します。

実際の結果: リモート サーバーがエラーを返しました: (412) リース ID は一致しましたが、指定されたリースは無期限のリースでなければなりません。

この問題を回避し、無限リースなしで BLOB をコピーする方法はありますか?

4

2 に答える 2

1

ドキュメントに基づいてhere、コピー先 BLOB のリースが有限である場合、コピー BLOB 操作を開始することはできません。

ここに画像の説明を入力

したがって、リース オプションを使用する場合は、ブロブを無限にリースする必要があります。

考えられるアプローチの 1 つを次に示します。すでに BLOB をリースしており、リースを常に更新しているため、このリース ID をどこかに保存していると思います (コピー VM も 30 秒でクラッシュする可能性があります)。したがって、無限のリースを取得し、BLOB のリース ID を永続的なストレージに保存することができます。

次に、コピー先 BLOB のコピー ステータスを常に確認します。BLOB が完全にコピーされたら、BLOB のリースを簡単に解除できます。(あなたが述べたように) コピー VM がダウンする可能性があります。その場合、コピー VM がオンラインに戻ったら、コピー ステータスのチェックを再度開始します。また、コピー操作に割り当てられる最大時間は 2 週間です。BLOB が 2 週間以内にコピーされない場合は、単純にその BLOB のリースを解除できます。BLOB のリースを解除する場合、最小 ID は必要ないことに注意してください。

于 2015-11-25T18:49:05.857 に答える
0

解決策をありがとう Gaurav. 誰でもリースを破ることができるのは非常に奇妙です。これが私が行くことにした解決策です。

BLOB でリースを使用する代わりに、ステータス 409 (HttpStatusCode.Conflict) を確認します。2 つの同時スレッドが同じ BLOB に書き込むと、そのうちの 1 つで 409 競合が発生します。409 を取得したこの 2 番目の同時スレッドをしばらく待機させ (コピーする BLOB のサイズがわかっているため)、BLOB のメタデータを確認しました (progress = "done")。コピーを実行している以前のスレッドは、コピーが完了すると、このメタデータを設定します。私は非常に小さなブロブをコピーしているので、このアプローチはうまくいきます。メタデータが表示されるのを待ってタイムアウトすると、ユーザーが再試行できるように 2 番目の要求が失敗します。無期限に待つよりも、すばやく失敗してユーザーに再試行させる方がよいという前提でこれを行っています。

于 2015-11-26T02:02:04.050 に答える