public bool KeepCurrentServer(int localPort, string targetAddr, string id) { if (sameHostForSameTarget && targetAddr != null) { lock (serverStrategyMap) { if (!serverStrategyMap.ContainsKey(localPort)) { serverStrategyMap[localPort] = new ServerSelectStrategy(); } ServerSelectStrategy serverStrategy = serverStrategyMap[localPort]; if (uricache.ContainsKey(targetAddr)) { UriVisitTime visit = uricache.Get(targetAddr); int index = -1; for (int i = 0; i < configs.Count; ++i) { if (configs[i].id == id) { index = i; break; } } if (index >= 0 && visit.index == index && configs[index].enable) { uricache.Del(targetAddr); return(true); } } } } return(false); }
public bool KeepCurrentServer(int port, string targetAddr, string id) { if (sameHostForSameTarget && targetAddr != null) { lock (serverStrategyMap) { if (!serverStrategyMap.ContainsKey(port)) { serverStrategyMap[port] = new ServerSelectStrategy(); } if (uricache.ContainsKey(targetAddr)) { var visit = uricache.Get(targetAddr); var j = -1; for (var i = 0; i < configs.Count; ++i) { if (configs[i].Id == id) { j = i; break; } } if (j >= 0 && visit.index == j && configs[j].Enable) { uricache.Del(targetAddr); return(true); } } } } return(false); }
public bool KeepCurrentServer(int localPort, string targetAddr, string id) { if (sameHostForSameTarget && targetAddr != null) { lock (serverStrategyMap) { if (!serverStrategyMap.ContainsKey(localPort)) { serverStrategyMap[localPort] = new ServerSelectStrategy(); } ServerSelectStrategy serverStrategy = serverStrategyMap[localPort]; if (uri2time.ContainsKey(targetAddr)) { UriVisitTime visit = uri2time[targetAddr]; int index = -1; for (int i = 0; i < configs.Count; ++i) { if (configs[i].id == id) { index = i; break; } } if (index >= 0 && visit.index == index && configs[index].enable) { time2uri.Remove(visit); visit.index = index; visit.visitTime = DateTime.Now; uri2time[targetAddr] = visit; time2uri[visit] = targetAddr; return(true); } } } } return(false); }
public Server GetCurrentServer(int localPort, ServerSelectStrategy.FilterFunc filter, string targetAddr = null, bool cfgRandom = false, bool usingRandom = false, bool forceRandom = false) { lock (serverStrategyMap) { if (!serverStrategyMap.ContainsKey(localPort)) { serverStrategyMap[localPort] = new ServerSelectStrategy(); } ServerSelectStrategy serverStrategy = serverStrategyMap[localPort]; uricache.SetTimeout(keepVisitTime); uricache.Sweep(); if (sameHostForSameTarget && !forceRandom && targetAddr != null && uricache.ContainsKey(targetAddr)) { UriVisitTime visit = uricache.Get(targetAddr); if (visit.index < configs.Count && configs[visit.index].enable && configs[visit.index].ServerSpeedLog().ErrorContinurousTimes == 0) { uricache.Del(targetAddr); return(configs[visit.index]); } } if (forceRandom) { int index; if (filter == null && randomInGroup) { index = serverStrategy.Select(configs, this.index, balanceAlgorithm, delegate(Server server, Server selServer) { if (selServer != null) { return(selServer.group == server.group); } return(false); }, true); } else { index = serverStrategy.Select(configs, this.index, balanceAlgorithm, filter, true); } if (index == -1) { return(GetErrorServer()); } return(configs[index]); } else if (usingRandom && cfgRandom) { int index; if (filter == null && randomInGroup) { index = serverStrategy.Select(configs, this.index, balanceAlgorithm, delegate(Server server, Server selServer) { if (selServer != null) { return(selServer.group == server.group); } return(false); }); } else { index = serverStrategy.Select(configs, this.index, balanceAlgorithm, filter); } if (index == -1) { return(GetErrorServer()); } if (targetAddr != null) { UriVisitTime visit = new UriVisitTime(); visit.uri = targetAddr; visit.index = index; visit.visitTime = DateTime.Now; uricache.Set(targetAddr, visit); } return(configs[index]); } else { if (index >= 0 && index < configs.Count) { int selIndex = index; if (usingRandom) { for (int i = 0; i < configs.Count; ++i) { if (configs[selIndex].isEnable()) { break; } else { selIndex = (selIndex + 1) % configs.Count; } } } if (targetAddr != null) { UriVisitTime visit = new UriVisitTime(); visit.uri = targetAddr; visit.index = selIndex; visit.visitTime = DateTime.Now; uricache.Set(targetAddr, visit); } return(configs[selIndex]); } else { return(GetErrorServer()); } } } }
public Server GetCurrentServer(int localPort, ServerSelectStrategy.FilterFunc filter, string targetAddr = null, bool cfgRandom = false, bool usingRandom = false, bool forceRandom = false) { lock (serverStrategyMap) { if (!serverStrategyMap.ContainsKey(localPort)) { serverStrategyMap[localPort] = new ServerSelectStrategy(); } ServerSelectStrategy serverStrategy = serverStrategyMap[localPort]; foreach (KeyValuePair <UriVisitTime, string> p in time2uri) { if ((DateTime.Now - p.Key.visitTime).TotalSeconds < keepVisitTime) { break; } uri2time.Remove(p.Value); time2uri.Remove(p.Key); break; } if (sameHostForSameTarget && !forceRandom && targetAddr != null && uri2time.ContainsKey(targetAddr)) { UriVisitTime visit = uri2time[targetAddr]; if (visit.index < configs.Count && configs[visit.index].enable) { //uri2time.Remove(targetURI); time2uri.Remove(visit); visit.visitTime = DateTime.Now; uri2time[targetAddr] = visit; time2uri[visit] = targetAddr; return(configs[visit.index]); } } if (forceRandom) { int index; if (filter == null && randomInGroup) { index = serverStrategy.Select(configs, this.index, randomAlgorithm, delegate(Server server, Server selServer) { if (selServer != null) { return(selServer.group == server.group); } return(false); }, true); } else { index = serverStrategy.Select(configs, this.index, randomAlgorithm, filter, true); } if (index == -1) { return(GetErrorServer()); } return(configs[index]); } else if (usingRandom && cfgRandom) { int index; if (filter == null && randomInGroup) { index = serverStrategy.Select(configs, this.index, randomAlgorithm, delegate(Server server, Server selServer) { if (selServer != null) { return(selServer.group == server.group); } return(false); }); } else { index = serverStrategy.Select(configs, this.index, randomAlgorithm, filter); } if (index == -1) { return(GetErrorServer()); } if (targetAddr != null) { UriVisitTime visit = new UriVisitTime(); visit.uri = targetAddr; visit.index = index; visit.visitTime = DateTime.Now; if (uri2time.ContainsKey(targetAddr)) { time2uri.Remove(uri2time[targetAddr]); } uri2time[targetAddr] = visit; time2uri[visit] = targetAddr; } return(configs[index]); } else { if (index >= 0 && index < configs.Count) { int selIndex = index; if (usingRandom) { for (int i = 0; i < configs.Count; ++i) { if (configs[selIndex].isEnable()) { break; } else { selIndex = (selIndex + 1) % configs.Count; } } } if (targetAddr != null) { UriVisitTime visit = new UriVisitTime(); visit.uri = targetAddr; visit.index = selIndex; visit.visitTime = DateTime.Now; if (uri2time.ContainsKey(targetAddr)) { time2uri.Remove(uri2time[targetAddr]); } uri2time[targetAddr] = visit; time2uri[visit] = targetAddr; } return(configs[selIndex]); } else { return(GetErrorServer()); } } } }
public Server GetCurrentServer(int port, ServerSelectStrategy.FilterFunc filter, string targetAddr = null, bool cfgRandom = false, bool usingRandom = false, bool forceRandom = false) { lock (serverStrategyMap) { if (!serverStrategyMap.ContainsKey(port)) { serverStrategyMap[port] = new ServerSelectStrategy(); } var serverStrategy = serverStrategyMap[port]; uricache.SetTimeout(keepVisitTime); uricache.Sweep(); if (sameHostForSameTarget && !forceRandom && targetAddr != null && uricache.ContainsKey(targetAddr)) { var visit = uricache.Get(targetAddr); if (visit.index < configs.Count && configs[visit.index].Enable && configs[visit.index].SpeedLog.ErrorContinuousTimes == 0) { uricache.Del(targetAddr); return(configs[visit.index]); } } if (forceRandom) { int i; if (filter == null && randomInGroup) { i = serverStrategy.Select(configs, index, balanceAlgorithm, delegate(Server server, Server selServer) { if (selServer != null) { return(selServer.Group == server.Group); } return(false); }, true); } else { i = serverStrategy.Select(configs, index, balanceAlgorithm, filter, true); } return(i == -1 ? GetErrorServer() : configs[i]); } if (usingRandom && cfgRandom) { int i; if (filter == null && randomInGroup) { i = serverStrategy.Select(configs, index, balanceAlgorithm, delegate(Server server, Server selServer) { if (selServer != null) { return(selServer.Group == server.Group); } return(false); }); } else { i = serverStrategy.Select(configs, index, balanceAlgorithm, filter); } if (i == -1) { return(GetErrorServer()); } if (targetAddr != null) { var visit = new UriVisitTime { uri = targetAddr, index = i, visitTime = DateTime.Now }; uricache.Set(targetAddr, visit); } return(configs[i]); } if (index >= 0 && index < configs.Count) { var selIndex = index; if (usingRandom) { foreach (var unused in configs) { if (configs[selIndex].Enable) { break; } selIndex = (selIndex + 1) % configs.Count; } } if (targetAddr != null) { var visit = new UriVisitTime { uri = targetAddr, index = selIndex, visitTime = DateTime.Now }; uricache.Set(targetAddr, visit); } return(configs[selIndex]); } return(GetErrorServer()); } }