private static RoleInstance GetNewRoleInstance(ushort newPort, RoleInstance oldRoleInstance) { return(new RoleInstance() { RoleName = oldRoleInstance.RoleName, AssemblyFullPath = oldRoleInstance.AssemblyFullPath, Port = newPort }); }
private static Task AttempToSendLoadSignalAsync(RoleInstance newRoleInstance, ProcessManager processManager) { var task = Task.CompletedTask; if (!string.IsNullOrWhiteSpace(newRoleInstance.AssemblyFullPath) && !string.IsNullOrWhiteSpace(newRoleInstance.RoleName)) { Console.WriteLine($"[{newRoleInstance.Port}]: Attempting to send load assembly signal..."); processManager.TakeContainer(newRoleInstance); task = ContainerController.SendLoadSignalToContainerAsync(newRoleInstance, numberOfAttempts: 1); } return(task); }
public static void SafeAddOrUpdate(RoleInstance roleInstance) { if (roleInstance.RoleName is null) { return; } var role = Roles.GetOrAdd(key: roleInstance.RoleName, valueFactory: roleName => new Role(roleName)); role.Instances[roleInstance.Id] = roleInstance; roleInstance.Role = role; Debug.WriteLine($"Successfully added role instance: {roleInstance.Id}"); }
public static void SafeRemove(RoleInstance roleInstance) { if (roleInstance.RoleName is null) { return; } if (Roles.TryGetValue(roleInstance.RoleName, out var role) && role.Instances.TryRemove(roleInstance.Id, out var removedInstance)) { Debug.WriteLine($"Successfully removed role instance: {removedInstance.Id}"); } else { Debug.WriteLine($"Failed to remove role instance: {roleInstance.Id} (possible reason: it is already deleted)"); } }
/// <summary> /// Attempts to take container with port specified in roleInstance. Returns true upon /// success, false upon failure /// </summary> public bool TakeContainer(RoleInstance roleInstance) { if (string.IsNullOrWhiteSpace(roleInstance.RoleName)) { return(false); } if (this.containerProcessDictByPort.TryGetValue(roleInstance.Port, out var containerProcess) && containerProcess.IsContainerFree) { RoleEnvironment.SafeAddOrUpdate(roleInstance); containerProcess.RoleInstance = roleInstance; return(true); } return(false); }
/// <summary> /// Attempts to send load signal to container until signal has been sent or attempts have /// exceeded numberOfAttempts. /// </summary> /// <param name="port">port of remote container's wcf server</param> /// <param name="assemblyPath">full path to .dll assembly</param> /// <param name="numberOfAttempts">defines number of attempts to establish connection</param> /// <param name="millisecondsDelay">delay/time in milliseconds between each attempt</param> /// <returns>true if connection has been established and Load signal has been sent.</returns> public static async Task <bool> SendLoadSignalToContainerAsync(RoleInstance roleInstance, int numberOfAttempts = 2, int millisecondsDelay = 500) { var port = roleInstance.Port; var assemblyPath = roleInstance.AssemblyFullPath; string remoteAddress = $"net.tcp://*****:*****@"^\s*?\[SUCCESS\].*", RegexOptions.IgnoreCase)) { ProcessManager.SingletonInstance.TakeContainer(roleInstance); } Console.WriteLine($"{port}: {result}"); channelFactory.Close(); return(true); } catch (Exception ex) { Console.Error.WriteLine(ex.Message); if (--numberOfAttempts <= 0) { return(false); } } await Task.Delay(millisecondsDelay).ConfigureAwait(false); } }
public ContainerHealthMonitorEventArgs(RoleInstance roleInstance, Exception exception = null) { this.RoleInstance = roleInstance ?? throw new ArgumentNullException(nameof(roleInstance)); this.Exception = exception; }