[
https://issues.apache.org/jira/browse/TINKERPOP-2268?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16904227#comment-16904227
]
MichaelZ commented on TINKERPOP-2268:
-------------------------------------
# yes, cosmos db.
# the reason i say client-side is that this client may disconnect from the
internet, for example, even if cosmos didn't close on its end.
# maybe there is another way than the ping to maintain a healthy pool. we can
replace the ping with a client-side 29 second non-activity timeout that
recreates the connection OR actually calls some generic, low-overhead call like
HTTP's HEAD verb...maybe Stephen knows of some such call in Gremlin. For what
it's worth I can try to find some super light call to do if we see that the
timeout on a connection is nearing the cosmos db limit. it could simply be a
cosmos db setting, not for all backends, or it could be generic enough for all
backends. one idea i had would be to send a bad query, i.e.
'g.constant('ff')', and the server would keep the socket alive, but not charge
RU.
# yes, i looked a little deeper and i see the index for round robin.
# conflict in that context = race condition. yes, it seems that one thing
should happen or the other, but you can check it yourself with a cosmos db and
you will see the error and its long timeout. in my experience, it's longer
than 30 seconds on cosmos' side, if that's what they are doing.
# true, as to number of connections, as long as you have enough requests per
connection, and enough time to recover a dead connection, scaling should be
efficient. the most pressing issue is the hanging. once that's fixed, you
could make the number of connections to the pool a setting too.
> 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
> 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)