From 0d4351b94db1923d68ed1d366f4df550f8d2c944 Mon Sep 17 00:00:00 2001 From: campersau Date: Fri, 13 May 2022 18:19:11 +0200 Subject: [PATCH] Fix SapConnectionPool when connection.Connect() throws --- src/SapNwRfc/Pooling/SapConnectionPool.cs | 11 ++++++++++- src/SapNwRfc/Pooling/SapPooledConnection.cs | 9 ++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/SapNwRfc/Pooling/SapConnectionPool.cs b/src/SapNwRfc/Pooling/SapConnectionPool.cs index c3f964e..8c8da64 100644 --- a/src/SapNwRfc/Pooling/SapConnectionPool.cs +++ b/src/SapNwRfc/Pooling/SapConnectionPool.cs @@ -114,7 +114,16 @@ public ISapConnection GetConnection(CancellationToken cancellationToken = defaul if (connection != null) { - connection.Connect(); + try + { + connection.Connect(); + } + catch + { + lock (_syncRoot) _openConnectionCount--; + throw; + } + return connection; } } diff --git a/src/SapNwRfc/Pooling/SapPooledConnection.cs b/src/SapNwRfc/Pooling/SapPooledConnection.cs index 78bd6d2..93be3a2 100644 --- a/src/SapNwRfc/Pooling/SapPooledConnection.cs +++ b/src/SapNwRfc/Pooling/SapPooledConnection.cs @@ -73,9 +73,10 @@ public void InvokeFunction(string name, CancellationToken cancellationToken = de /// public void InvokeFunction(string name, object input, CancellationToken cancellationToken = default) { + _connection = _connection ?? _pool.GetConnection(cancellationToken); + try { - _connection = _connection ?? _pool.GetConnection(cancellationToken); using (ISapFunction function = _connection.CreateFunction(name)) function.Invoke(input); } @@ -94,9 +95,10 @@ public void InvokeFunction(string name, object input, CancellationToken cancella /// public TOutput InvokeFunction(string name, CancellationToken cancellationToken = default) { + _connection = _connection ?? _pool.GetConnection(cancellationToken); + try { - _connection = _connection ?? _pool.GetConnection(cancellationToken); using (ISapFunction function = _connection.CreateFunction(name)) return function.Invoke(); } @@ -115,9 +117,10 @@ public TOutput InvokeFunction(string name, CancellationToken cancellati /// public TOutput InvokeFunction(string name, object input, CancellationToken cancellationToken = default) { + _connection = _connection ?? _pool.GetConnection(cancellationToken); + try { - _connection = _connection ?? _pool.GetConnection(cancellationToken); using (ISapFunction function = _connection.CreateFunction(name)) return function.Invoke(input); }