想知道如果你聰明的人可以幫助我一個正確的錯誤。關於Azure開發存儲在並行上傳塊blob時,我得到「指定的塊已經存在」
我正在上傳blob塊並行,這對於運行在活動存儲上時對存儲器運行非常好,但是對於dev存儲器,我得到偶爾塊的錯誤「指定的blob已經存在」。奇怪/諷刺的是,如果blob 確實已經存在,那麼我從來沒有看到錯誤。
這裏是我的代碼:
var container = _cloudBlobClient.GetContainerReference(containerName);
container.CreateIfNotExist();
CloudBlockBlob blob = container.GetBlockBlobReference(blobname);
// calc number of blocks. Add 1 for remainder
var blockCount = ((int)Math.Floor((double)(length/mainBlockSize))) + 1;
var blockIds = new List<string>();
Parallel.For(0, blockCount, j =>
{
int blockSize = mainBlockSize;
// if the last block then calculate the remaining block size
if (j == blockCount - 1)
blockSize = (int)length - (mainBlockSize * (blockCount - 1));
var bytes = new byte[blockSize];
string blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(j.ToString("00000")));
lock (_mutex)
{
// these operations need to co-exist so the correct block order is maintained
blockIds.Add(blockId);
stream.Read(bytes, 0, blockSize);
}
blob.PutBlock(blockId, new MemoryStream(bytes), null);
});
// commit the blob with the list of blocks
blob.PutBlockList(blockIds);
我試過設置
_cloudBlobClient.ParallelOperationThreadCount = 1;
由這個線程What is the Behaviour of UploadFile-CloudBlockBlob?建議,看它是否會作出任何區別,但它仍然出錯。
Arg!第一次我有一個「現場作品,但不是我的機器bug」! :)
我用Fiddler檢查過所有的存儲請求,Live和Dev之間沒有區別,所以我假設這是一個開發存儲的bug。任何想法如何最好地處理這個?
謝謝!
下面是關於msdn論壇的討論。到目前爲止只有一個建議,即並行化無效,但我相信這是不正確的。 http://tinyurl.com/2arhs7p – Dave 2010-06-24 20:30:35
開發存儲和實存儲有不同的實現,過去我在開發存儲方面遇到了限制。我已經停止使用dev存儲進行大多數開發,直接改爲直接訪問特殊存儲帳戶。這樣我就知道我正在測試一些行爲正確的東西。我建議你做同樣的事情。 – Cellfish 2012-02-03 06:29:53