Esempio n. 1
0
        /// <summary>
        /// Initializes the connection.
        /// </summary>
        /// <exception cref="SocketException">Throws a SocketException when the connection could not be established with the host</exception>
        /// <exception cref="AuthenticationException" />
        /// <exception cref="UnsupportedProtocolVersionException"></exception>
        public async Task <Response> Open()
        {
            _freeOperations    = new ConcurrentStack <short>(Enumerable.Range(0, MaxConcurrentRequests).Select(s => (short)s).Reverse());
            _pendingOperations = new ConcurrentDictionary <short, OperationState>();
            _writeQueue        = new ConcurrentQueue <OperationState>();

            if (Options.CustomCompressor != null)
            {
                Compressor = Options.CustomCompressor;
            }
            else if (Options.Compression == CompressionType.LZ4)
            {
#if !NETCORE
                Compressor = new LZ4Compressor();
#else
                throw new NotSupportedException("Lz4 compression not supported under .NETCore");
#endif
            }
            else if (Options.Compression == CompressionType.Snappy)
            {
                Compressor = new SnappyCompressor();
            }

            //Init TcpSocket
            _tcpSocket.Init();
            _tcpSocket.Error   += CancelPending;
            _tcpSocket.Closing += () => CancelPending(null);
            //Read and write event handlers are going to be invoked using IO Threads
            _tcpSocket.Read           += ReadHandler;
            _tcpSocket.WriteCompleted += WriteCompletedHandler;
            var protocolVersion = _serializer.ProtocolVersion;
            await _tcpSocket.Connect().ConfigureAwait(false);

            Response response;
            try
            {
                response = await Startup().ConfigureAwait(false);
            }
            catch (ProtocolErrorException ex)
            {
                // As we are starting up, check for protocol version errors.
                // There is no other way than checking the error message from Cassandra
                if (ex.Message.Contains("Invalid or unsupported protocol version"))
                {
                    throw new UnsupportedProtocolVersionException(protocolVersion, ex);
                }
                throw;
            }
            if (response is AuthenticateResponse)
            {
                return(await StartAuthenticationFlow(((AuthenticateResponse)response).Authenticator)
                       .ConfigureAwait(false));
            }
            if (response is ReadyResponse)
            {
                return(response);
            }
            throw new DriverInternalError("Expected READY or AUTHENTICATE, obtained " + response.GetType().Name);
        }
Esempio n. 2
0
        /// <summary>
        /// Initializes the connection. Thread safe.
        /// </summary>
        /// <exception cref="SocketException">Throws a SocketException when the connection could not be established with the host</exception>
        /// <exception cref="AuthenticationException" />
        /// <exception cref="UnsupportedProtocolVersionException"></exception>
        public virtual void Init()
        {
            _freeOperations    = new ConcurrentStack <short>(Enumerable.Range(0, MaxConcurrentRequests).Select(s => (short)s).Reverse());
            _pendingOperations = new ConcurrentDictionary <short, OperationState>();
            _writeQueue        = new ConcurrentQueue <OperationState>();

            if (Options.CustomCompressor != null)
            {
                Compressor = Options.CustomCompressor;
            }
            else if (Options.Compression == CompressionType.LZ4)
            {
                Compressor = new LZ4Compressor();
            }
            else if (Options.Compression == CompressionType.Snappy)
            {
                Compressor = new SnappyCompressor();
            }

            //Init TcpSocket
            _tcpSocket.Init();
            _tcpSocket.Error   += CancelPending;
            _tcpSocket.Closing += () => CancelPending(null, null);
            //Read and write event handlers are going to be invoked using IO Threads
            _tcpSocket.Read           += ReadHandler;
            _tcpSocket.WriteCompleted += WriteCompletedHandler;
            _tcpSocket.Connect();

            var startupTask = Startup();

            try
            {
                TaskHelper.WaitToComplete(startupTask, _tcpSocket.Options.ConnectTimeoutMillis);
            }
            catch (ProtocolErrorException ex)
            {
                //As we are starting up, check for protocol version errors
                //There is no other way than checking the error message from Cassandra
                if (ex.Message.Contains("Invalid or unsupported protocol version"))
                {
                    throw new UnsupportedProtocolVersionException(ProtocolVersion, ex);
                }
                throw;
            }
            if (startupTask.Result is AuthenticateResponse)
            {
                Authenticate();
            }
            else if (!(startupTask.Result is ReadyResponse))
            {
                throw new DriverInternalError("Expected READY or AUTHENTICATE, obtained " + startupTask.Result.GetType().Name);
            }
        }
        /// <summary>
        /// Initializes the connection.
        /// </summary>
        /// <exception cref="SocketException">Throws a SocketException when the connection could not be established with the host</exception>
        /// <exception cref="AuthenticationException" />
        /// <exception cref="UnsupportedProtocolVersionException"></exception>
        public Task <Response> Open()
        {
            _freeOperations    = new ConcurrentStack <short>(Enumerable.Range(0, MaxConcurrentRequests).Select(s => (short)s).Reverse());
            _pendingOperations = new ConcurrentDictionary <short, OperationState>();
            _writeQueue        = new ConcurrentQueue <OperationState>();

            if (Options.CustomCompressor != null)
            {
                Compressor = Options.CustomCompressor;
            }
            else if (Options.Compression == CompressionType.LZ4)
            {
                Compressor = new LZ4Compressor();
            }
            else if (Options.Compression == CompressionType.Snappy)
            {
                Compressor = new SnappyCompressor();
            }

            //Init TcpSocket
            _tcpSocket.Init();
            _tcpSocket.Error   += CancelPending;
            _tcpSocket.Closing += () => CancelPending(null, null);
            //Read and write event handlers are going to be invoked using IO Threads
            _tcpSocket.Read           += ReadHandler;
            _tcpSocket.WriteCompleted += WriteCompletedHandler;
            return(_tcpSocket
                   .Connect()
                   .Then(_ => Startup())
                   .ContinueWith(t =>
            {
                if (t.IsFaulted && t.Exception != null)
                {
                    //Adapt the inner exception and rethrow
                    var ex = t.Exception.InnerException;
                    var protocolVersion = _serializer.ProtocolVersion;
                    if (ex is ProtocolErrorException)
                    {
                        //As we are starting up, check for protocol version errors
                        //There is no other way than checking the error message from Cassandra
                        if (ex.Message.Contains("Invalid or unsupported protocol version"))
                        {
                            throw new UnsupportedProtocolVersionException(protocolVersion, ex);
                        }
                    }
                    if (ex is ServerErrorException && protocolVersion >= 3 && ex.Message.Contains("ProtocolException: Invalid or unsupported protocol version"))
                    {
                        //For some versions of Cassandra, the error is wrapped into a server error
                        //See CASSANDRA-9451
                        throw new UnsupportedProtocolVersionException(protocolVersion, ex);
                    }
                    throw ex;
                }
                return t.Result;
            }, TaskContinuationOptions.ExecuteSynchronously)
                   .Then(response =>
            {
                if (response is AuthenticateResponse)
                {
                    return StartAuthenticationFlow(((AuthenticateResponse)response).Authenticator);
                }
                if (response is ReadyResponse)
                {
                    return TaskHelper.ToTask(response);
                }
                throw new DriverInternalError("Expected READY or AUTHENTICATE, obtained " + response.GetType().Name);
            }));
        }