Skip to content

Commit f55b272

Browse files
committed
Better capture error scenarios in TCP managed SNI.
Fix logging bug in SqlClientEventSource.
1 parent 79703ec commit f55b272

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ManagedSni/SniTcpHandle.netcore.cs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,10 +444,24 @@ private static Socket Connect(string serverName, int port, TimeoutTimer timeout,
444444

445445
Socket.Select(checkReadLst, checkWriteLst, checkErrorLst, socketSelectTimeout);
446446
// nothing selected means timeout
447+
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniTcpHandle), EventType.INFO,
448+
"Socket.Select results: checkReadLst.Count: {0}, checkWriteLst.Count: {1}, checkErrorLst.Count: {2}",
449+
checkReadLst.Count, checkWriteLst.Count, checkErrorLst.Count);
447450
} while (checkReadLst.Count == 0 && checkWriteLst.Count == 0 && checkErrorLst.Count == 0);
448451

449452
// workaround: false positive socket.Connected on linux: https://github.com/dotnet/runtime/issues/55538
450453
isConnected = socket.Connected && checkErrorLst.Count == 0;
454+
if (!isConnected)
455+
{
456+
// Retrieve the socket error code
457+
int socketErrorCode = (int)socket.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Error);
458+
SocketError socketError = (SocketError)socketErrorCode;
459+
460+
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniTcpHandle), EventType.ERR,
461+
"Socket connection failed. SocketError: {0} ({1})", socketError, socketErrorCode);
462+
463+
lastSocketException = new SocketException(socketErrorCode);
464+
}
451465
}
452466

453467
if (isConnected)
@@ -465,6 +479,8 @@ private static Socket Connect(string serverName, int port, TimeoutTimer timeout,
465479
}
466480
pendingDNSInfo = new SQLDNSInfo(cachedFQDN, iPv4String, iPv6String, port.ToString());
467481
isSocketSelected = true;
482+
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniTcpHandle), EventType.INFO,
483+
"Connected to socket: {0}", socket.RemoteEndPoint);
468484
return socket;
469485
}
470486
}
@@ -585,6 +601,20 @@ private static Socket ParallelConnect(IPAddress[] serverAddresses, int port, Tim
585601
Socket.Select(checkReadLst, checkWriteLst, checkErrorLst, socketSelectTimeout);
586602
// nothing selected means select timed out
587603
} while (checkReadLst.Count == 0 && checkWriteLst.Count == 0 && checkErrorLst.Count == 0 && !timeout.IsExpired);
604+
foreach (Socket socket in checkErrorLst)
605+
{
606+
// Retrieve the socket error code
607+
int socketErrorCode = (int)socket.GetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Error);
608+
SocketError socketError = (SocketError)socketErrorCode;
609+
610+
// Log any failed sockets
611+
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniTcpHandle), EventType.INFO,
612+
"Socket connection failed for {0}. SocketError: {1} ({2})",
613+
sockets[socket], socketError, socketErrorCode);
614+
615+
lastError = new SocketException(socketErrorCode);
616+
}
617+
588618
}
589619
catch (SocketException e)
590620
{
@@ -672,8 +702,13 @@ private static Socket ParallelConnect(IPAddress[] serverAddresses, int port, Tim
672702
}
673703

674704
SqlClientEventSource.Log.TryAdvancedTraceEvent(
675-
"{0}.{1}{2}No socket connections succeeded. Last error: {3}",
705+
"{0}.{1}{2} No socket connections succeeded. Last error: {3}",
676706
nameof(SniTcpHandle), nameof(ParallelConnect), EventType.ERR, lastError);
707+
708+
if (lastError != null)
709+
{
710+
throw lastError;
711+
}
677712
}
678713

679714
return connectedSocket;

src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlClientEventSource.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ internal long TryScopeEnterEvent(string className, [System.Runtime.CompilerServi
424424
{
425425
StringBuilder sb = new StringBuilder(className);
426426
sb.Append(".").Append(memberName).Append(" | INFO | SCOPE | Entering Scope {0}");
427-
return SNIScopeEnter(sb.ToString());
427+
return ScopeEnter(sb.ToString());
428428
}
429429
return 0;
430430
}

0 commit comments

Comments
 (0)