public async Task Start(JobDefinition <DefinitionExternalProcess> jobDefinition, FactoryStartOptions options) { if (status != null) { throw new JobFacInvalidRunStatusException($"Job has already been started (instance {jobInstanceKey})"); } jobDefinition.ThrowIfInvalid(); if (options.SequenceInstanceId.HasContent()) { parentSequence = GrainFactory.GetGrain <IJobSequence>(options.SequenceInstanceId); if (parentSequence == null) { throw new JobFacInvalidDataException($"Job {jobInstanceKey} failed to obtain parent Sequence {options.SequenceInstanceId}"); } } this.jobDefinition = jobDefinition; status = new JobStatus <StatusExternalProcess> { Key = jobInstanceKey, StartOptions = options, LastUpdated = DateTimeOffset.UtcNow, }; status.JobTypeProperties.MachineName = Dns.GetHostName().HasContent() ? Dns.GetHostName() : Environment.MachineName; await historyRepo.InsertStatus(status); await LaunchRunner(); // TODO add startup timeout to check whether RunStatus changes from Unknown (requires grain timer support) }
public static string ReportDifference( this IJobSequence first, IJobSequence second, StringBuilder builder) { if (builder == null) { builder = new StringBuilder(); } var array1 = first.ToArray(); var array2 = second.ToArray(); if (!array1.Any() || !array2.Any()) { builder.AppendLine($"firstCount={array1.Length}, secondCount={array2.Length}"); return(builder.ToString()); } if (array1.First().MachineId != array2.First().MachineId) { throw new Exception(); } if (array1.SequenceEqual(array2)) { builder.AppendLine($"Sequences equal M={array1.First().MachineId}"); return(builder.ToString()); } Console.Write($"Sequences different M={array1.First().MachineId} "); int minLength = Math.Min(array1.Length, array2.Length); for (int i = 0; i < minLength; i++) { if (!array1[i].Equals(array2[i])) { builder.Append($"{{ i={i}: {array1[i]} vs {array2[i]} }} "); } } int maxLength = Math.Max(array1.Length, array2.Length); for (int i = minLength; i < maxLength; i++) { if (array1.Length > array2.Length) { builder.Append($"{{ i={i}: {array1[i]} vs nothing }} "); } else { builder.Append($"{{ i={i}: nothing vs {array2[i]} }} "); } } builder.AppendLine(); return(builder.ToString()); }