//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);
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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();
                }
            }
        }