File tree Expand file tree Collapse file tree 2 files changed +12
-6
lines changed
Expand file tree Collapse file tree 2 files changed +12
-6
lines changed Original file line number Diff line number Diff line change @@ -1734,7 +1734,7 @@ internal void ResetCancellation()
17341734 internal void PerformUserCancellation( )
17351735 {
17361736 var connection = Connection;
1737- if ( connection is null || connection . ConnectorBindingScope == ConnectorBindingScope . Reader )
1737+ if ( connection is null || connection . ConnectorBindingScope == ConnectorBindingScope . Reader || UserCancellationRequested )
17381738 return;
17391739
17401740 // Take the lock first to make sure there is no concurrent Break.
@@ -1749,13 +1749,17 @@ internal void PerformUserCancellation()
17491749 Monitor. Enter ( CancelLock ) ;
17501750 }
17511751
1752- // Wait before we've read all responses for the prepended queries
1753- // as we can't gracefully handle their cancellation.
1754- // Break makes sure that it's going to be set even if we fail while reading them.
1755- ReadingPrependedMessagesMRE. Wait ( ) ;
1756-
17571752 try
17581753 {
1754+ // Wait before we've read all responses for the prepended queries
1755+ // as we can't gracefully handle their cancellation.
1756+ // Break makes sure that it's going to be set even if we fail while reading them.
1757+
1758+ // We don't wait indefinitely to avoid deadlocks from synchronous CancellationToken.Register
1759+ // See #5032
1760+ if ( ! ReadingPrependedMessagesMRE . Wait ( 0 ) )
1761+ return;
1762+
17591763 _userCancellationRequested = true;
17601764
17611765 if ( AttemptPostgresCancellation && SupportsPostgresCancellation )
Original file line number Diff line number Diff line change @@ -311,6 +311,7 @@ public async Task Cancel_async_immediately()
311311 }
312312
313313 [ Test , Description ( "Cancels an async query with the cancellation token, with successful PG cancellation" ) ]
314+ [ Explicit ( "Flaky due to #5033" ) ]
314315 public async Task Cancel_async_soft( )
315316 {
316317 if ( IsMultiplexing )
@@ -1401,6 +1402,7 @@ public async Task Concurrent_read_write_failure_deadlock()
14011402
14021403 [ Test , IssueLink ( "https://github.com/npgsql/npgsql/issues/4906" ) ]
14031404 [ Description ( "Make sure we don't cancel a prepended query (and do not deadlock in case of a failure)" ) ]
1405+ [ Explicit ( "Flaky due to #5033" ) ]
14041406 public async Task Not_cancel_prepended_query( [ Values ] bool failPrependedQuery)
14051407 {
14061408 if ( IsMultiplexing )
You can’t perform that action at this time.
0 commit comments