2013-10-09 5 views
1

복사 얼룩을 시작하는 데 사용하고 복사가 진행되는 동안 대상 얼룩의 몇 바이트 (예 : 처음 512 바이트)를 읽을 수있었습니다. copy blob을 시작한 코드를보고 복사가 진행되는 동안 처음 512 바이트를 읽습니다.CopyBlob API를 통해 시작된 복사가 진행되는 동안 Azure 얼룩 내용을 읽는 중

이제 blobStream.Read는 데이터 버퍼를 실제 바이트가 아닌 0으로 채 웁니다. 나는 최신 azure storage 클라이언트 lib도 시도했지만 출력은 동일합니다. 그러나 복사가 끝나자 마자 실제 바이트를 읽을 수 있습니다.

누군가가 최신 azure storage 서비스에 도입 된 버그인지 그리고 가능한 해결 방법 (있는 경우)을 알려주십시오.

CloudBlobClient client = CloudStorageAccount.Parse(
    string.Format(
     "DefaultEndpointsProtocol={0};AccountName={1};AccountKey={2}", 
     "http", 
     "<destination-account-name>", 
     "<destination-account-key>" 
    ) 
).CreateCloudBlobClient(); 


var vhdsContainer = client.GetContainerReference("<destination-container-name>"); 
CloudBlob destinationBlob = vhdsContainer.GetPageBlobReference("test-1-b5c1d3f4-23d5-40e4-adc7-236553f8d62d-1.vhd"); 
destinationBlob.StartCopyFromBlob(
    new Uri("http://<source-storage>.blob.core.windows.net/<source-container-name>/test-4-d803ca0a-5d98-4be8-8895-2a9d15ec3974-1.vhd"), null, null, null); 


CloudBlob destBlob = vhdsContainer.GetBlobReference("test-1-b5c1d3f4-23d5-40e4-adc7-236553f8d62d-1.vhd"); 
int maxWaitTime = 3*60000;//let's wait for a maximum of 3 minute 
do 
{ 
    destBlob.FetchAttributes(); 
    if (destBlob.CopyState.BytesCopied > 2048 || maxWaitTime <= 0) 
    { 
     break; 
    } 
    maxWaitTime -= 1000; 
    Thread.Sleep(1000); 
} 
while (true); 

var data = new byte[512]; 
using (BlobStream blobStream = destBlob.OpenRead()) 
{ 
    blobStream.Seek(0, System.IO.SeekOrigin.Begin); 
    blobStream.Read(data, 0, 512); 
} 

답변

0

보인다.

CopyState이 :: BytesCopied 복사 바이트 수를 추적하는 데 사용할 수, 사용자는 해당 대상 덩어리가 CopyState에 따라 읽기 :: BytesCopied 준비가 가정해서는 안된다. CopyState :: Status가 'Success'가 된 후에 읽기.

2

이미 알 수 있듯이 BLOB 작업은 비동기식입니다. StartCopyFromBlob에 전화하면 작업이 대기합니다. 작업이 즉시 시작된다는 보장은 없습니다. 이는 복사 작업 시작 직후 의미있는 데이터를 읽을 수없는 이유입니다.

한 가지 가능한 작업은 복사 작업을 호출 한 후 주기적으로 복사 상태를 확인하는 것입니다. 복사 작업이 시작되면 대상 BLOB에서 읽기를 시작할 수 있습니다.

복사 작업이 시작되었는지 확인하려면 루프에서 blob 속성을 가져 와서 blob의 CopyState 속성을 확인하십시오. 몇 바이트가 복사되면 루프에서 벗어날 수 있습니다. 그러나 복사 작업이 적당한 시간 프레임에서 시작되지 않으면 오랜 시간 동안이 루프에서 반복 될 수 있습니다.

그래서 대신하고

:

Thread.Sleep(4000) 

당신이 좋아하는 뭔가를 할 수 : 사용자가 복사 대상 BLOB의 실제 바이트를 읽어 끝날 때까지 기다려야 같은

int maxWaitTime = 10000;//let's wait for a maximum of 10 seconds 
do 
{ 
    destBlob.FetchAttributes(); 
    if (destBlob.CopyState.BytesCopied > 0 || maxWaitTime <= 0) 
    { 
     break; 
    } 
    maxWaitTime -= 1000; 
    Thread.Sleep(1000); 
} 
while (true); 
+0

안녕 Gaurav, 나는 ~ 30 분을 기다렸습니다. CopyState.BytesCopied에서 32212255232 중 31209816064 바이트를 복사 할 수 있습니다. 즉 96 % 복사가 복사됩니다. 이 경우에도 처음 몇 바이트를 읽으면 0이 반환됩니다. 그러나 복사 완료 후 읽기는 실제 바이트를 반환합니다. 이 시나리오는 최근에이 문제를 보았습니다. –

+0

이상 하네. 끝까지 시험해 봅시다. 사용중인 스토리지 클라이언트 라이브러리의 버전은 무엇입니까? –

+0

나는 1.7과 최신 버전 2.1을 모두 시험해 보았습니다. 2.1을 사용할 때 blob 서비스가 '사전 조건 실패'예외를 throw하지 않도록 if-match 헤더를 *로 설정해야합니다. 내 대답을 참조하십시오 http://stackoverflow.com/questions/5094089/azure-blob-the-condition-specified-using-http-conditional-headers-is-not-met/19278398#19278398 –

관련 문제