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); } }