[ https://issues.apache.org/jira/browse/TINKERPOP-2268?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
stephen mallette updated TINKERPOP-2268: ---------------------------------------- Description: When a consumer of the Gremlin.Net client calls to execute a Gremlin query, i.e. "SubmitAsync," and there is no valid connection, there will be a costly timeout error. I have experienced 30 to 90 second timeouts. I was on vacation, so I didn't do this earlier, but I have written a little patch that will refresh the connection pool when there is no valid connection, and it works flawlessly. This is quick code, and there is a more elegant solution, but what I did is to check IsOpen on the first connection snapshot, and create a new pool if it was stale. Here is is the code on the GremlinClient object: {code} private ConnectionPool _connectionPool; //{color:#ff0000}used to be readonly{color} // member variables private readonly GremlinServer _gremlinServer = null; private readonly GraphSONReader _graphSONReader = null; private readonly GraphSONWriter _graphSONWriter = null; private readonly string _mimeType = null; private readonly ConnectionPoolSettings _connectionPoolSettings = null; private readonly Action<ClientWebSocketOptions> _webSocketConfiguration = null; // public GremlinClient(GremlinServer gremlinServer, GraphSONReader graphSONReader = null, GraphSONWriter graphSONWriter = null, string mimeType = null, ConnectionPoolSettings connectionPoolSettings = null, Action<ClientWebSocketOptions> webSocketConfiguration = null) { // _gremlinServer = gremlinServer; _graphSONReader = graphSONReader; _graphSONWriter = graphSONWriter; _mimeType = mimeType; _connectionPoolSettings = connectionPoolSettings; _webSocketConfiguration = webSocketConfiguration; // {color:#ff0000}NewConnectionPool(){color}; } private void NewConnectionPool() { var reader = _graphSONReader ?? new GraphSON3Reader(); var writer = _graphSONWriter ?? new GraphSON3Writer(); var connectionFactory = new ConnectionFactory(_gremlinServer, reader, writer, _mimeType ?? DefaultMimeType, _webSocketConfiguration); _connectionPool = new ConnectionPool(connectionFactory, _connectionPoolSettings ?? new ConnectionPoolSettings()); } /// <summary> /// Provides whether the first available connection snapshot in pool is still open. /// </summary> {color:#ff0000}private{color} bool HasOpenConnection => (bool)_connectionPool?.FirstConnectionSnapshot?.IsOpen; /// <inheritdoc /> public async Task<ResultSet<T>> SubmitAsync<T>(RequestMessage requestMessage) { if (!HasOpenConnection) { Debug.WriteLine("====================================="); Debug.WriteLine("new connection pool"); {color:#ff0000}NewConnectionPool(){color}; } using (var connection = await _connectionPool.GetAvailableConnectionAsync().ConfigureAwait(false)) { return await connection.SubmitAsync<T>(requestMessage).ConfigureAwait(false); } } {code} was: When a consumer of the Gremlin.Net client calls to execute a Gremlin query, i.e. "SubmitAsync," and there is no valid connection, there will be a costly timeout error. I have experienced 30 to 90 second timeouts. I was on vacation, so I didn't do this earlier, but I have written a little patch that will refresh the connection pool when there is no valid connection, and it works flawlessly. This is quick code, and there is a more elegant solution, but what I did is to check IsOpen on the first connection snapshot, and create a new pool if it was stale. Here is is the code on the GremlinClient object: private ConnectionPool _connectionPool; //{color:#ff0000}used to be readonly{color} // member variables private readonly GremlinServer _gremlinServer = null; private readonly GraphSONReader _graphSONReader = null; private readonly GraphSONWriter _graphSONWriter = null; private readonly string _mimeType = null; private readonly ConnectionPoolSettings _connectionPoolSettings = null; private readonly Action<ClientWebSocketOptions> _webSocketConfiguration = null; // public GremlinClient(GremlinServer gremlinServer, GraphSONReader graphSONReader = null, GraphSONWriter graphSONWriter = null, string mimeType = null, ConnectionPoolSettings connectionPoolSettings = null, Action<ClientWebSocketOptions> webSocketConfiguration = null) { // _gremlinServer = gremlinServer; _graphSONReader = graphSONReader; _graphSONWriter = graphSONWriter; _mimeType = mimeType; _connectionPoolSettings = connectionPoolSettings; _webSocketConfiguration = webSocketConfiguration; // {color:#ff0000}NewConnectionPool(){color}; } private void NewConnectionPool() { var reader = _graphSONReader ?? new GraphSON3Reader(); var writer = _graphSONWriter ?? new GraphSON3Writer(); var connectionFactory = new ConnectionFactory(_gremlinServer, reader, writer, _mimeType ?? DefaultMimeType, _webSocketConfiguration); _connectionPool = new ConnectionPool(connectionFactory, _connectionPoolSettings ?? new ConnectionPoolSettings()); } /// <summary> /// Provides whether the first available connection snapshot in pool is still open. /// </summary> {color:#ff0000}private{color} bool HasOpenConnection => (bool)_connectionPool?.FirstConnectionSnapshot?.IsOpen; /// <inheritdoc /> public async Task<ResultSet<T>> SubmitAsync<T>(RequestMessage requestMessage) { if (!HasOpenConnection) { Debug.WriteLine("====================================="); Debug.WriteLine("new connection pool"); {color:#ff0000}NewConnectionPool(){color}; } using (var connection = await _connectionPool.GetAvailableConnectionAsync().ConfigureAwait(false)) { return await connection.SubmitAsync<T>(requestMessage).ConfigureAwait(false); } } > Prevent Connection Failure from Hanging > --------------------------------------- > > Key: TINKERPOP-2268 > URL: https://issues.apache.org/jira/browse/TINKERPOP-2268 > Project: TinkerPop > Issue Type: Improvement > Components: dotnet, driver > Environment: .Net Core > Reporter: MichaelZ > Priority: Major > Labels: patch > Original Estimate: 24h > Remaining Estimate: 24h > > When a consumer of the Gremlin.Net client calls to execute a Gremlin query, > i.e. "SubmitAsync," and there is no valid connection, there will be a costly > timeout error. I have experienced 30 to 90 second timeouts. > I was on vacation, so I didn't do this earlier, but I have written a little > patch that will refresh the connection pool when there is no valid > connection, and it works flawlessly. This is quick code, and there is a more > elegant solution, but what I did is to check IsOpen on the first connection > snapshot, and create a new pool if it was stale. Here is is the code on the > GremlinClient object: > {code} > private ConnectionPool _connectionPool; //{color:#ff0000}used to be > readonly{color} > // member variables > private readonly GremlinServer _gremlinServer = null; > private readonly GraphSONReader _graphSONReader = null; > private readonly GraphSONWriter _graphSONWriter = null; > private readonly string _mimeType = null; > private readonly ConnectionPoolSettings _connectionPoolSettings = null; > private readonly Action<ClientWebSocketOptions> _webSocketConfiguration = > null; > // > public GremlinClient(GremlinServer gremlinServer, GraphSONReader > graphSONReader = null, > GraphSONWriter graphSONWriter = null, string mimeType = null, > ConnectionPoolSettings connectionPoolSettings = null, > Action<ClientWebSocketOptions> webSocketConfiguration = null) > { > // > _gremlinServer = gremlinServer; > _graphSONReader = graphSONReader; > _graphSONWriter = graphSONWriter; > _mimeType = mimeType; > _connectionPoolSettings = connectionPoolSettings; > _webSocketConfiguration = webSocketConfiguration; > // > {color:#ff0000}NewConnectionPool(){color}; > } > private void NewConnectionPool() > { > var reader = _graphSONReader ?? new GraphSON3Reader(); > var writer = _graphSONWriter ?? new GraphSON3Writer(); > var connectionFactory = new ConnectionFactory(_gremlinServer, reader, writer, > _mimeType ?? DefaultMimeType, _webSocketConfiguration); > _connectionPool = new ConnectionPool(connectionFactory, > _connectionPoolSettings ?? new ConnectionPoolSettings()); > } > /// <summary> > /// Provides whether the first available connection snapshot in pool is > still open. > /// </summary> > {color:#ff0000}private{color} bool HasOpenConnection => > (bool)_connectionPool?.FirstConnectionSnapshot?.IsOpen; > /// <inheritdoc /> > public async Task<ResultSet<T>> SubmitAsync<T>(RequestMessage requestMessage) > { > if (!HasOpenConnection) > { > Debug.WriteLine("====================================="); > Debug.WriteLine("new connection pool"); > {color:#ff0000}NewConnectionPool(){color}; > } > using (var connection = await > _connectionPool.GetAvailableConnectionAsync().ConfigureAwait(false)) > { return await > connection.SubmitAsync<T>(requestMessage).ConfigureAwait(false); } > } > {code} > -- This message was sent by Atlassian JIRA (v7.6.14#76016)