Well that was fun to debug!
|
cts.CancelAfter(parameters.ConnectionTimeout * 1000); // Convert to milliseconds |
As the ConnectionTimeout is used to set the cancellation token's CancelAfter * 1000...
- If
ConnectionTimeout = 0 then 0 * 1000 = 0 - this causes the cancellation token to immediately expire, so all operations such as gather the tenant metadata fail with A task was canceled exception message (which is what led me down this rabbit hole).
- If
ConnectionTimeout = int.MaxValue (or any value greater than int.MaxValue / 1000) then int.MaxValue * 1000 throws as the result is larger than int.
Ideally this needs more defensive coding, eg:
- When
ConnectionTimeout == 0 we do not require a CancelAfter?
- When
ConnectionTimeout >= int.MaxValue / 1000 set the CancelAfter to int.MaxValue?
Well that was fun to debug!
SqlClient/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/ActiveDirectoryAuthenticationProvider.cs
Line 117 in 3f0c4b1
As the
ConnectionTimeoutis used to set the cancellation token'sCancelAfter* 1000...ConnectionTimeout = 0then0 * 1000 = 0- this causes the cancellation token to immediately expire, so all operations such as gather the tenant metadata fail withA task was canceledexception message (which is what led me down this rabbit hole).ConnectionTimeout = int.MaxValue(or any value greater than int.MaxValue / 1000) thenint.MaxValue * 1000throws as the result is larger than int.Ideally this needs more defensive coding, eg:
ConnectionTimeout == 0we do not require aCancelAfter?ConnectionTimeout >= int.MaxValue / 1000set theCancelAftertoint.MaxValue?