/// <summary> /// Helper functions for putting entries into the fingerprint store for sub-components. /// { pip formatted semi stable hash : weak fingerprint, strong fingerprint, path set hash } /// { weak fingerprint hash : weak fingerprint inputs } /// { strong fingerprint hash : strong fingerprint inputs } /// { path set hash : path set inputs } /// </summary> private FingerprintStoreEntry CreateAndStoreFingerprintStoreEntry( FingerprintStore fingerprintStore, Process pip, PipFingerprintKeys pipFingerprintKeys, WeakContentFingerprint weakFingerprint, ProcessStrongFingerprintComputationData strongFingerprintData, bool cacheWeakFingerprintSerialization = false) { // If we got this far, a new pip is being put in the store Counters.IncrementCounter(FingerprintStoreCounters.NumPipFingerprintEntriesPut); UpdateOrStorePipUniqueOutputHashEntry(fingerprintStore, pip); // A content hash-keyed entry will have the same value as long as the key is the same, so overwriting it is unnecessary var mustStorePathEntry = !fingerprintStore.ContainsContentHash(pipFingerprintKeys.FormattedPathSetHash) || CacheMissAnalysisEnabled; var entry = CreateFingerprintStoreEntry( pip, pipFingerprintKeys, weakFingerprint, strongFingerprintData, mustStorePathEntry: mustStorePathEntry, cacheWeakFingerprintSerialization: cacheWeakFingerprintSerialization); fingerprintStore.PutFingerprintStoreEntry(entry, storePathSet: mustStorePathEntry); return(entry); }
internal void AnalyzeForCacheLookup(ProcessFingerprintComputationEventData data) { var pipId = data.PipId; using (var watch = new CacheMissTimer(pipId, this)) { // During cache-lookup, we only perform cache miss analysis for strong fingerprint misses. if (!m_pipCacheMissesDict.TryGetValue(data.PipId, out PipCacheMissInfo info) || info.CacheMissType != PipCacheMissType.MissForDescriptorsDueToStrongFingerprints) { return; } if (!IsCacheMissEligible(pipId)) { return; } Process pip = m_logTarget.GetProcess(pipId); if (!TryGetFingerprintStoreEntry(pip, out FingerprintStoreEntry oldEntry)) { return; } // WeakFingerprint must match if (!string.Equals(oldEntry.PipToFingerprintKeys.Value.WeakFingerprint, data.WeakFingerprint.Hash.ToString())) { return; } foreach (var computation in data.StrongFingerprintComputations) { if (!computation.IsStrongFingerprintHit && string.Equals(ContentHashToString(computation.PathSetHash), oldEntry.PipToFingerprintKeys.Value.PathSetHash)) { // If pathSets do match and it is a strongfingerprint miss, we can perform the cache miss analysis // First, we need to create the entry. var pipFingerprintKeys = new PipFingerprintKeys(data.WeakFingerprint, computation.ComputedStrongFingerprint, ContentHashToString(computation.PathSetHash)); var newEntry = m_logTarget.CreateFingerprintStoreEntry(pip, pipFingerprintKeys, data.WeakFingerprint, computation); Counters.IncrementCounter(FingerprintStoreCounters.CacheMissAnalysisCacheLookupAnalyzeCount); PerformCacheMissAnalysis(pip, oldEntry, newEntry, true); return; } } } }
internal FingerprintStoreEntry CreateFingerprintStoreEntry( Process pip, PipFingerprintKeys pipFingerprintKeys, WeakContentFingerprint weakFingerprint, ProcessStrongFingerprintComputationData strongFingerprintData, bool mustStorePathEntry = true, bool cacheWeakFingerprintSerialization = false) { Counters.IncrementCounter(FingerprintStoreCounters.CreateFingerprintStoreEntryCount); using (Counters.StartStopwatch(FingerprintStoreCounters.CreateFingerprintStoreEntryTime)) { string pipSerializedWeakFingerprint = null; if (cacheWeakFingerprintSerialization) { pipSerializedWeakFingerprint = m_weakFingerprintSerializationTransientCache.GetOrAdd( pip.PipId, (pipId, p) => { Counters.IncrementCounter(FingerprintStoreCounters.JsonSerializationWeakFingerprintCount); return(JsonSerialize(p)); }, pip); } else { if (!m_weakFingerprintSerializationTransientCache.TryRemove(pip.PipId, out pipSerializedWeakFingerprint)) { Counters.IncrementCounter(FingerprintStoreCounters.JsonSerializationWeakFingerprintCount); pipSerializedWeakFingerprint = JsonSerialize(pip); } } return(new FingerprintStoreEntry { // { pip formatted semi stable hash : weak fingerprint, strong fingerprint, path set hash } PipToFingerprintKeys = new PipKVP(pip.FormattedSemiStableHash, pipFingerprintKeys), // { weak fingerprint hash : weak fingerprint inputs } WeakFingerprintToInputs = new KVP(pipFingerprintKeys.WeakFingerprint, pipSerializedWeakFingerprint), StrongFingerprintEntry = new StrongFingerprintEntry { // { strong fingerprint hash: strong fingerprint inputs } StrongFingerprintToInputs = new KVP(pipFingerprintKeys.StrongFingerprint, JsonSerialize(weakFingerprint, strongFingerprintData.PathSetHash, strongFingerprintData.ObservedInputs)), // { path set hash : path set inputs } // If fingerprint comparison is enabled, the entry should contain the pathset json. PathSetHashToInputs = mustStorePathEntry ? new KVP(pipFingerprintKeys.FormattedPathSetHash, JsonSerialize(strongFingerprintData)) : default,
internal FingerprintStoreEntry CreateFingerprintStoreEntry( Process pip, PipFingerprintKeys pipFingerprintKeys, WeakContentFingerprint weakFingerprint, ProcessStrongFingerprintComputationData strongFingerprintData, bool mustStorePathEntry = true) { return(new FingerprintStoreEntry { // { pip formatted semi stable hash : weak fingerprint, strong fingerprint, path set hash } PipToFingerprintKeys = new PipKVP(pip.FormattedSemiStableHash, pipFingerprintKeys), // { weak fingerprint hash : weak fingerprint inputs } WeakFingerprintToInputs = new KVP(pipFingerprintKeys.WeakFingerprint, JsonSerialize(pip)), StrongFingerprintEntry = new StrongFingerprintEntry { // { strong fingerprint hash: strong fingerprint inputs } StrongFingerprintToInputs = new KVP(pipFingerprintKeys.StrongFingerprint, JsonSerialize(weakFingerprint, strongFingerprintData.PathSetHash, strongFingerprintData.ObservedInputs)), // { path set hash : path set inputs } // If fingerprint comparison is enabled, the entry should contain the pathset json. PathSetHashToInputs = mustStorePathEntry ? new KVP(pipFingerprintKeys.FormattedPathSetHash, JsonSerialize(strongFingerprintData)) : default,