public void Release(DrainingNode node) { //remove server from waiting list lock (_lock) { _drainingNodes.Remove(node); } ThreadPool.QueueUserWorkItem(node.Callback); }
public bool IsDrained(DrainingNode node) { var nodeName = Helpers.GetNodeName(node.Server.Address, _config.TCPPort); var lastUsed = LoadBalancer.GetNodeLastUsed(_config, nodeName); var isDrained = (lastUsed > _config.DrainingPeriod); if (isDrained) { node.Server.TraceInfo("Draining finished for node {0} in pool {1}.Timeout: {2} secs, Since Last Used: {3} secs.", nodeName, _config.PoolName, _config.DrainingPeriod, lastUsed); } else { node.Server.TraceInfo("Still draining node {0} in pool {1}. Timeout: {2} secs, Since Last Used: {3} secs.", nodeName, _config.PoolName, _config.DrainingPeriod, lastUsed); } return(isDrained); }
public void Wait(ServerContext serverContext, WaitCallback callback) { var node = Helpers.GetNodeName(serverContext.Address, _config.TCPPort); //start node draining LoadBalancer.DrainNode(this._config, node); serverContext.TraceInfo("Draining started for node {0} in pool {1}. Timeout: {2}.", node, _config.PoolName, _config.DrainingPeriod); var drainingNode = new DrainingNode() { Server = serverContext, Callback = callback }; //add server to waiting list lock (_lock) { _drainingNodes.Add(drainingNode); } }