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)");
            }
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        /// <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);
            }
        }
Esempio n. 7
0
 public ContainerHealthMonitorEventArgs(RoleInstance roleInstance, Exception exception = null)
 {
     this.RoleInstance = roleInstance ?? throw new ArgumentNullException(nameof(roleInstance));
     this.Exception    = exception;
 }