From 475e621f8272ff52afc07eddde585977c9564b6f Mon Sep 17 00:00:00 2001 From: Karina Zhou Date: Mon, 2 Dec 2019 13:45:01 -0800 Subject: [PATCH 1/2] Use CancellationTokenResource only for non-infinite timeout --- .../Data/SqlClient/SNI/SNITcpHandle.cs | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs index cd269e5916..e0f7499c05 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs @@ -198,17 +198,8 @@ private static Socket Connect(string serverName, int port, TimeSpan timeout, boo ipAddresses = new IPAddress[] { serverIPv4, serverIPv6 }; Socket[] sockets = new Socket[2]; - CancellationTokenSource cts = new CancellationTokenSource(); + CancellationTokenSource cts = null; - if (isInfiniteTimeout) - { - cts.CancelAfter(-1); - } - else - { - cts.CancelAfter(timeout); - } - void Cancel() { for (int i = 0; i < sockets.Length; ++i) @@ -224,33 +215,44 @@ void Cancel() catch { } } } - cts.Token.Register(Cancel); - Socket availableSocket = null; - for (int i = 0; i < sockets.Length; ++i) + if (!isInfiniteTimeout) { - try + cts = new CancellationTokenSource(); + cts.CancelAfter(timeout); + cts.Token.Register(Cancel); + } + + Socket availableSocket = null; + try { + for (int i = 0; i < sockets.Length; ++i) { - if (ipAddresses[i] != null) + try { - sockets[i] = new Socket(ipAddresses[i].AddressFamily, SocketType.Stream, ProtocolType.Tcp); - sockets[i].Connect(ipAddresses[i], port); - if (sockets[i] != null) // sockets[i] can be null if cancel callback is executed during connect() + if (ipAddresses[i] != null) { - if (sockets[i].Connected) + sockets[i] = new Socket(ipAddresses[i].AddressFamily, SocketType.Stream, ProtocolType.Tcp); + sockets[i].Connect(ipAddresses[i], port); + if (sockets[i] != null) // sockets[i] can be null if cancel callback is executed during connect() { - availableSocket = sockets[i]; - break; - } - else - { - sockets[i].Dispose(); - sockets[i] = null; + if (sockets[i].Connected) + { + availableSocket = sockets[i]; + break; + } + else + { + sockets[i].Dispose(); + sockets[i] = null; + } } } } + catch { } } - catch { } + } + finally{ + cts?.Dispose(); } return availableSocket; From 4862191062a5a799b0018d309c855f28eb162cf5 Mon Sep 17 00:00:00 2001 From: Karina Zhou Date: Mon, 2 Dec 2019 16:28:55 -0800 Subject: [PATCH 2/2] formatting and minor change to ctor --- .../src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs index e0f7499c05..e877f27ca2 100644 --- a/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs +++ b/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SNI/SNITcpHandle.cs @@ -218,13 +218,13 @@ void Cancel() if (!isInfiniteTimeout) { - cts = new CancellationTokenSource(); - cts.CancelAfter(timeout); + cts = new CancellationTokenSource(timeout); cts.Token.Register(Cancel); } Socket availableSocket = null; - try { + try + { for (int i = 0; i < sockets.Length; ++i) { try @@ -251,7 +251,8 @@ void Cancel() catch { } } } - finally{ + finally + { cts?.Dispose(); }