/// <summary> /// Open the connection. /// </summary> /// <returns>A reference to the current connection instance for action chaining.</returns> public override VoltConnection Open() { // Synchronize access. lock (this.SyncRoot) { // Validate connection status. if (this.Status != ConnectionStatus.Closed) { throw new InvalidOperationException(string.Format(Resources.InvalidConnectionStatus, this.Status)); } // Set status to "connecting". this.Status = ConnectionStatus.Connecting; // Connect to the default endpoint (there should only be one anyways if this is a managed pool // connection, otherwise, you're on your own - this is a connection, not a Pool!). IPEndPoint endPoint = this.Settings.DefaultIPEndPoint; try { // Create new socket stream and wrap a core protocol stream manager around it. this.BaseStream = new VoltProtocolStream(endPoint, this.Settings.ConnectionTimeout); // Now send login message. using (Serializer serializer = new Serializer()) { var msg = serializer .Write(this.Settings.ServiceType.ToString().ToLowerInvariant()) .Write(this.Settings.UserID) .WriteRaw(SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(this.Settings.Password))) .GetBytes(); this.BaseStream.WriteMessage(msg.Array, msg.Offset, msg.Count); } // Receive and process login response message. var deserializer = new Deserializer(this.BaseStream.ReadMessage()); LoginResponseStatus status = (LoginResponseStatus)deserializer.ReadSByte(); if (status != LoginResponseStatus.Connected) { // Re-package server response in an appropriate exception. switch (status) { case LoginResponseStatus.ConnectionHandshakeTimeout: throw new VoltConnectionException( Resources.LRS_ConnectionHandshakeTimeout , endPoint , status ); case LoginResponseStatus.CorruptedHandshake: throw new VoltConnectionException( Resources.LRS_CorruptedHandshake , endPoint , status ); case LoginResponseStatus.InvalidCredentials: throw new VoltPermissionException( Resources.LRS_InvalidCredentials , endPoint , status ); case LoginResponseStatus.ServerTooBusy: throw new VoltConnectionException( Resources.LRS_ServerTooBusy , endPoint , status ); default: throw new VoltConnectionException(Resources.LRS_Unknown, endPoint, status); } } // Parse the rest of the response the get core cluster information. try { this.ServerHostId = deserializer.ReadInt32(); this.ConnectionId = deserializer.ReadInt64(); this.ClusterStartTimeStamp = deserializer.ReadDateTimeFromMilliseconds(); this.LeaderIPEndPoint = new IPEndPoint( new IPAddress(deserializer.ReadRaw(4)) , endPoint.Port ); this.BuildString = deserializer.ReadString(); } catch (Exception x) { throw new VoltConnectionException(Resources.LR_FailedParsingResponse, x, endPoint); } // Now that we are successfully connected, set the socket timeout to infinite (we are constantly // listening for new messages). this.BaseStream.ResetTimeout(Timeout.Infinite); // Create background threads. this.BackgroundNetworkThread = new Thread(this.BackgroundNetworkThreadRun) { IsBackground = true, Priority = ThreadPriority.AboveNormal }; this.BackgroundTimeoutThread = new Thread(this.BackgroundTimeoutThreadRun) { IsBackground = true }; // Starting background processing threads. this.BackgroundNetworkThread.Start(); this.BackgroundTimeoutThread.Start(); // Start Callback executor this.CallbackExecutor.Start(); // Ensure terminal exception is reset this.TerminalException = null; // Connection is now ready. this.Status = ConnectionStatus.Connected; // Initialize statistics as needed. if (this.Settings.StatisticsEnabled) { this.Stats = new Dictionary <string, Statistics>(StringComparer.OrdinalIgnoreCase); // For lifetime statistics, keep track of previous connection cycles, if any. if (this.LifetimeStats != null) { if (this.PastLifetimeStats != null) { this.PastLifetimeStats.SummarizeWith(this.LifetimeStats); } else { this.PastLifetimeStats = this.LifetimeStats; } } this.LifetimeStats = new Statistics(); } // Trace as needed if (this.Settings.TraceEnabled) { VoltTrace.TraceEvent( TraceEventType.Information , VoltTraceEventType.ConnectionOpened , Resources.TraceConnectionOpened , this.ServerHostId , this.ConnectionId , endPoint , this.LeaderIPEndPoint , this.ClusterStartTimeStamp , this.BuildString ); } } catch (Exception x) { try { // In case of failure, terminate everything immediately (will correct status). this.Terminate(); } catch { } // Re-throw exception, wrapping if needed. if (x is VoltException) { throw new VoltConnectionException(Resources.ConnectionFailure, x, endPoint); } else { throw x; } } } return(this); }
/// <summary> /// Open the connection. /// </summary> /// <returns>A reference to the current connection instance for action chaining.</returns> public override VoltConnection Open() { // Synchronize access. lock (this.SyncRoot) { // Validate connection status. if (this.Status != ConnectionStatus.Closed) throw new InvalidOperationException(string.Format(Resources.InvalidConnectionStatus, this.Status)); // Set status to "connecting". this.Status = ConnectionStatus.Connecting; // Connect to the default endpoint (there should only be one anyways if this is a managed pool // connection, otherwise, you're on your own - this is a connection, not a Pool!). IPEndPoint endPoint = this.Settings.DefaultIPEndPoint; try { // Create new socket stream and wrap a core protocol stream manager around it. this.BaseStream = new VoltProtocolStream(endPoint, this.Settings.ConnectionTimeout); // Now send login message. using (Serializer serializer = new Serializer()) { var msg = serializer .Write(this.Settings.ServiceType.ToString().ToLowerInvariant()) .Write(this.Settings.UserID) .WriteRaw(SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(this.Settings.Password))) .GetBytes(); this.BaseStream.WriteMessage(msg.Array, msg.Offset, msg.Count); } // Receive and process login response message. var deserializer = new Deserializer(this.BaseStream.ReadMessage()); LoginResponseStatus status = (LoginResponseStatus)deserializer.ReadSByte(); if (status != LoginResponseStatus.Connected) { // Re-package server response in an appropriate exception. switch (status) { case LoginResponseStatus.ConnectionHandshakeTimeout: throw new VoltConnectionException( Resources.LRS_ConnectionHandshakeTimeout , endPoint , status ); case LoginResponseStatus.CorruptedHandshake: throw new VoltConnectionException( Resources.LRS_CorruptedHandshake , endPoint , status ); case LoginResponseStatus.InvalidCredentials: throw new VoltPermissionException( Resources.LRS_InvalidCredentials , endPoint , status ); case LoginResponseStatus.ServerTooBusy: throw new VoltConnectionException( Resources.LRS_ServerTooBusy , endPoint , status ); default: throw new VoltConnectionException(Resources.LRS_Unknown, endPoint, status); } } // Parse the rest of the response the get core cluster information. try { this.ServerHostId = deserializer.ReadInt32(); this.ConnectionId = deserializer.ReadInt64(); this.ClusterStartTimeStamp = deserializer.ReadDateTimeFromMilliseconds(); this.LeaderIPEndPoint = new IPEndPoint( new IPAddress(deserializer.ReadRaw(4)) , endPoint.Port ); this.BuildString = deserializer.ReadString(); } catch (Exception x) { throw new VoltConnectionException(Resources.LR_FailedParsingResponse, x, endPoint); } // Now that we are successfully connected, set the socket timeout to infinite (we are constantly // listening for new messages). this.BaseStream.ResetTimeout(Timeout.Infinite); // Create background threads. this.BackgroundNetworkThread = new Thread(this.BackgroundNetworkThreadRun) { IsBackground = true, Priority = ThreadPriority.AboveNormal }; this.BackgroundTimeoutThread = new Thread(this.BackgroundTimeoutThreadRun) { IsBackground = true }; // Starting background processing threads. this.BackgroundNetworkThread.Start(); this.BackgroundTimeoutThread.Start(); // Start Callback executor this.CallbackExecutor.Start(); // Ensure terminal exception is reset this.TerminalException = null; // Connection is now ready. this.Status = ConnectionStatus.Connected; // Initialize statistics as needed. if (this.Settings.StatisticsEnabled) { this.Stats = new Dictionary<string, Statistics>(StringComparer.OrdinalIgnoreCase); // For lifetime statistics, keep track of previous connection cycles, if any. if (this.LifetimeStats != null) { if (this.PastLifetimeStats != null) this.PastLifetimeStats.SummarizeWith(this.LifetimeStats); else this.PastLifetimeStats = this.LifetimeStats; } this.LifetimeStats = new Statistics(); } // Trace as needed if (this.Settings.TraceEnabled) VoltTrace.TraceEvent( TraceEventType.Information , VoltTraceEventType.ConnectionOpened , Resources.TraceConnectionOpened , this.ServerHostId , this.ConnectionId , endPoint , this.LeaderIPEndPoint , this.ClusterStartTimeStamp , this.BuildString ); } catch (Exception x) { try { // In case of failure, terminate everything immediately (will correct status). this.Terminate(); } catch { } // Re-throw exception, wrapping if needed. if (x is VoltException) throw new VoltConnectionException(Resources.ConnectionFailure, x, endPoint); else throw x; } } return this; }