public async Task <ICollection <GStoreObjectReplica> > ReadAll() { ICollection <ReaderWriterLockEnhancedSlim> locks = ObjectLocks.Values; IDictionary <ReaderWriterLockEnhancedSlim, Task <int> > lockTasks = new Dictionary <ReaderWriterLockEnhancedSlim, Task <int> >(); foreach (ReaderWriterLockEnhancedSlim objectLock in locks) { lockTasks.Add(objectLock, Task.Run(objectLock.EnterReadLock)); } IDictionary <ReaderWriterLockEnhancedSlim, int> lockWithReadIdSet = new Dictionary <ReaderWriterLockEnhancedSlim, int>(); foreach (KeyValuePair <ReaderWriterLockEnhancedSlim, Task <int> > lockTask in lockTasks) { ReaderWriterLockEnhancedSlim objectLock = lockTask.Key; Task <int> task = lockTask.Value; lockWithReadIdSet.Add(objectLock, await task); } ISet <GStoreObjectReplica> values = new HashSet <GStoreObjectReplica>(); foreach (GStoreObject gStoreObject in DataStore.Values) { // should lock partitions during this operation string partitionId = gStoreObject.Identifier.PartitionId; GStoreObjectReplica gStoreObjectReplica = new GStoreObjectReplica(gStoreObject, connectionManager.IsMasterForPartition(partitionId)); values.Add(gStoreObjectReplica); } foreach (KeyValuePair <ReaderWriterLockEnhancedSlim, int> lockWithReadId in lockWithReadIdSet) { ReaderWriterLockEnhancedSlim objectLock = lockWithReadId.Key; int lockId = lockWithReadId.Value; objectLock.ExitReadLock(lockId); } return(values); }
internal static DataObjectReplica FromObjectReplica(GStoreObjectReplica gStoreObjectReplica) { return(FromString(gStoreObjectReplica.Object.Identifier.PartitionId, gStoreObjectReplica.Object.Identifier.ObjectId, gStoreObjectReplica.Object.Value, gStoreObjectReplica.IsMaster)); }