Uploaded image for project: 'TinkerPop'
  1. TinkerPop
  2. TINKERPOP-2268

Prevent Connection Failure from Hanging

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Incomplete
    • None
    • None
    • dotnet
    • None
    • .Net Core
    • Patch

    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:

      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); }
      
      }
      

       

      Attachments

        Activity

          People

            Unassigned Unassigned
            github5775 MichaelZ
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - 24h
                24h
                Remaining:
                Remaining Estimate - 24h
                24h
                Logged:
                Time Spent - Not Specified
                Not Specified