2013-02-20 2 views
2

Я разрабатываю приложение, и время от времени я получаю ошибку, мне нужно синхронизировать несколько рабочих ролей с арендой на блобе.CloubBlockBlob AcquireLease дает две аренды двум рабочим роликам

Ниже мой инициализации код для работника роли

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageAccount")); 
string blobContainerName = RoleEnvironment.GetConfigurationSettingValue("BlobContainer"); 
CloudBlobContainer blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference(blobContainerName); 
blobContainer.CreateIfNotExists(); 
string blobName = RoleEnvironment.GetConfigurationSettingValue("BlobToBeLeased"); 
_blob = blobContainer.GetBlockBlobReference(blobName); 

if (!_blob.Exists()) 
{ 
    using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("This is dummy data"))) 
    { 
     try 
     { 
      _blob.UploadFromStream(ms); 
     } 
     catch (StorageException storageException) 
     { 
      if (storageException.RequestInformation.HttpStatusCode != 412) 
       throw; 
     } 
    } 
} 

А вот мой метод AcquireLease:

private void AcquireLease() 
{ 
    try 
    { 
     var leaseId = _blob.AcquireLease(null, null); 
     Trace.WriteLine("==========> Lease acquired! <========== ID => " + leaseId); 
     _accessCondition = new AccessCondition {LeaseId = leaseId}; 
    } 
    catch (Exception) 
    { 
     Trace.WriteLine("==========> Lease rejected! <=========="); 
    } 
} 

Скриншот проблемы: enter image description here

Проблема заключается в том, когда я позвоните по методу AcquireLease, он иногда дает мне две аренды ... У кого-нибудь есть идея, как это решить ...

Операции CloudBlockBlob атомарны?

ответ

2

После разговора с парнем из Microsoft выяснилось, что у эмулятора есть некоторые отличия от самой службы хранения.

Запуск того же кода на Azure работает отлично!

Этот ответ действителен для эмулятора v1.8.0.0.

+1

это не так правильно ... –