Holds the clientSocket to one of the members of Hazelcast ICluster.
Holds the clientSocket to one of the members of Hazelcast ICluster.
コード例 #1
0
 public ClientListenerInvocation(IClientMessage message, DistributedEventHandler handler,
    DecodeStartListenerResponse responseDecoder, ClientConnection connection)
     : base(message, connection)
 {
     _responseDecoder = responseDecoder;
     _handler = handler;
 }
コード例 #2
0
 public void DestroyConnection(ClientConnection connection, Exception cause)
 {
     var address = connection.GetAddress();
     Logger.Finest("Destroying connection " + connection + " due to " + cause.Message);
     if (address != null)
     {
         ClientConnection conn;
         if (_addresses.TryRemove(address, out conn))
         {
             connection.Close();
             FireConnectionListenerEvent(f => f.ConnectionRemoved(connection));
         }
         else
         {
             Logger.Warning("Could not find connection " + connection +
                            " in list of connections, could not destroy connection. Current list of connections are " +
                            string.Join(", ", _addresses.Keys));
             connection.Close();
         }
     }
     else
     {
         // connection has not authenticated yet
         ((ClientInvocationService) _client.GetInvocationService()).CleanUpConnectionResources(connection);
     }
 }
コード例 #3
0
        private ClientConnection InitializeConnection(Address address, Authenticator authenticator)
        {
            CheckLive();
            ClientConnection connection = null;
            var id = _nextConnectionId;
            try
            {
                if (Logger.IsFinestEnabled())
                {
                    Logger.Finest("Creating new connection for " + address + " with id " + id);
                }

                connection = new ClientConnection(this, (ClientInvocationService) _client.GetInvocationService(), id, address, _networkConfig);

                connection.Init(_socketInterceptor);
                authenticator(connection);
                Interlocked.Increment(ref _nextConnectionId);
                Logger.Finest("Authenticated to " + connection);
                return connection;
            }
            catch (Exception e)
            {
                if (Logger.IsFinestEnabled())
                {
                    Logger.Finest("Error connecting to " + address + " with id " + id, e);
                }

                if (connection != null)
                {
                    connection.Close();
                }
                throw ExceptionUtil.Rethrow(e, typeof (IOException), typeof (SocketException),
                    typeof (TargetDisconnectedException));
            }
        }
コード例 #4
0
        private void CleanupEventHandlers(ClientConnection connection)
        {
            var keys = new List<long>();
            foreach (var entry in _listenerInvocations)
            {
                if (entry.Value.SentConnection == connection && entry.Value.BoundConnection == null)
                {
                    keys.Add(entry.Key);
                }
            }

            foreach (var key in keys)
            {
                ClientListenerInvocation invocation;
                _listenerInvocations.TryRemove(key, out invocation);

                if (invocation.Future.IsComplete && invocation.Future.Result != null)
                {
                    //re-register listener on a new node
                    _client.GetClientExecutionService().Submit(() =>
                    {
                        if (!_isShutDown)
                        {
                            ReregisterListener(invocation);
                        }
                    });
                }
            }
        }
コード例 #5
0
 private void FailRequest(ClientConnection connection, ClientInvocation invocation)
 {
     if (_client.GetConnectionManager().Live)
     {
         HandleException(invocation,
             new TargetDisconnectedException(connection.GetAddress()));
     }
     else
     {
         FailRequestDueToShutdown(invocation);
     }
 }
コード例 #6
0
 public void CleanUpConnectionResources(ClientConnection connection)
 {
     Logger.Finest("Cleaning up connection resources for " + connection.Id);
     CleanupInvocations(connection);
     CleanupEventHandlers(connection);
 }
コード例 #7
0
 public IFuture<IClientMessage> InvokeOnConnection(IClientMessage request, ClientConnection connection)
 {
     var clientInvocation = new ClientInvocation(request, connection);
     Send(connection, clientInvocation);
     return clientInvocation.Future;
 }
コード例 #8
0
 public IFuture<IClientMessage> InvokeOnConnection(IClientMessage request, ClientConnection connection,
     bool bypassHeartbeat = false)
 {
     var clientInvocation = new ClientInvocation(request, connection);
     InvokeInternal(clientInvocation, null, connection, bypassHeartbeat);
     return clientInvocation.Future;
 }
コード例 #9
0
        private void CleanupEventHandlers(ClientConnection connection)
        {
            var keys = new List<long>();
            foreach (var entry in _listenerInvocations)
            {
                if (entry.Value.SentConnection == connection && entry.Value.BoundConnection == null)
                {
                    keys.Add(entry.Key);
                }
            }

            foreach (var key in keys)
            {
                ClientListenerInvocation invocation;
                _listenerInvocations.TryRemove(key, out invocation);

                if (invocation.Future.IsComplete && invocation.Future.Result != null)
                {
                    //re-register listener on a new node
                    if (!_isShutDown)
                    {
                        _client.GetClientExecutionService().Schedule(() =>
                            {
                                ReregisterListener(invocation)
                                    .ToTask()
                                    .ContinueWith(t => { Logger.Warning("Cannot reregister listener.", t.Exception); },
                                        TaskContinuationOptions.OnlyOnFaulted |
                                        TaskContinuationOptions.ExecuteSynchronously);
                            }, RetryWaitTime, TimeUnit.Milliseconds);
                    }
                }
            }
        }
コード例 #10
0
 public void HeartBeatStopped(ClientConnection connection)
 {
     if (connection.GetAddress().Equals(_ownerConnectionAddress))
     {
         _connectionManager.DestroyConnection(connection);
     }
 }
コード例 #11
0
        private void ManagerAuthenticator(ClientConnection connection)
        {
            Logger.Finest("Authenticating against the owner node");
            var ss = _client.GetSerializationService();

            string uuid = null;
            string ownerUuid = null;
            if (_principal != null)
            {
                uuid = _principal.GetUuid();
                ownerUuid = _principal.GetOwnerUuid();
            }
            ClientMessage request;
            if (_credentials is UsernamePasswordCredentials)
            {
                var usernamePasswordCr = (UsernamePasswordCredentials) _credentials;
                request = ClientAuthenticationCodec.EncodeRequest(usernamePasswordCr.GetUsername(),
                    usernamePasswordCr.GetPassword(), uuid, ownerUuid, true,
                    ClientTypes.Csharp, _client.GetSerializationService().GetVersion());
            }
            else
            {
                var data = ss.ToData(_credentials);
                request = ClientAuthenticationCustomCodec.EncodeRequest(data, uuid, ownerUuid, false,
                    ClientTypes.Csharp, _client.GetSerializationService().GetVersion());
            }

            connection.Init();
            IClientMessage response;
            try
            {
                var invocationService = (ClientInvocationService) _client.GetInvocationService();
                response = ThreadUtil.GetResult(invocationService.InvokeOnConnection(request, connection));
            }
            catch (Exception e)
            {
                throw ExceptionUtil.Rethrow(e);
            }
            var result = ClientAuthenticationCodec.DecodeResponse(response);

            var member = new Member(result.address, result.ownerUuid);
            _principal = new ClientPrincipal(result.uuid, result.ownerUuid);

            connection.SetRemoteMember(member);
        }
コード例 #12
0
 public void ConnectionRemoved(ClientConnection connection)
 {
     var executionService = (ClientExecutionService) _client.GetClientExecutionService();
     if (Equals(connection.GetAddress(), _ownerConnectionAddress))
     {
         if (_client.GetLifecycleService().IsRunning())
         {
             executionService.SubmitInternal(() =>
             {
                 try
                 {
                     FireConnectionEvent(LifecycleEvent.LifecycleState.ClientDisconnected);
                     ConnectToCluster();
                 }
                 catch (Exception e)
                 {
                     Logger.Warning("Could not re-connect to cluster shutting down the client", e);
                     _client.GetLifecycleService().Shutdown();
                 }
             });
         }
     }
 }
コード例 #13
0
 public ClientInvocation(IClientMessage message, ClientConnection boundConnection)
     : this(message)
 {
     _boundConnection = boundConnection;
 }
コード例 #14
0
 private bool Equals(ClientConnection other)
 {
     return(_id == other._id);
 }
コード例 #15
0
 public void ConnectionAdded(ClientConnection connection)
 {
     // noop
 }
コード例 #16
0
 private void CleanupInvocations(ClientConnection connection)
 {
     var keys = new List<long>();
     foreach (var entry in _invocations)
     {
         if (entry.Value.SentConnection == connection)
         {
             keys.Add(entry.Key);
         }
     }
     foreach (var key in keys)
     {
         ClientInvocation invocation;
         if (_invocations.TryRemove(key, out invocation))
         {
             var ex = _client.GetConnectionManager().Live
                 ? new TargetDisconnectedException(connection.GetAddress(), "connection was closed.")
                 : new HazelcastException("Client is shut down.");
             HandleInvocationException(invocation, ex);
         }
     }
 }
コード例 #17
0
 public void ConnectionRemoved(ClientConnection connection)
 {
     CleanUpConnectionResources(connection);
 }
コード例 #18
0
        private void InvokeInternal(ClientInvocation invocation, Address address = null,
            ClientConnection connection = null, bool bypassHeartbeat = false)
        {
            try
            {
                if (connection == null)
                {
                    if (address == null)
                    {
                        address = GetRandomAddress();
                    }
                    connection = GetConnection(address);
                    if (connection == null)
                    {
                        //Create an async conneciion and send the invocation afterward.
                        _clientConnectionManager.GetOrConnectAsync(address).ContinueWith(t =>
                            {
                                if (t.IsFaulted)
                                {
                                    HandleInvocationException(invocation, t.Exception.Flatten().InnerExceptions.First());
                                }
                                else
                                {
                                    InvokeInternal(invocation, address, t.Result);
                                }
                            })
                            .ContinueWith(t =>
                                {
                                    HandleInvocationException(invocation, t.Exception.Flatten().InnerExceptions.First());
                                }, TaskContinuationOptions.OnlyOnFaulted |
                                   TaskContinuationOptions.ExecuteSynchronously);
                        return;
                    }
                }
                //Sending Invocation via connection
                UpdateInvocation(invocation, connection);
                ValidateInvocation(invocation, connection, bypassHeartbeat);

                if (!TrySend(invocation, connection))
                {
                    //Sending failed.
                    if (_client.GetConnectionManager().Live)
                    {
                        throw new TargetDisconnectedException(connection.GetAddress(), "Error writing to socket.");
                    }
                    throw new HazelcastException("Client is shut down.");
                }
                //Successfully sended.
            }
            catch (Exception e)
            {
                HandleInvocationException(invocation, e);
            }
        }
コード例 #19
0
 public IFuture<IClientMessage> InvokeListenerOnConnection(IClientMessage request,
     DistributedEventHandler handler, DecodeStartListenerResponse responseDecoder, ClientConnection connection)
 {
     var clientInvocation = new ClientListenerInvocation(request, handler, responseDecoder, connection);
     Send(connection, clientInvocation);
     return clientInvocation.Future;
 }
コード例 #20
0
        private bool TrySend(ClientInvocation clientInvocation, ClientConnection connection)
        {
            var correlationId = clientInvocation.Message.GetCorrelationId();
            if (!TryRegisterInvocation(correlationId, clientInvocation)) return false;

            //enqueue to write queue
            if (connection.WriteAsync((ISocketWritable) clientInvocation.Message))
            {
                return true;
            }

            //Rollback sending failed
            if (Logger.IsFinestEnabled())
            {
                Logger.Finest("Unable to write request " + clientInvocation.Message + " to connection " + connection);
            }
            UnregisterInvocation(correlationId);
            RemoveEventHandler(correlationId);
            return false;
        }
コード例 #21
0
        protected virtual void Send(ClientConnection connection, ClientInvocation clientInvocation)
        {
            var correlationId = NextCorrelationId();
            clientInvocation.Message.SetCorrelationId(correlationId);
            clientInvocation.Message.AddFlag(ClientMessage.BeginAndEndFlags);
            clientInvocation.SentConnection = connection;
            if (clientInvocation.PartitionId != -1)
            {
                clientInvocation.Message.SetPartitionId(clientInvocation.PartitionId);
            }
            if (clientInvocation.MemberUuid != null && clientInvocation.MemberUuid != connection.GetMember().GetUuid())
            {
                HandleException(clientInvocation,
                    new TargetNotMemberException(
                        "The member UUID on the invocation doesn't match the member UUID on the connection."));
            }

            if (_isShutDown)
            {
                FailRequestDueToShutdown(clientInvocation);
            }
            else
            {
                RegisterInvocation(correlationId, clientInvocation);

                //enqueue to write queue
                if (!connection.WriteAsync((ISocketWritable) clientInvocation.Message))
                {
                    UnregisterCall(correlationId);
                    RemoveEventHandler(correlationId);
                    FailRequest(connection, clientInvocation);
                }
            }
        }
コード例 #22
0
 private void UpdateInvocation(ClientInvocation clientInvocation, ClientConnection connection)
 {
     var correlationId = NextCorrelationId();
     clientInvocation.Message.SetCorrelationId(correlationId);
     clientInvocation.Message.AddFlag(ClientMessage.BeginAndEndFlags);
     clientInvocation.SentConnection = connection;
     if (clientInvocation.PartitionId != -1)
     {
         clientInvocation.Message.SetPartitionId(clientInvocation.PartitionId);
     }
 }
コード例 #23
0
 private void CleanupInvocations(ClientConnection connection)
 {
     var keys = new List<long>();
     foreach (var entry in _invocations)
     {
         if (entry.Value.SentConnection == connection)
         {
             keys.Add(entry.Key);
         }
     }
     foreach (var key in keys)
     {
         ClientInvocation invocation;
         _invocations.TryRemove(key, out invocation);
         FailRequest(connection, invocation);
     }
 }
コード例 #24
0
        private void ValidateInvocation(ClientInvocation clientInvocation, ClientConnection connection,
            bool bypassHeartbeat)
        {
            if (clientInvocation.MemberUuid != null && clientInvocation.MemberUuid != connection.Member.GetUuid())
            {
                throw new TargetNotMemberException(
                    "The member UUID on the invocation doesn't match the member UUID on the connection.");
            }

            if (!connection.IsHeartBeating && !bypassHeartbeat)
            {
                throw new TargetDisconnectedException(connection.GetAddress() + " has stopped heartbeating.");
            }

            if (_isShutDown)
            {
                throw new HazelcastException("Client is shut down.");
            }
        }
コード例 #25
0
 public void DestroyConnection(ClientConnection connection)
 {
     var address = connection.GetAddress();
     // ReSharper disable once InconsistentlySynchronizedField
     Logger.Finest("Destroying connection " + connection);
     if (address != null)
     {
         ClientConnection conn;
         if (_addresses.TryRemove(address, out conn))
         {
             connection.Close();
             FireConnectionListenerEvent(f => f.ConnectionRemoved(connection));
         }
     }
     else
     {
         // connection has not authenticated yet
         ((ClientInvocationService) _client.GetInvocationService()).CleanUpConnectionResources(connection);
     }
 }
コード例 #26
0
 public void HeartBeatStarted(ClientConnection connection)
 {
     // noop
 }
コード例 #27
0
        private void ClusterAuthenticator(ClientConnection connection)
        {
            var ss = _client.GetSerializationService();
            var clusterService = (ClientClusterService) _client.GetClientClusterService();
            var principal = clusterService.GetPrincipal();

            var uuid = principal.GetUuid();
            var ownerUuid = principal.GetOwnerUuid();
            ClientMessage request;

            var usernamePasswordCr = _credentials as UsernamePasswordCredentials;
            if (usernamePasswordCr != null)
            {
                request = ClientAuthenticationCodec.EncodeRequest(usernamePasswordCr.GetUsername(),
                    usernamePasswordCr.GetPassword(), uuid, ownerUuid, false,
                    ClientTypes.Csharp, _client.GetSerializationService().GetVersion());
            }
            else
            {
                var data = ss.ToData(_credentials);
                request = ClientAuthenticationCustomCodec.EncodeRequest(data, uuid, ownerUuid, false,
                    ClientTypes.Csharp, _client.GetSerializationService().GetVersion());
            }

            IClientMessage response;
            try
            {
                var future = ((ClientInvocationService) _client.GetInvocationService()).InvokeOnConnection(request,
                    connection);
                response = ThreadUtil.GetResult(future);
            }
            catch (Exception e)
            {
                throw ExceptionUtil.Rethrow(e);
            }
            var rp = ClientAuthenticationCodec.DecodeResponse(response);

            if (rp.address == null)
            {
                throw new HazelcastException("Could not resolve address for member.");
            }

            var member = _client.GetClientClusterService().GetMember(rp.address);
            if (member == null)
            {
                throw new HazelcastException("Node with address '" + rp.address + "' was not found in the member list");
            }
            connection.Member = member;
        }
コード例 #28
0
 public void HeartBeatStopped(ClientConnection connection)
 {
     CleanupInvocations(connection);
     CleanupEventHandlers(connection);
 }
コード例 #29
0
 private ClientGetPartitionsCodec.ResponseParameters GetPartitionsFrom(ClientConnection connection)
 {
     var request = ClientGetPartitionsCodec.EncodeRequest();
     var task = ((ClientInvocationService) _client.GetInvocationService()).InvokeOnConnection(request, connection);
     var result = ThreadUtil.GetResult(task, PartitionTimeout);
     return ClientGetPartitionsCodec.DecodeResponse(result);
 }
コード例 #30
0
        private void Authenticate(ClientConnection connection, bool isOwnerConnection)
        {
            if (Logger.IsFinestEnabled())
            {
                Logger.Finest(string.Format("Authenticating against the {0} node", isOwnerConnection?"owner":"non-owner"));
            }
            string uuid      = null;
            string ownerUuid = null;

            if (ClientPrincipal != null)
            {
                uuid      = ClientPrincipal.GetUuid();
                ownerUuid = ClientPrincipal.GetOwnerUuid();
            }

            var           ss = _client.GetSerializationService();
            ClientMessage request;
            var           credentials = _credentialsFactory.NewCredentials();

            LastCredentials = credentials;
            if (credentials.GetType() == typeof(UsernamePasswordCredentials))
            {
                var usernamePasswordCr = (UsernamePasswordCredentials)credentials;
                request = ClientAuthenticationCodec.EncodeRequest(usernamePasswordCr.Username, usernamePasswordCr.Password, uuid,
                                                                  ownerUuid, isOwnerConnection, ClientTypes.Csharp, ss.GetVersion(), VersionUtil.GetDllVersion());
            }
            else
            {
                var data = ss.ToData(credentials);
                request = ClientAuthenticationCustomCodec.EncodeRequest(data, uuid, ownerUuid, isOwnerConnection,
                                                                        ClientTypes.Csharp, ss.GetVersion(), VersionUtil.GetDllVersion());
            }

            IClientMessage response;

            try
            {
                var invocationService = (ClientInvocationService)_client.GetInvocationService();
                response = ThreadUtil.GetResult(invocationService.InvokeOnConnection(request, connection), _heartbeatTimeout);
            }
            catch (Exception e)
            {
                var ue = ExceptionUtil.Rethrow(e);
                Logger.Finest("Member returned an exception during authentication.", ue);
                throw ue;
            }
            var result = ClientAuthenticationCodec.DecodeResponse(response);

            if (result.address == null)
            {
                throw new HazelcastException("Could not resolve address for member.");
            }
            switch (result.status)
            {
            case AuthenticationStatus.Authenticated:
                if (isOwnerConnection)
                {
                    var member = new Member(result.address, result.ownerUuid);
                    ClientPrincipal   = new ClientPrincipal(result.uuid, result.ownerUuid);
                    connection.Member = member;
                    connection.SetOwner();
                    connection.ConnectedServerVersionStr = result.serverHazelcastVersion;
                }
                else
                {
                    var member = _client.GetClientClusterService().GetMember(result.address);
                    if (member == null)
                    {
                        throw new HazelcastException(string.Format("Node with address '{0}' was not found in the member list",
                                                                   result.address));
                    }
                    connection.Member = member;
                }
                break;

            case AuthenticationStatus.CredentialsFailed:
                throw new AuthenticationException("Invalid credentials! Principal: " + ClientPrincipal);

            case AuthenticationStatus.SerializationVersionMismatch:
                throw new InvalidOperationException("Server serialization version does not match to client");

            default:
                throw new AuthenticationException("Authentication status code not supported. status: " + result.status);
            }
        }