public void ShouldCloseIdleForTooLongConns(int sessionCount) { // Given var statisticsCollector = new StatisticsCollector(); using (var driver = GraphDatabase.Driver("bolt://127.0.0.1:7687", AuthToken, new Config { DriverStatisticsCollector = statisticsCollector, ConnectionIdleTimeout = TimeSpan.Zero // enable but always timeout idle connections })) { // When for (var i = 0; i < sessionCount; i++) { // should not reuse the same connection as it should timeout using (var session = driver.Session()) { var ret = session.Run("RETURN 1").Single(); ret[0].ValueAs <int>().Should().Be(1); Thread.Sleep(1); // block to let the timer aware the timeout } } // Then var st = ConnectionPoolStatistics.Read(statisticsCollector.CollectStatistics()); Output.WriteLine(st.ReportStatistics().ToContentString()); st.ConnCreated.Should().Be(sessionCount); st.ConnCreated.Should().Be(st.ConnClosed + 1); } }
// [InlineData(50000)] leave this to a long dedicated build public void SoakRun(int threadCount) { var statisticsCollector = new StatisticsCollector(); var driver = GraphDatabase.Driver(ServerEndPoint, AuthToken, new Config { DriverStatisticsCollector = statisticsCollector, ConnectionTimeout = Config.Infinite, EncryptionLevel = EncryptionLevel.Encrypted }); Output.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.ffffff")}] Started"); Parallel.For(0, threadCount, i => { if (i % 1000 == 0) { Output.WriteLine(statisticsCollector.CollectStatistics().ToContentString()); } string[] queries = { "RETURN 1295 + 42", "UNWIND range(1,10000) AS x CREATE (n {prop:x}) DELETE n RETURN sum(x)" }; try { using (var session = driver.Session()) { session.Run(queries[i % 2]).Consume(); } } catch (Exception e) { Output.WriteLine( $"[{DateTime.Now.ToString("HH:mm:ss.ffffff")}] Thread {i} failed to run query {queries[i % 2]} due to {e.Message}"); } }); var st = ConnectionPoolStatistics.Read(statisticsCollector.CollectStatistics()); Output.WriteLine(st.ReportStatistics().ToContentString()); Output.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.ffffff")}] Finished"); st.ConnToCreate.Should().Be(st.ConnCreated + st.ConnFailedToCreate); st.ConnToCreate.Should().Be(st.InUseConns + st.AvailableConns + st.ConnToClose); st.ConnClosed.Should().Be(st.ConnClosed); st.ConnToCreate.Should().Be(st.ConnCreated); driver.Dispose(); }