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

Commit 18cac5a

Browse files
geoffkizerstephentoub
authored andcommitted
change sync timeout handling back to use actual sync timeouts (#29132)
* change sync timeout handling back to use actual sync timeouts instead of async * address review feedback
1 parent 5a4553d commit 18cac5a

File tree

3 files changed

+39
-38
lines changed

3 files changed

+39
-38
lines changed

src/Common/src/System/Net/SafeCloseSocket.Unix.cs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,6 @@ public int ReceiveTimeout
157157
set
158158
{
159159
Debug.Assert(value == -1 || value > 0, $"Unexpected value: {value}");
160-
161-
// We always implement timeouts using nonblocking I/O and AsyncContext,
162-
// to avoid issues when switching from blocking I/O to nonblocking.
163-
if (value != -1)
164-
{
165-
SetHandleNonBlocking();
166-
}
167-
168160
_receiveTimeout = value;
169161
}
170162
}
@@ -178,14 +170,6 @@ public int SendTimeout
178170
set
179171
{
180172
Debug.Assert(value == -1 || value > 0, $"Unexpected value: {value}");
181-
182-
// We always implement timeouts using nonblocking I/O and AsyncContext,
183-
// to avoid issues when switching from blocking I/O to nonblocking.
184-
if (value != -1)
185-
{
186-
SetHandleNonBlocking();
187-
}
188-
189173
_sendTimeout = value;
190174
}
191175
}
@@ -349,7 +333,7 @@ public static unsafe InnerSafeCloseSocket Accept(SafeCloseSocket socketHandle, b
349333
IntPtr acceptedFd;
350334
if (!socketHandle.IsNonBlocking)
351335
{
352-
errorCode = socketHandle.AsyncContext.Accept(socketAddress, ref socketAddressLen, -1, out acceptedFd);
336+
errorCode = socketHandle.AsyncContext.Accept(socketAddress, ref socketAddressLen, out acceptedFd);
353337
}
354338
else
355339
{

src/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncContext.Unix.cs

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,11 +1242,23 @@ private void PerformSyncOperation<TOperation>(ref OperationQueue<TOperation> que
12421242
}
12431243
}
12441244

1245-
public SocketError Accept(byte[] socketAddress, ref int socketAddressLen, int timeout, out IntPtr acceptedFd)
1245+
private bool ShouldRetrySyncOperation(out SocketError errorCode)
1246+
{
1247+
if (_nonBlockingSet)
1248+
{
1249+
errorCode = SocketError.Success; // Will be ignored
1250+
return true;
1251+
}
1252+
1253+
// We are in blocking mode, so the EAGAIN we received indicates a timeout.
1254+
errorCode = SocketError.TimedOut;
1255+
return false;
1256+
}
1257+
1258+
public SocketError Accept(byte[] socketAddress, ref int socketAddressLen, out IntPtr acceptedFd)
12461259
{
12471260
Debug.Assert(socketAddress != null, "Expected non-null socketAddress");
12481261
Debug.Assert(socketAddressLen > 0, $"Unexpected socketAddressLen: {socketAddressLen}");
1249-
Debug.Assert(timeout == -1 || timeout > 0, $"Unexpected timeout: {timeout}");
12501262

12511263
SocketError errorCode;
12521264
int observedSequenceNumber;
@@ -1263,7 +1275,7 @@ public SocketError Accept(byte[] socketAddress, ref int socketAddressLen, int ti
12631275
SocketAddressLen = socketAddressLen,
12641276
};
12651277

1266-
PerformSyncOperation(ref _receiveQueue, operation, timeout, observedSequenceNumber);
1278+
PerformSyncOperation(ref _receiveQueue, operation, -1, observedSequenceNumber);
12671279

12681280
socketAddressLen = operation.SocketAddressLen;
12691281
acceptedFd = operation.AcceptedFileDescriptor;
@@ -1307,11 +1319,10 @@ public SocketError AcceptAsync(byte[] socketAddress, ref int socketAddressLen, o
13071319
return SocketError.IOPending;
13081320
}
13091321

1310-
public SocketError Connect(byte[] socketAddress, int socketAddressLen, int timeout)
1322+
public SocketError Connect(byte[] socketAddress, int socketAddressLen)
13111323
{
13121324
Debug.Assert(socketAddress != null, "Expected non-null socketAddress");
13131325
Debug.Assert(socketAddressLen > 0, $"Unexpected socketAddressLen: {socketAddressLen}");
1314-
Debug.Assert(timeout == -1 || timeout > 0, $"Unexpected timeout: {timeout}");
13151326

13161327
// Connect is different than the usual "readiness" pattern of other operations.
13171328
// We need to call TryStartConnect to initiate the connect with the OS,
@@ -1332,7 +1343,7 @@ public SocketError Connect(byte[] socketAddress, int socketAddressLen, int timeo
13321343
SocketAddressLen = socketAddressLen
13331344
};
13341345

1335-
PerformSyncOperation(ref _sendQueue, operation, timeout, observedSequenceNumber);
1346+
PerformSyncOperation(ref _sendQueue, operation, -1, observedSequenceNumber);
13361347

13371348
return operation.ErrorCode;
13381349
}
@@ -1398,7 +1409,8 @@ public SocketError ReceiveFrom(Memory<byte> buffer, ref SocketFlags flags, byte[
13981409
SocketError errorCode;
13991410
int observedSequenceNumber;
14001411
if (_receiveQueue.IsReady(this, out observedSequenceNumber) &&
1401-
SocketPal.TryCompleteReceiveFrom(_socket, buffer.Span, flags, socketAddress, ref socketAddressLen, out bytesReceived, out receivedFlags, out errorCode))
1412+
(SocketPal.TryCompleteReceiveFrom(_socket, buffer.Span, flags, socketAddress, ref socketAddressLen, out bytesReceived, out receivedFlags, out errorCode) ||
1413+
!ShouldRetrySyncOperation(out errorCode)))
14021414
{
14031415
flags = receivedFlags;
14041416
return errorCode;
@@ -1425,7 +1437,8 @@ public unsafe SocketError ReceiveFrom(Span<byte> buffer, ref SocketFlags flags,
14251437
SocketError errorCode;
14261438
int observedSequenceNumber;
14271439
if (_receiveQueue.IsReady(this, out observedSequenceNumber) &&
1428-
SocketPal.TryCompleteReceiveFrom(_socket, buffer, flags, socketAddress, ref socketAddressLen, out bytesReceived, out receivedFlags, out errorCode))
1440+
(SocketPal.TryCompleteReceiveFrom(_socket, buffer, flags, socketAddress, ref socketAddressLen, out bytesReceived, out receivedFlags, out errorCode) ||
1441+
!ShouldRetrySyncOperation(out errorCode)))
14291442
{
14301443
flags = receivedFlags;
14311444
return errorCode;
@@ -1503,7 +1516,8 @@ public SocketError ReceiveFrom(IList<ArraySegment<byte>> buffers, ref SocketFlag
15031516
SocketError errorCode;
15041517
int observedSequenceNumber;
15051518
if (_receiveQueue.IsReady(this, out observedSequenceNumber) &&
1506-
SocketPal.TryCompleteReceiveFrom(_socket, buffers, flags, socketAddress, ref socketAddressLen, out bytesReceived, out receivedFlags, out errorCode))
1519+
(SocketPal.TryCompleteReceiveFrom(_socket, buffers, flags, socketAddress, ref socketAddressLen, out bytesReceived, out receivedFlags, out errorCode) ||
1520+
!ShouldRetrySyncOperation(out errorCode)))
15071521
{
15081522
flags = receivedFlags;
15091523
return errorCode;
@@ -1570,7 +1584,8 @@ public SocketError ReceiveMessageFrom(
15701584
SocketError errorCode;
15711585
int observedSequenceNumber;
15721586
if (_receiveQueue.IsReady(this, out observedSequenceNumber) &&
1573-
SocketPal.TryCompleteReceiveMessageFrom(_socket, buffer.Span, buffers, flags, socketAddress, ref socketAddressLen, isIPv4, isIPv6, out bytesReceived, out receivedFlags, out ipPacketInformation, out errorCode))
1587+
(SocketPal.TryCompleteReceiveMessageFrom(_socket, buffer.Span, buffers, flags, socketAddress, ref socketAddressLen, isIPv4, isIPv6, out bytesReceived, out receivedFlags, out ipPacketInformation, out errorCode) ||
1588+
!ShouldRetrySyncOperation(out errorCode)))
15741589
{
15751590
flags = receivedFlags;
15761591
return errorCode;
@@ -1657,7 +1672,8 @@ public SocketError SendTo(byte[] buffer, int offset, int count, SocketFlags flag
16571672
SocketError errorCode;
16581673
int observedSequenceNumber;
16591674
if (_sendQueue.IsReady(this, out observedSequenceNumber) &&
1660-
SocketPal.TryCompleteSendTo(_socket, buffer, ref offset, ref count, flags, socketAddress, socketAddressLen, ref bytesSent, out errorCode))
1675+
(SocketPal.TryCompleteSendTo(_socket, buffer, ref offset, ref count, flags, socketAddress, socketAddressLen, ref bytesSent, out errorCode) ||
1676+
!ShouldRetrySyncOperation(out errorCode)))
16611677
{
16621678
return errorCode;
16631679
}
@@ -1688,7 +1704,8 @@ public unsafe SocketError SendTo(ReadOnlySpan<byte> buffer, SocketFlags flags, b
16881704
int bufferIndexIgnored = 0, offset = 0, count = buffer.Length;
16891705
int observedSequenceNumber;
16901706
if (_sendQueue.IsReady(this, out observedSequenceNumber) &&
1691-
SocketPal.TryCompleteSendTo(_socket, buffer, null, ref bufferIndexIgnored, ref offset, ref count, flags, socketAddress, socketAddressLen, ref bytesSent, out errorCode))
1707+
(SocketPal.TryCompleteSendTo(_socket, buffer, null, ref bufferIndexIgnored, ref offset, ref count, flags, socketAddress, socketAddressLen, ref bytesSent, out errorCode) ||
1708+
!ShouldRetrySyncOperation(out errorCode)))
16921709
{
16931710
return errorCode;
16941711
}
@@ -1769,7 +1786,8 @@ public SocketError SendTo(IList<ArraySegment<byte>> buffers, SocketFlags flags,
17691786
SocketError errorCode;
17701787
int observedSequenceNumber;
17711788
if (_sendQueue.IsReady(this, out observedSequenceNumber) &&
1772-
SocketPal.TryCompleteSendTo(_socket, buffers, ref bufferIndex, ref offset, flags, socketAddress, socketAddressLen, ref bytesSent, out errorCode))
1789+
(SocketPal.TryCompleteSendTo(_socket, buffers, ref bufferIndex, ref offset, flags, socketAddress, socketAddressLen, ref bytesSent, out errorCode) ||
1790+
!ShouldRetrySyncOperation(out errorCode)))
17731791
{
17741792
return errorCode;
17751793
}
@@ -1836,7 +1854,8 @@ public SocketError SendFile(SafeFileHandle fileHandle, long offset, long count,
18361854
SocketError errorCode;
18371855
int observedSequenceNumber;
18381856
if (_sendQueue.IsReady(this, out observedSequenceNumber) &&
1839-
SocketPal.TryCompleteSendFile(_socket, fileHandle, ref offset, ref count, ref bytesSent, out errorCode))
1857+
(SocketPal.TryCompleteSendFile(_socket, fileHandle, ref offset, ref count, ref bytesSent, out errorCode) ||
1858+
!ShouldRetrySyncOperation(out errorCode)))
18401859
{
18411860
return errorCode;
18421861
}

src/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -864,7 +864,7 @@ public static SocketError Connect(SafeCloseSocket handle, byte[] socketAddress,
864864
{
865865
if (!handle.IsNonBlocking)
866866
{
867-
return handle.AsyncContext.Connect(socketAddress, socketAddressLen, -1);
867+
return handle.AsyncContext.Connect(socketAddress, socketAddressLen);
868868
}
869869

870870
SocketError errorCode;
@@ -1097,17 +1097,15 @@ public static unsafe SocketError SetSockOpt(SafeCloseSocket handle, SocketOption
10971097
{
10981098
if (optionName == SocketOptionName.ReceiveTimeout)
10991099
{
1100-
// Note, setting a non-infinite timeout will force the handle into nonblocking mode
11011100
handle.ReceiveTimeout = optionValue == 0 ? -1 : optionValue;
1102-
handle.TrackOption(optionLevel, optionName);
1103-
return SocketError.Success;
1101+
err = Interop.Sys.SetReceiveTimeout(handle, optionValue);
1102+
return GetErrorAndTrackSetting(handle, optionLevel, optionName, err);
11041103
}
11051104
else if (optionName == SocketOptionName.SendTimeout)
11061105
{
1107-
// Note, setting a non-infinite timeout will force the handle into nonblocking mode
11081106
handle.SendTimeout = optionValue == 0 ? -1 : optionValue;
1109-
handle.TrackOption(optionLevel, optionName);
1110-
return SocketError.Success;
1107+
err = Interop.Sys.SetSendTimeout(handle, optionValue);
1108+
return GetErrorAndTrackSetting(handle, optionLevel, optionName, err);
11111109
}
11121110
}
11131111
else if (optionLevel == SocketOptionLevel.IP)

0 commit comments

Comments
 (0)