private IReportStatus ExecuteWithRoundRobin(ConDepOptions options, IReportStatus status) { var servers = _servers.ToList(); var roundRobinMaxOfflineServers = (int)Math.Ceiling(((double)servers.Count) / 2); ServerConfig manuelTestServer = null; if (options.StopAfterMarkedServer) { manuelTestServer = servers.SingleOrDefault(x => x.StopServer) ?? servers.First(); return(ExecuteOnServer(manuelTestServer, status, options, _loadBalancer, true, false)); } if (options.ContinueAfterMarkedServer) { manuelTestServer = servers.SingleOrDefault(x => x.StopServer) ?? servers.First(); servers.Remove(manuelTestServer); if (roundRobinMaxOfflineServers == 1) { _loadBalancer.BringOnline(manuelTestServer.Name, manuelTestServer.LoadBalancerFarm, status); } } if (servers.Count == 1) { return(ExecuteOnServer(servers.First(), status, options, _loadBalancer, true, true)); } for (int execCount = 0; execCount < servers.Count; execCount++) { if (execCount == roundRobinMaxOfflineServers - (manuelTestServer == null ? 0 : 1)) { TurnRoundRobinServersAround(_loadBalancer, servers, roundRobinMaxOfflineServers, manuelTestServer, status); } bool bringOnline = !(roundRobinMaxOfflineServers - (manuelTestServer == null ? 0 : 1) > execCount); ExecuteOnServer(servers[execCount], status, options, _loadBalancer, !bringOnline, bringOnline); if (status.HasErrors) { return(status); } } return(status); }
protected void BringOnline(ServerConfig server, IReportStatus status, ConDepSettings settings, ILoadBalance loadBalancer, CancellationToken token) { if (settings.Config.LoadBalancer == null) return; if (server.LoadBalancerState.CurrentState == LoadBalanceState.Online) return; Logger.WithLogSection(string.Format("Taking server [{0}] online in load balancer.", server.Name), () => { loadBalancer.BringOnline(server.Name, server.LoadBalancerFarm, status); server.LoadBalancerState.CurrentState = LoadBalanceState.Online; }); }
private void TurnRoundRobinServersAround(ILoadBalance loadBalancer, IEnumerable <ServerConfig> servers, int roundRobinMaxOfflineServers, ServerConfig testServer, IReportStatus status) { if (testServer != null) { loadBalancer.BringOnline(testServer.Name, testServer.LoadBalancerFarm, status); } var numberOfServers = roundRobinMaxOfflineServers - (testServer == null ? 0 : 1); var serversToBringOnline = servers.Take(numberOfServers); foreach (var server in serversToBringOnline) { loadBalancer.BringOnline(server.Name, server.LoadBalancerFarm, status); } var serversToBringOffline = servers.Skip(numberOfServers); foreach (var server in serversToBringOffline) { loadBalancer.BringOffline(server.Name, server.LoadBalancerFarm, LoadBalancerSuspendMethod.Suspend, status); } }
protected void BringOnline(ServerConfig server, ConDepSettings settings, ILoadBalance loadBalancer, CancellationToken token) { if (settings.Config.LoadBalancer == null) { return; } if (server.LoadBalancerState.CurrentState == LoadBalanceState.Online) { return; } Logger.WithLogSection($"Taking server [{server.Name}] online in load balancer.", () => { loadBalancer.BringOnline(server.Name, server.LoadBalancerFarm); server.LoadBalancerState.CurrentState = LoadBalanceState.Online; }); }
private IReportStatus ExecuteOnServer(ServerConfig server, IReportStatus status, ConDepOptions options, ILoadBalance loadBalancer, bool bringServerOfflineBeforeExecution, bool bringServerOnlineAfterExecution) { var errorDuringLoadBalancing = false; try { Logger.LogSectionStart(server.Name); if (bringServerOfflineBeforeExecution) { Logger.Info(string.Format("Taking server [{0}] offline in load balancer.", server.Name)); loadBalancer.BringOffline(server.Name, server.LoadBalancerFarm, LoadBalancerSuspendMethod.Suspend, status); } ExecuteOnServer(server, status, options); return(status); } catch { errorDuringLoadBalancing = true; throw; } finally { try { if (bringServerOnlineAfterExecution && !status.HasErrors && !errorDuringLoadBalancing) { Logger.Info(string.Format("Taking server [{0}] online in load balancer.", server.Name)); loadBalancer.BringOnline(server.Name, server.LoadBalancerFarm, status); } } finally { Logger.LogSectionEnd(server.Name); } } }
private IReportStatus ExecuteOnServer(ServerConfig server, IReportStatus status, ConDepOptions options, ILoadBalance loadBalancer, bool bringServerOfflineBeforeExecution, bool bringServerOnlineAfterExecution) { var errorDuringLoadBalancing = false; try { Logger.LogSectionStart(server.Name); if (bringServerOfflineBeforeExecution) { Logger.Info(string.Format("Taking server [{0}] offline in load balancer.", server.Name)); loadBalancer.BringOffline(server.Name, server.LoadBalancerFarm, LoadBalancerSuspendMethod.Suspend, status); } ExecuteOnServer(server, status, options); return status; } catch { errorDuringLoadBalancing = true; throw; } finally { try { if (bringServerOnlineAfterExecution && !status.HasErrors && !errorDuringLoadBalancing) { Logger.Info(string.Format("Taking server [{0}] online in load balancer.", server.Name)); loadBalancer.BringOnline(server.Name, server.LoadBalancerFarm, status); } } finally { Logger.LogSectionEnd(server.Name); } } }
private void TurnRoundRobinServersAround(ILoadBalance loadBalancer, IEnumerable<ServerConfig> servers, int roundRobinMaxOfflineServers, ServerConfig testServer, IReportStatus status) { if(testServer != null) { loadBalancer.BringOnline(testServer.Name, testServer.LoadBalancerFarm, status); } var numberOfServers = roundRobinMaxOfflineServers - (testServer == null ? 0 : 1); var serversToBringOnline = servers.Take(numberOfServers); foreach (var server in serversToBringOnline) { loadBalancer.BringOnline(server.Name, server.LoadBalancerFarm, status); } var serversToBringOffline = servers.Skip(numberOfServers); foreach (var server in serversToBringOffline) { loadBalancer.BringOffline(server.Name, server.LoadBalancerFarm, LoadBalancerSuspendMethod.Suspend, status); } }