/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void PipExecutionDirectoryOutputs(PipExecutionDirectoryOutputs data) { foreach (var(directoryArtifact, fileArtifactArray) in data.DirectoryOutputs) { foreach (var file in fileArtifactArray) { m_dynamicFileProducerMap.Add(file, data.PipId.Value); } var value = new PipExecutionDirectoryOutputsEvent { WorkerID = WorkerID.Value, PipID = data.PipId.Value, DirectoryArtifact = directoryArtifact.ToDirectoryArtifact(PathTable, m_nameExpander), }; value.FileArtifactArray.AddRange(fileArtifactArray.Select( file => file.ToFileArtifact(PathTable, m_nameExpander))); var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.PipExecutionDirectoryOutputs, PipId = data.PipId.Value, PipExecutionDirectoryOutputKey = AbsolutePathToXldbString(directoryArtifact.Path) }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.PipExecutionDirectoryOutputs, keyArr.Length + valueArr.Length); } }
/// <summary> /// Gets events from the DB based on the eventKey /// </summary> /// <returns>List of events, empty if no such events exist</returns> private IEnumerable <IMessage> GetEventsByKey(EventKey eventKey) { Contract.Requires(Accessor != null, "XldbDataStore is not initialized"); var storedEvents = new List <IMessage>(); if (!m_eventParserDictionary.TryGetValue(eventKey.EventTypeID, out var parser)) { Contract.Assert(false, "No parser found for EventTypeId passed in"); } var maybeFound = Accessor.Use(database => { foreach (var kvp in database.PrefixSearch(eventKey.ToByteArray(), EventColumnFamilyName)) { storedEvents.Add(parser.ParseFrom(kvp.Value)); } }); if (!maybeFound.Succeeded) { maybeFound.Failure.Throw(); } return(storedEvents); }
/// <summary> /// Gets events from the DB based on the eventKey. /// </summary> /// <remarks> /// Since 0 isn't serialized by Protobuf, a PrefixSearch for RewriteCount = 0 would match everything. /// Thus to avoid that, we set it to -1 to "match everything", else we look for specific rewrite counts. /// Similarly, a PrefixSearch for WorkerID = 0 would match everything. /// Thus to avoid that, we set it to uint.MaxValue to "match everything", else we look for specific rewrite counts. /// </remarks> /// <returns>List of events, empty if no such events exist</returns> private IEnumerable <IMessage> GetEventsByKey(EventKey eventKey) { Contract.Requires(m_accessor != null, "XldbDataStore is not initialized"); var storedEvents = new List <IMessage>(); if (!m_eventParserDictionary.TryGetValue(eventKey.EventTypeID, out var parser)) { Contract.Assert(false, "No parser found for EventTypeId passed in"); } var matchAllRewriteCounts = false; var matchAllWorkerIDs = false; if (eventKey.FileRewriteCount == s_fileRewriteCountDefaultValue) { matchAllRewriteCounts = true; // Set it to 0 to match everything eventKey.FileRewriteCount = 0; } if (eventKey.WorkerID == s_workerIDDefaultValue) { matchAllWorkerIDs = true; // Set it to 0 to match everything eventKey.WorkerID = 0; } var maybeFound = m_accessor.Use(database => { foreach (var kvp in database.PrefixSearch(eventKey.ToByteArray(), EventColumnFamilyName)) { var kvpKey = EventKey.Parser.ParseFrom(kvp.Key); // MatchAllWorker IDs and MatchAllRewriteCounts are true, so just add everything if (matchAllWorkerIDs && matchAllRewriteCounts) { storedEvents.Add(parser.ParseFrom(kvp.Value)); } // Else if matching all WorkerIDs, check for specific RewriteCounts OR // if matching all RewriteCounts, check for specific worker ID else if ((matchAllWorkerIDs && kvpKey.FileRewriteCount == eventKey.FileRewriteCount) || (matchAllRewriteCounts && kvpKey.WorkerID == eventKey.WorkerID)) { storedEvents.Add(parser.ParseFrom(kvp.Value)); } // Else both worker ID and RewriteCounts are unique so the prefix search matches the right one else { storedEvents.Add(parser.ParseFrom(kvp.Value)); } } }); if (!maybeFound.Succeeded) { maybeFound.Failure.Throw(); } return(storedEvents); }
/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void BxlInvocation(BxlInvocationEventData data) { var value = data.ToBxlInvocationEvent(WorkerID.Value, PathTable, m_nameExpander); var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.BxlInvocation, }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.BxlInvocation, keyArr.Length + valueArr.Length); }
/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void WorkerList(WorkerListEventData data) { var value = data.ToWorkerListEvent(WorkerID.Value); var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.WorkerList, }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.WorkerList, keyArr.Length + valueArr.Length); }
/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void StatusReported(StatusEventData data) { var value = data.ToResourceUsageReportedEvent(WorkerID.Value); var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.ResourceUsageReported, EventSequenceNumber = Interlocked.Increment(ref m_eventSequenceNumber) }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.ResourceUsageReported, keyArr.Length + valueArr.Length); }
/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void DependencyViolationReported(DependencyViolationEventData data) { var value = data.ToDependencyViolationReportedEvent(WorkerID.Value, PathTable, m_nameExpander); var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.DependencyViolationReported, ViolatorPipID = data.ViolatorPipId.Value }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.DependencyViolationReported, keyArr.Length + valueArr.Length); }
/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void BuildSessionConfiguration(BuildSessionConfigurationEventData data) { var value = data.ToExecutionLogSaltsData(WorkerID.Value); // There will be exactly one event of this type that is reported, so nothing special needs to be added to the key var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.BuildSessionConfiguration, }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.ExtraEventDataReported, keyArr.Length + valueArr.Length); }
/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void PipExecutionPerformance(PipExecutionPerformanceEventData data) { var value = data.ToPipExecutionPerformanceEvent(); var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.PipExecutionPerformance, PipId = data.PipId.Value }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.PipExecutionPerformance, keyArr.Length + valueArr.Length); }
/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void ProcessFingerprintComputed(ProcessFingerprintComputationEventData data) { var value = data.ToProcessFingerprintComputationEvent(WorkerID.Value, PathTable, m_nameExpander); var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.ProcessFingerprintComputation, PipId = data.PipId.Value, ProcessFingerprintComputationKey = value.Kind, }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.ProcessFingerprintComputation, keyArr.Length + valueArr.Length); }
/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void FileArtifactContentDecided(FileArtifactContentDecidedEventData data) { var value = data.ToFileArtifactContentDecidedEvent(WorkerID.Value, PathTable, m_nameExpander); var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.FileArtifactContentDecided, FileArtifactContentDecidedKey = AbsolutePathToXldbString(data.FileArtifact.Path), FileRewriteCount = data.FileArtifact.RewriteCount }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.FileArtifactContentDecided, keyArr.Length + valueArr.Length); }
/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void PipExecutionStepPerformanceReported(PipExecutionStepPerformanceEventData data) { var value = data.ToPipExecutionStepPerformanceReportedEvent(WorkerID.Value); var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.PipExecutionStepPerformanceReported, PipId = data.PipId.Value, PipExecutionStepPerformanceKey = value.Step, EventSequenceNumber = Interlocked.Increment(ref m_eventSequenceNumber) }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.PipExecutionStepPerformanceReported, keyArr.Length + valueArr.Length); }
/// <summary> /// Override event to capture its data and store it in the protobuf /// </summary> public override void DirectoryMembershipHashed(DirectoryMembershipHashedEventData data) { var value = data.ToDirectoryMembershipHashedEvent(WorkerID.Value, PathTable, m_nameExpander); var key = new EventKey { EventTypeID = Xldb.Proto.ExecutionEventId.DirectoryMembershipHashed, PipId = data.PipId.Value, DirectoryMembershipHashedKey = AbsolutePathToXldbString(data.Directory), EventSequenceNumber = Interlocked.Increment(ref m_eventSequenceNumber) }; var keyArr = key.ToByteArray(); var valueArr = value.ToByteArray(); WriteToDb(keyArr, valueArr, XldbDataStore.EventColumnFamilyName); AddToDbStorageDictionary(DBStoredTypes.DirectoryMembershipHashed, keyArr.Length + valueArr.Length); }