/// <summary> /// Get the observed input counts /// </summary> public static ObservedInputCounts GetObservedInputCount(ReadOnlyArray <ObservedInput> observedInputs) { ObservedInputCounts count = default(ObservedInputCounts); foreach (var item in observedInputs) { switch (item.Type) { case ObservedInputType.AbsentPathProbe: count.AbsentPathProbeCount++; break; case ObservedInputType.DirectoryEnumeration: count.DirectoryEnumerationCount++; break; case ObservedInputType.ExistingDirectoryProbe: count.ExistingDirectoryProbeCount++; break; case ObservedInputType.FileContentRead: count.FileContentReadCount++; break; case ObservedInputType.ExistingFileProbe: count.ExistingFileProbeCount++; break; default: throw new NotImplementedException("Unrecognized Observed Input Type"); } } return(count); }
/// <inheritdoc /> public override void ProcessFingerprintComputed(ProcessFingerprintComputationEventData data) { if (data.Kind == FingerprintComputationKind.CacheCheck) { ObservedInputCounts?cacheMaxCounts = null; if (data.StrongFingerprintComputations != null) { foreach (var strongFingerprintComputation in data.StrongFingerprintComputations) { if (strongFingerprintComputation.Succeeded) { var computationCounts = GetObservedInputCount(strongFingerprintComputation.ObservedInputs); cacheMaxCounts = cacheMaxCounts?.Max(computationCounts) ?? computationCounts; } } if (cacheMaxCounts.HasValue) { m_observedInputCounts.TryAdd(data.PipId, cacheMaxCounts.Value); } } } else { Contract.Assert(data.Kind == FingerprintComputationKind.Execution); if (((data.StrongFingerprintComputations?.Count ?? 0) != 0) && data.StrongFingerprintComputations[0].Succeeded) { ObservedInputCounts cacheMaxCounts; if (m_observedInputCounts.TryRemove(data.PipId, out cacheMaxCounts)) { var executionCounts = GetObservedInputCount(data.StrongFingerprintComputations[0].ObservedInputs); ObservedInputCounts.LogForLowObservedInputs( Events.StaticContext, GetDescription(GetPip(data.PipId)), executionCounts: executionCounts, cacheMaxCounts: cacheMaxCounts); } } } }