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

Prevent Connection Failure from Hanging

    XMLWordPrintableJSON

    Details

    • Type: Improvement
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: dotnet
    • Labels:
      None
    • Environment:
      .Net Core
    • Flags:
      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

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

              Dates

              • Created:
                Updated:

                Time Tracking

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