diff --git a/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs b/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs index 1060b37c..fa05a0c1 100644 --- a/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs +++ b/shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs @@ -7,7 +7,7 @@ namespace Shadowsocks.Controller.Strategy { class HighAvailabilityStrategy : IStrategy { - protected Server _currentServer; + protected ServerStatus _currentServer; protected Dictionary _serverStatus; ShadowsocksController _controller; Random _random; @@ -67,6 +67,11 @@ namespace Shadowsocks.Controller.Strategy status.lastTimeDetectLatency = DateTime.Now; newServerStatus[server] = status; } + else + { + // update settings for existing server + newServerStatus[server].server = server; + } } _serverStatus = newServerStatus; @@ -79,7 +84,11 @@ namespace Shadowsocks.Controller.Strategy { ChooseNewServer(); } - return _currentServer; + if (_currentServer == null) + { + return null; + } + return _currentServer.server; } /** @@ -90,7 +99,7 @@ namespace Shadowsocks.Controller.Strategy */ public void ChooseNewServer() { - Server oldServer = _currentServer; + ServerStatus oldServer = _currentServer; List servers = new List(_serverStatus.Values); DateTime now = DateTime.Now; foreach (var status in servers) @@ -120,12 +129,11 @@ namespace Shadowsocks.Controller.Strategy } if (max != null) { - _currentServer = max.server; - if (_currentServer != oldServer) + if (_currentServer == null || max.score - _currentServer.score > 200) { - Console.WriteLine("HA switching to server: {0}", _currentServer.FriendlyName()); + _currentServer = max; + Console.WriteLine("HA switching to server: {0}", _currentServer.server.FriendlyName()); } - Logging.Debug(String.Format("choosing server: {0}", _currentServer.FriendlyName())); } }