/// <summary> /// Creates a new SockIO obj for the given server. /// ///If server fails to connect, then return null and do not try ///again until a duration has passed. This duration will grow ///by doubling after each failed attempt to connect. /// </summary> /// <param name="host">host:port to connect to</param> /// <returns>SockIO obj or null if failed to create</returns> protected SockIO CreateSocket(string host) { SockIO socket = null; // if host is dead, then we don't need to try again // until the dead status has expired // we do not try to put back in if failover is off if(_failover && _hostDead.ContainsKey(host) && _hostDeadDuration.ContainsKey(host)) { DateTime store = (DateTime)_hostDead[host]; long expire = ((long)_hostDeadDuration[host]); if((store.AddMilliseconds(expire)) > DateTime.Now) return null; } try { socket = new SockIO(this, host, _socketTimeout, _socketConnectTimeout, _nagle); if(!socket.IsConnected) { //if(Log.IsErrorEnabled) //{ // Log.Error(GetLocalizedString("failed to get socket").Replace("$$Host$$", host)); //} try { socket.TrueClose(); } catch//(SocketException ex) { //if(Log.IsErrorEnabled) //{ // Log.Error(GetLocalizedString("failed to close socket on host").Replace("$$Host$$", host), ex); //} socket = null; } } } catch//(SocketException ex) { //if(Log.IsErrorEnabled) //{ // Log.Error(GetLocalizedString("failed to get socket").Replace("$$Host$$", host), ex); //} socket = null; } //catch(ArgumentException ex) //{ // if(Log.IsErrorEnabled) // { // Log.Error(GetLocalizedString("failed to get socket").Replace("$$Host$$", host), ex); // } // socket = null; //} //catch(IOException ex) //{ // if(Log.IsErrorEnabled) // { // Log.Error(GetLocalizedString("failed to get socket").Replace("$$Host$$", host), ex); // } // socket = null; //} // if we failed to get socket, then mark // host dead for a duration which falls off if(socket == null) { DateTime now = DateTime.Now; _hostDead[host] = now; long expire = (_hostDeadDuration.ContainsKey(host)) ? (((long)_hostDeadDuration[host]) * 2) : 100; _hostDeadDuration[host] = expire; //if(Log.IsDebugEnabled) //{ // Log.Debug(GetLocalizedString("ignoring dead host").Replace("$$Host$$", host).Replace("$$Expire$$", expire.ToString(new NumberFormatInfo()))); //} // also clear all entries for this host from availPool ClearHostFromPool(_availPool, host); } else { //if(Log.IsDebugEnabled) //{ // Log.Debug(GetLocalizedString("created socket").Replace("$$ToString$$", socket.ToString()).Replace("$$Host$$", host)); //} _hostDead.Remove(host); _hostDeadDuration.Remove(host); if(_buckets.BinarySearch(host) < 0) _buckets.Add(host); } return socket; }