Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 0944051

Browse files
authored
Add Async flag to SqlClient NamedPipes' PipeStream to resolve an issue with connection hangs while using MARS over NP. (#19022) (#19035)
1 parent 4223cde commit 0944051

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

src/System.Data.SqlClient/src/System/Data/SqlClient/SNI/SNINpHandle.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@ public SNINpHandle(string serverName, string pipeName, long timerExpire, object
4646

4747
try
4848
{
49-
_pipeStream = new NamedPipeClientStream(serverName, pipeName, PipeDirection.InOut, PipeOptions.WriteThrough, Security.Principal.TokenImpersonationLevel.None);
49+
_pipeStream = new NamedPipeClientStream(
50+
serverName,
51+
pipeName,
52+
PipeDirection.InOut,
53+
PipeOptions.Asynchronous | PipeOptions.WriteThrough);
5054

5155
bool isInfiniteTimeOut = long.MaxValue == timerExpire;
5256
if (isInfiniteTimeOut)

src/System.Data.SqlClient/tests/ManualTests/SQL/LocalDBTest/LocalDBTest.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,25 @@ public static class LocalDBTest
1313
[ConditionalFact(nameof(IsLocalDBEnvironmentSet))]
1414
public static void LocalDBConnectionTest()
1515
{
16-
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder("server=(localdb)\\MSSQLLocalDB");
16+
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(@"server=(localdb)\MSSQLLocalDB");
1717
builder.IntegratedSecurity = true;
1818
builder.ConnectTimeout = 2;
19-
using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
19+
OpenConnection(builder.ConnectionString);
20+
}
21+
22+
[ConditionalFact(nameof(IsLocalDBEnvironmentSet))]
23+
public static void LocalDBMarsTest()
24+
{
25+
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(@"server=(localdb)\MSSQLLocalDB;");
26+
builder.IntegratedSecurity = true;
27+
builder.MultipleActiveResultSets = true;
28+
builder.ConnectTimeout = 2;
29+
OpenConnection(builder.ConnectionString);
30+
}
31+
32+
private static void OpenConnection(string connString)
33+
{
34+
using (SqlConnection connection = new SqlConnection(connString))
2035
{
2136
connection.Open();
2237
using (SqlCommand command = new SqlCommand("SELECT @@SERVERNAME", connection))

src/System.Data.SqlClient/tests/ManualTests/SQL/MARSTest/MARSTest.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,24 @@ public static class MARSTest
1313
{
1414
private static readonly string _connStr = (new SqlConnectionStringBuilder(DataTestUtility.TcpConnStr) { MultipleActiveResultSets = true }).ConnectionString;
1515

16+
[CheckConnStrSetupFact]
17+
public static void NamedPipesMARSTest()
18+
{
19+
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(DataTestUtility.NpConnStr);
20+
builder.MultipleActiveResultSets = true;
21+
builder.ConnectTimeout = 5;
22+
23+
using (SqlConnection conn = new SqlConnection(builder.ConnectionString))
24+
{
25+
conn.Open();
26+
using (SqlCommand command = new SqlCommand("SELECT @@SERVERNAME", conn))
27+
{
28+
var result = command.ExecuteScalar();
29+
Assert.NotNull(result);
30+
}
31+
}
32+
}
33+
1634
#if DEBUG
1735
[CheckConnStrSetupFact]
1836
public static void MARSAsyncTimeoutTest()

0 commit comments

Comments
 (0)