internal override void RecordEndLazyPersist(string bpid, long blockId, FilePath[]
                                             savedFiles)
 {
     lock (this)
     {
         IDictionary <long, RamDiskReplicaLruTracker.RamDiskReplicaLru> map = replicaMaps[bpid
                                                                              ];
         RamDiskReplicaLruTracker.RamDiskReplicaLru ramDiskReplicaLru = map[blockId];
         if (ramDiskReplicaLru == null)
         {
             throw new InvalidOperationException("Unknown replica bpid=" + bpid + "; blockId="
                                                 + blockId);
         }
         ramDiskReplicaLru.RecordSavedBlockFiles(savedFiles);
         if (replicasNotPersisted.Peek() == ramDiskReplicaLru)
         {
             // Common case.
             replicasNotPersisted.Remove();
         }
         else
         {
             // Caller error? Fallback to O(n) removal.
             replicasNotPersisted.Remove(ramDiskReplicaLru);
         }
         ramDiskReplicaLru.lastUsedTime = Time.MonotonicNow();
         replicasPersisted.Put(ramDiskReplicaLru.lastUsedTime, ramDiskReplicaLru);
         ramDiskReplicaLru.isPersisted = true;
     }
 }
 internal override void RecordStartLazyPersist(string bpid, long blockId, FsVolumeImpl
                                               checkpointVolume)
 {
     lock (this)
     {
         IDictionary <long, RamDiskReplicaLruTracker.RamDiskReplicaLru> map = replicaMaps[bpid
                                                                              ];
         RamDiskReplicaLruTracker.RamDiskReplicaLru ramDiskReplicaLru = map[blockId];
         ramDiskReplicaLru.SetLazyPersistVolume(checkpointVolume);
     }
 }
 internal override void AddReplica(string bpid, long blockId, FsVolumeImpl transientVolume
                                   )
 {
     lock (this)
     {
         IDictionary <long, RamDiskReplicaLruTracker.RamDiskReplicaLru> map = replicaMaps[bpid
                                                                              ];
         if (map == null)
         {
             map = new Dictionary <long, RamDiskReplicaLruTracker.RamDiskReplicaLru>();
             replicaMaps[bpid] = map;
         }
         RamDiskReplicaLruTracker.RamDiskReplicaLru ramDiskReplicaLru = new RamDiskReplicaLruTracker.RamDiskReplicaLru
                                                                            (this, bpid, blockId, transientVolume);
         map[blockId] = ramDiskReplicaLru;
         replicasNotPersisted.AddItem(ramDiskReplicaLru);
     }
 }
 internal override void Touch(string bpid, long blockId)
 {
     lock (this)
     {
         IDictionary <long, RamDiskReplicaLruTracker.RamDiskReplicaLru> map = replicaMaps[bpid
                                                                              ];
         RamDiskReplicaLruTracker.RamDiskReplicaLru ramDiskReplicaLru = map[blockId];
         if (ramDiskReplicaLru == null)
         {
             return;
         }
         ramDiskReplicaLru.numReads.GetAndIncrement();
         // Reinsert the replica with its new timestamp.
         if (replicasPersisted.Remove(ramDiskReplicaLru.lastUsedTime, ramDiskReplicaLru))
         {
             ramDiskReplicaLru.lastUsedTime = Time.MonotonicNow();
             replicasPersisted.Put(ramDiskReplicaLru.lastUsedTime, ramDiskReplicaLru);
         }
     }
 }
 internal override RamDiskReplicaTracker.RamDiskReplica DequeueNextReplicaToPersist
     ()
 {
     lock (this)
     {
         while (replicasNotPersisted.Count != 0)
         {
             RamDiskReplicaLruTracker.RamDiskReplicaLru ramDiskReplicaLru = replicasNotPersisted
                                                                            .Remove();
             IDictionary <long, RamDiskReplicaLruTracker.RamDiskReplicaLru> replicaMap = replicaMaps
                                                                                         [ramDiskReplicaLru.GetBlockPoolId()];
             if (replicaMap != null && replicaMap[ramDiskReplicaLru.GetBlockId()] != null)
             {
                 return(ramDiskReplicaLru);
             }
         }
         // The replica no longer exists, look for the next one.
         return(null);
     }
 }
 internal override RamDiskReplicaTracker.RamDiskReplica GetNextCandidateForEviction
     ()
 {
     lock (this)
     {
         IEnumerator <RamDiskReplicaLruTracker.RamDiskReplicaLru> it = replicasPersisted.Values
                                                                           ().GetEnumerator();
         while (it.HasNext())
         {
             RamDiskReplicaLruTracker.RamDiskReplicaLru ramDiskReplicaLru = it.Next();
             it.Remove();
             IDictionary <long, RamDiskReplicaLruTracker.RamDiskReplicaLru> replicaMap = replicaMaps
                                                                                         [ramDiskReplicaLru.GetBlockPoolId()];
             if (replicaMap != null && replicaMap[ramDiskReplicaLru.GetBlockId()] != null)
             {
                 return(ramDiskReplicaLru);
             }
         }
         // The replica no longer exists, look for the next one.
         return(null);
     }
 }
 /// <summary>Discard any state we are tracking for the given replica.</summary>
 /// <remarks>
 /// Discard any state we are tracking for the given replica. This could mean
 /// the block is either deleted from the block space or the replica is no longer
 /// on transient storage.
 /// </remarks>
 /// <param name="deleteSavedCopies">
 /// true if we should delete the saved copies on
 /// persistent storage. This should be set by the
 /// caller when the block is no longer needed.
 /// </param>
 internal override void DiscardReplica(string bpid, long blockId, bool deleteSavedCopies
                                       )
 {
     lock (this)
     {
         IDictionary <long, RamDiskReplicaLruTracker.RamDiskReplicaLru> map = replicaMaps[bpid
                                                                              ];
         if (map == null)
         {
             return;
         }
         RamDiskReplicaLruTracker.RamDiskReplicaLru ramDiskReplicaLru = map[blockId];
         if (ramDiskReplicaLru == null)
         {
             return;
         }
         if (deleteSavedCopies)
         {
             ramDiskReplicaLru.DeleteSavedFiles();
         }
         Sharpen.Collections.Remove(map, blockId);
         replicasPersisted.Remove(ramDiskReplicaLru.lastUsedTime, ramDiskReplicaLru);
     }
 }