public async Task <JobImpactTranslationMode> EvaluateJobImpactAsync(IManagementNotificationContext notification) { notification.Validate("notification"); if (notification.NotificationType != NotificationType.StartJobStep) { // this is a coding error throw new ArgumentException("Notification not relevant. Notification: {0}".ToString(notification.ToShortDisplayString())); } if (DoesAssessmentMatchNotification(notification)) { return(currentJobImpactData.AssessedImpact); } traceType.WriteInfo( "JobImpactData doesn't match, starting new evaluation. Notification: {0}, Current JobImpactData: {1}", notification.ToShortDisplayString(), currentJobImpactData != null ? currentJobImpactData.ToString() : "<null>"); var now = DateTimeOffset.UtcNow; // There is already retry built into the QueryClient wrapper. If it goes beyond retry boundaries, // we'll let the caller handle this IList <INode> nodeList = await QueryClient.GetNodeListAsync(now).ConfigureAwait(false); var queriedNodes = nodeList.ToDictionary(e => e.NodeName, StringComparer.OrdinalIgnoreCase); Dictionary <string, INode> nodesToBeImpacted = GetNodesInNotification(notification, queriedNodes); var newJobImpactData = new JobImpactData { JobId = notification.ActiveJobId, JobType = notification.ActiveJobType, UD = notification.ActiveJobStepTargetUD, AssessedNodes = nodesToBeImpacted, Timestamp = now, AssessedImpact = JobImpactTranslationMode.Default, }; // no previous data if (currentJobImpactData == null) { currentJobImpactData = newJobImpactData; traceType.WriteInfo( "New assessed job impact stored. Returning {0}, JobImpactData: {1}, Notification: {2}", currentJobImpactData.AssessedImpact, currentJobImpactData, notification.ToShortDisplayString()); return(currentJobImpactData.AssessedImpact); } // has too much time passed after assessment? bool expired = HasPreviousEvaluationExpired(now, currentJobImpactData); if (expired) { currentJobImpactData = newJobImpactData; traceType.WriteWarning( "New assessed job impact stored. Time since last assessment is either invalid or has exceeded expiration time. Returning {0}. JobImpactData: {1}, Notification: {2}", currentJobImpactData.AssessedImpact, currentJobImpactData, notification.ToShortDisplayString()); return(currentJobImpactData.AssessedImpact); } bool?restarted = DidPreviouslyAssessedNodesRestart(queriedNodes, currentJobImpactData); if (restarted == null) { traceType.WriteInfo( "Unable to assess job impact, continuing to use previous assessment. Returning {0}, JobImpactData: {1}, Notification: {2}", currentJobImpactData.AssessedImpact, currentJobImpactData, notification.ToShortDisplayString()); return(currentJobImpactData.AssessedImpact); } currentJobImpactData = newJobImpactData; currentJobImpactData.AssessedImpact = restarted.Value ? JobImpactTranslationMode.Default : JobImpactTranslationMode.Optimized; traceType.WriteInfo( "New assessed job impact stored. Returning {0}, JobImpactData: {1}, Notification: {2}", currentJobImpactData.AssessedImpact, currentJobImpactData, notification.ToShortDisplayString()); return(currentJobImpactData.AssessedImpact); }