CloudDrive: Possible Data Loss when calling Create() or CreateIfNotExist() on existing drives
Windows Azure Drive is in Preview, and we recently identified a timing bug in the CloudDrive Client Library (SDK 1.6 and earlier) which can cause your CloudDrive to be accidentally deleted when you call ‘Create()’ or ‘CreateIfNotExist()’ on an existing drive. For your existing drive to be accidently deleted, there must be a period of unavailability of your Windows Azure Storage account during the call to ‘Create()’ or ‘CreateIfNotExist()’.
Your service is more likely to hit this bug if you frequently call ‘Create()’, which is sometimes done if you use the following pattern where you call ‘Create()’ before you call ‘Mount()’ to ensure that the drive exists before you try to mount it:
try
{
drive.Create(...);
}
catch(CloudDriveException)
{
...
}
drive.Mount(...);
Another common pattern can occur when using the new ‘CreateIfNotExist()’ API followed by a ‘Mount()’ call:
drive.CreateIfNotExist(...);
drive.Mount(...);
We will fix this timing bug in SDK 1.7.
To avoid this timing bug now, you should add a test for the existence of the blob before attempting to create it using the following code:
CloudPageBlob pageBlob =
new CloudPageBlob(drive.Uri.AbsoluteUri, drive.Credentials);
try
{
pageBlob.FetchAttributes();
}
catch (StorageClientException ex)
{
if (ex.ErrorCode.Equals(StorageErrorCode.ResourceNotFound))
{
// Blob not found, try to create it
drive.Create(...);
}
}
Andrew Edwards