2013-05-23 6 views
5

Ho una situazione in cui copio molti BLOB da un contenitore di memoria a un altro e alcuni dei BLOB sono stati copiati, ma molti di essi sono ancora in sospeso dopo due giorni da quando ho avviato la copia. Sto facendo questa determinazione sulla base del fatto che, se provo a fare qualsiasi cosa con il blob destinazione sto ottenendo l'errore sotto:StartCopyFromBlob in Azure SDK 2.0 che richiede giorni?

Microsoft.WindowsAzure.StorageClient.StorageClientException : There is currently a pending copy operation. ----> System.Net.WebException : The remote server returned an error: (409) Conflict.

C'è qualcosa che posso fare? Ad esempio, posso annullare la copia dopo il fatto?

Ecco il codice di copia che sto usando per eseguire la copia.

try 
{ 
    destinationBlob.StartCopyFromBlob(
     new Uri(sourceBlob.Uri.AbsoluteUri + signature)); 
    System.Diagnostics.Trace.TraceInformation(
     "Copying: {0}", destinationEndpoint.EndpointState.BlobName); 
} 
catch (Exception ex) 
{ 
    var we = ex.InnerException as WebException; 
    if (we != null && we.Status == WebExceptionStatus.ProtocolError) 
    { 
    System.Diagnostics.Trace.TraceError(
      "conflict with blob copy for blob {0}", sourceBlob.Uri.AbsoluteUri); 
     return 0; 
    } 
} 

risposta

8

Come già sapete che Copy Blob operation is now asynchronous. Pertanto, quando si chiama l'operazione StartCopyFromBlob su un BLOB, il servizio di archiviazione BLOB pone l'operazione di copia in una coda. Poiché si tratta di un'operazione asincrona, non sapresti quando verrà elaborata. Da quello che ho capito, che il tempo massimo per questo è di 2 settimane 7 giorni cioè un'operazione di copia può richiedere un massimo di 2 settimane 7 giorni e se non viene completata in 2 settimane 7 giorni, sarà annullato dal servizio.

Ora venendo alle tue domande:

Is there anything i can do about this?

Io non la penso così. Non è possibile modificare la priorità della coda.

For example can i abort the copy after the fact?

Sì, è possibile. Quando si chiama StartCopyFromBlob, si ottiene una stringa che identifica l'operazione di copia (si chiama ID copia). È possibile utilizzare questo ID copia e chiamare l'operazione AbortCopy su quel BLOB. Si potrebbe anche ottenere questo id di copia dopo aver recuperato le proprietà del BLOB usando il metodo FetchAttributes. La proprietà che si desidera controllare è CopyState.

+0

perfetto. proprio quello che dovevo sapere. userà l'id della copia per interrompere dopo il fatto. grazie mille! – chutch

+0

un'ultima domanda però, come si modifica la priorità della coda per quanto riguarda l'operazione di copia? Ho cercato i documenti e non riesco a trovare alcun riferimento a questo. – chutch

+0

Quello era il mio cattivo! Non puoi davvero cambiare la priorità della coda. Quindi, una volta che un lavoro di copia viene messo in coda, attendere il completamento del lavoro o annullare quel lavoro utilizzando AbortCopy. Ho aggiornato la mia risposta. –

Problemi correlati