Browse Source

prevent jittering and fix server settings update in HA

tags/2.5.1
clowwindy 9 years ago
parent
commit
ccec6be210
1 changed files with 15 additions and 7 deletions
  1. +15
    -7
      shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs

+ 15
- 7
shadowsocks-csharp/Controller/Strategy/HighAvailabilityStrategy.cs View File

@@ -7,7 +7,7 @@ namespace Shadowsocks.Controller.Strategy
{ {
class HighAvailabilityStrategy : IStrategy class HighAvailabilityStrategy : IStrategy
{ {
protected Server _currentServer;
protected ServerStatus _currentServer;
protected Dictionary<Server, ServerStatus> _serverStatus; protected Dictionary<Server, ServerStatus> _serverStatus;
ShadowsocksController _controller; ShadowsocksController _controller;
Random _random; Random _random;
@@ -67,6 +67,11 @@ namespace Shadowsocks.Controller.Strategy
status.lastTimeDetectLatency = DateTime.Now; status.lastTimeDetectLatency = DateTime.Now;
newServerStatus[server] = status; newServerStatus[server] = status;
} }
else
{
// update settings for existing server
newServerStatus[server].server = server;
}
} }
_serverStatus = newServerStatus; _serverStatus = newServerStatus;
@@ -79,7 +84,11 @@ namespace Shadowsocks.Controller.Strategy
{ {
ChooseNewServer(); ChooseNewServer();
} }
return _currentServer;
if (_currentServer == null)
{
return null;
}
return _currentServer.server;
} }
/** /**
@@ -90,7 +99,7 @@ namespace Shadowsocks.Controller.Strategy
*/ */
public void ChooseNewServer() public void ChooseNewServer()
{ {
Server oldServer = _currentServer;
ServerStatus oldServer = _currentServer;
List<ServerStatus> servers = new List<ServerStatus>(_serverStatus.Values); List<ServerStatus> servers = new List<ServerStatus>(_serverStatus.Values);
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
foreach (var status in servers) foreach (var status in servers)
@@ -120,12 +129,11 @@ namespace Shadowsocks.Controller.Strategy
} }
if (max != null) 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()));
} }
} }


Loading…
Cancel
Save