//To-do: add ConnectStatus logic. public IDualChannel SetConnectInfo(IDualChannel channel, ConnectInfo.ConnectStatus status) { ConnectInfo connectInfo = null; if (((Address)_context.LocalAddress).CompareTo((Address)channel.PeerAddress) > 0) { connectInfo = new ConnectInfo(); connectInfo.Status = status; connectInfo.Id = GetConnectionId(); channel.SendMessage(connectInfo, true); if (LoggerManager.Instance.ShardLogger != null && LoggerManager.Instance.ShardLogger.IsDebugEnabled) { LoggerManager.Instance.ShardLogger.Debug("ResolveChannelDispute.SetConnectInfo() ", "Node " + _context.LocalAddress.ToString() + ": Sender, " + "Node " + channel.PeerAddress.ToString() + ": Receiver."); } } // This specific check was necessary because somehow an earlier check for a condition was passing when it should not // look for an alternative way to this. else if (((Address)_context.LocalAddress).CompareTo((Address)channel.PeerAddress) < 0) { byte[] data = channel.ReadFromSocket(); IRequest message = _shard.ChannelFormatter.Deserialize(data) as IRequest; connectInfo = message.Message as ConnectInfo; if (LoggerManager.Instance.ShardLogger != null && LoggerManager.Instance.ShardLogger.IsDebugEnabled) { LoggerManager.Instance.ShardLogger.Debug("ResolveChannelDispute.SetConnectInfo() ", "Node " + _context.LocalAddress.ToString() + ": Receiver, " + "Node " + channel.PeerAddress.ToString() + ": Sender."); } } channel.ConnectInfo = connectInfo; return(channel); }
public Boolean OnSessionEstablished(Session session) { Server server = new Server(new Common.Net.Address(session.IP.ToString(), session.LocalPort), Status.Initializing); IDualChannel channel = new DualChannel(session.Connection, session.IP.ToString(), this.context.LocalAddress.Port, context.LocalAddress.ToString(), SessionTypes.Shard, _traceProvider, _channelFormatter); bool isConnected = false; try { isConnected = channel.Connect(false); } catch (ChannelException e) { if (LoggerManager.Instance.ShardLogger != null && LoggerManager.Instance.ShardLogger.IsErrorEnabled) { LoggerManager.Instance.ShardLogger.Error("Error: Localshard.OnSessionEstd()", e.ToString()); } } if (isConnected) { ConnectInfo.ConnectStatus status = ConnectInfo.ConnectStatus.CONNECT_FIRST_TIME; if (_shardChannels.ContainsKey(server)) { status = ConnectInfo.ConnectStatus.RECONNECTING; } IDualChannel acceptedChannel = _resolveDispute.GetValidChannel(_resolveDispute.SetConnectInfo(channel, status), _shardChannels); lock (_shardChannels) { _shardChannels[server] = acceptedChannel; } _shardChannels[server].RegisterRequestHandler(this); _shardChannels[server].StartReceiverThread(); return(true); } else { return(false); } }
public bool OnSessionEstablished(Session session) { // check if the shardConnected event is required to be raised bool shardConnected = false; Server server = new Server(new Common.Net.Address(session.IP.ToString(), this._shardPort), Status.Initializing); IRequestResponseChannel channel = factory.GetChannel(session.Connection, session.IP.ToString(), this._shardPort, context.LocalAddress.ToString(), SessionTypes.Shard, _traceProvider, _channelFormatter); LoggerManager.Instance.SetThreadContext(new LoggerContext() { ShardName = _name != null ? _name : "", DatabaseName = "" }); try { if (_remoteShardChannel != null && !((IDualChannel)_remoteShardChannel).Connected && _remoteShardChannel.PeerAddress.Equals(server)) { session.Connection.Disconnect(); //throw new ChannelException("already connected with shard"+_name); } if (channel.Connect(false)) { ConnectInfo.ConnectStatus status = ConnectInfo.ConnectStatus.CONNECT_FIRST_TIME; if (_remoteShardChannel != null && _remoteShardChannel.PeerAddress.Equals(server.Address)) { status = ConnectInfo.ConnectStatus.RECONNECTING; } lock (_onChannel) { _remoteShardChannel = _resolveDispute.GetValidChannel(_resolveDispute.SetConnectInfo(channel as IDualChannel, status), _remoteShardChannel); ((IDualChannel)_remoteShardChannel).StartReceiverThread(); ((IDualChannel)_remoteShardChannel).RegisterRequestHandler(this); shardConnected = true; } if (_primary != null && !_primary.Address.Equals(server.Address)) { BrokenConnectionInfo info = new BrokenConnectionInfo(); info.BrokenAddress = _primary.Address; info.SessionType = SessionTypes.Shard; _connectionRestoration.UnregisterListener(info); } lock (_onPrimary) { _primary = server; } if (LoggerManager.Instance.ShardLogger != null && LoggerManager.Instance.ShardLogger.IsInfoEnabled) { LoggerManager.Instance.ShardLogger.Info("RemoteShard.OnSessionEstd()", "Session of the shard " + _name + " estd successfully"); } return(IsStarted = true); } else { return(false); } } catch (ChannelException e) { if (LoggerManager.Instance.ShardLogger != null && LoggerManager.Instance.ShardLogger.IsErrorEnabled) { LoggerManager.Instance.ShardLogger.Error("Error: RemoteShard.OnSessionEstd()", e.ToString()); } return(false); } finally { if (shardConnected) { ShardConnected(); } } }