private void PerformCacheMissAnalysis(Process pip, FingerprintStoreEntry oldEntry, FingerprintStoreEntry newEntry, bool fromCacheLookup) { string pipDescription = pip.GetDescription(m_context); try { if (!m_pipCacheMissesDict.TryRemove(pip.PipId, out var missInfo)) { return; } MarkPipAsChanged(pip.PipId); if (Interlocked.Increment(ref m_numCacheMissPerformed) >= s_maxCacheMissCanPerform) { return; } if (fromCacheLookup) { Counters.IncrementCounter(FingerprintStoreCounters.CacheMissAnalysisAnalyzeCacheLookUpCount); } else { Counters.IncrementCounter(FingerprintStoreCounters.CacheMissAnalysisAnalyzeExecutionCount); } using (var pool = Pools.StringBuilderPool.GetInstance()) using (var writer = new StringWriter(pool.Instance)) using (Counters.StartStopwatch(FingerprintStoreCounters.CacheMissAnalysisAnalyzeDuration)) { CacheMissAnalysisUtilities.AnalyzeCacheMiss( writer, missInfo, () => new FingerprintStoreReader.PipRecordingSession(PreviousFingerprintStore, oldEntry), () => new FingerprintStoreReader.PipRecordingSession(m_logTarget.ExecutionFingerprintStore, newEntry), m_cacheMissDiffFormat); // The diff sometimes contains several empty new lines at the end. var reason = writer.ToString().TrimEnd(Environment.NewLine.ToCharArray()); pipDescription = pip.GetDescription(m_context); Logger.Log.CacheMissAnalysis(m_loggingContext, pipDescription, reason, fromCacheLookup); } } catch (Exception ex) { // Cache miss analysis shouldn't fail the build Logger.Log.CacheMissAnalysisException(m_loggingContext, pipDescription, ex.ToString(), oldEntry?.PipToFingerprintKeys.ToString(), newEntry?.PipToFingerprintKeys.ToString()); } }
private void PerformCacheMissAnalysis(Process pip, FingerprintStoreEntry oldEntry, FingerprintStoreEntry newEntry, bool fromCacheLookup) { Contract.Requires(pip != null); string pipDescription = pip.GetDescription(m_context); try { if (!m_pipCacheMissesDict.TryRemove(pip.PipId, out var missInfo)) { return; } MarkPipAsChanged(pip.PipId); if (fromCacheLookup) { Counters.IncrementCounter(FingerprintStoreCounters.CacheMissAnalysisAnalyzeCacheLookUpCount); } else { Counters.IncrementCounter(FingerprintStoreCounters.CacheMissAnalysisAnalyzeExecutionCount); } using (var pool = Pools.StringBuilderPool.GetInstance()) using (Counters.StartStopwatch(FingerprintStoreCounters.CacheMissAnalysisAnalyzeDuration)) { var resultAndDetail = CacheMissAnalysisUtilities.AnalyzeCacheMiss( missInfo, () => new FingerprintStoreReader.PipRecordingSession(PreviousFingerprintStore, oldEntry), () => new FingerprintStoreReader.PipRecordingSession(m_logTarget.ExecutionFingerprintStore, newEntry), m_cacheMissDiffFormat); pipDescription = pip.GetDescription(m_context); if (m_batchLoggingQueue != null) { m_batchLoggingQueue.Enqueue(resultAndDetail.Detail.ToJObjectWithPipInfo(pip.FormattedSemiStableHash, pipDescription, fromCacheLookup)); } else { var detail = new JObject( new JProperty(nameof(resultAndDetail.Detail.ActualMissType), resultAndDetail.Detail.ActualMissType), new JProperty(nameof(resultAndDetail.Detail.ReasonFromAnalysis), resultAndDetail.Detail.ReasonFromAnalysis), new JProperty(nameof(resultAndDetail.Detail.Info), resultAndDetail.Detail.Info)).ToString(); Logger.Log.CacheMissAnalysis(m_loggingContext, pipDescription, detail, fromCacheLookup); } m_testHooks?.AddCacheMiss( pip.PipId, new FingerprintStoreTestHooks.CacheMissData { DetailAndResult = resultAndDetail, IsFromCacheLookUp = fromCacheLookup }); } } catch (Exception ex) { // Cache miss analysis shouldn't fail the build Logger.Log.CacheMissAnalysisException(m_loggingContext, pipDescription, ex.ToString(), oldEntry?.PipToFingerprintKeys.ToString(), newEntry?.PipToFingerprintKeys.ToString()); } }