@@ -160,6 +160,8 @@ public async Task Ping()
160160 await using var conn = ConnectFactory ( shared : false ) ;
161161 var pub = GetAnyPrimary ( conn . DefaultClient ) ;
162162 var sub = conn . GetSubscriber ( ) ;
163+
164+ await PingAsync ( pub , sub , 5 ) . ForAwait ( ) ;
163165 await sub . SubscribeAsync ( RedisChannel . Literal ( Me ( ) ) , ( _ , __ ) => { } ) ; // to ensure we're in subscriber mode
164166 await PingAsync ( pub , sub , 5 ) . ForAwait ( ) ;
165167 }
@@ -232,10 +234,28 @@ private async Task PingAsync(IServer pub, ISubscriber sub, int times = 1)
232234 // way to prove that is to use TPL objects
233235 var subTask = sub . PingAsync ( ) ;
234236 var pubTask = pub . PingAsync ( ) ;
235- await Task . WhenAll ( subTask , pubTask ) . ForAwait ( ) ;
237+ try
238+ {
239+ await Task . WhenAll ( subTask , pubTask ) . ForAwait ( ) ;
240+ }
241+ catch ( TimeoutException ex )
242+ {
243+ throw new TimeoutException ( $ "Timeout; sub: { GetState ( subTask ) } , pub: { GetState ( pubTask ) } ", ex ) ;
244+ }
245+
246+ Log ( $ "sub: { GetState ( subTask ) } , pub: { GetState ( pubTask ) } ") ;
236247
237- Log ( $ "Sub PING time: { subTask . Result . TotalMilliseconds } ms") ;
238- Log ( $ "Pub PING time: { pubTask . Result . TotalMilliseconds } ms") ;
248+ static string GetState ( Task < TimeSpan > pending )
249+ {
250+ var status = pending . Status ;
251+ return status switch
252+ {
253+ TaskStatus . RanToCompletion => $ "{ status } in { pending . Result . TotalMilliseconds : ###,##0.0} ms)",
254+ TaskStatus . Faulted when pending . Exception is { InnerExceptions . Count : 1 } ae => $ "{ status } : { ae . InnerExceptions [ 0 ] . Message } ",
255+ TaskStatus . Faulted => $ "{ status } : { pending . Exception ? . Message } ",
256+ _ => status . ToString ( ) ,
257+ } ;
258+ }
239259 }
240260 }
241261
0 commit comments