@@ -344,7 +344,7 @@ async fn run_parallel(
344344 let mut remaining_files: HashSet < String > = HashSet :: from_iter ( filenames. clone ( ) ) ;
345345
346346 let start = Instant :: now ( ) ;
347-
347+ let mut connection_refused = false ;
348348 while let Some ( ( db_name, file, res, mut buf) ) = stream. next ( ) . await {
349349 remaining_files. remove ( & file) ;
350350 let test_case_name = file. replace ( [ '/' , ' ' , '.' , '-' ] , "_" ) ;
@@ -359,7 +359,11 @@ async fn run_parallel(
359359 }
360360 Err ( e) => {
361361 failed = true ;
362- writeln ! ( buf, "{}\n \n {:?}" , style( "[FAILED]" ) . red( ) . bold( ) , e) ?;
362+ let err = format ! ( "{:?}" , e) ;
363+ if err. contains ( "Connection refused" ) {
364+ connection_refused = true ;
365+ }
366+ writeln ! ( buf, "{}\n \n {}" , style( "[FAILED]" ) . red( ) . bold( ) , err) ?;
363367 writeln ! ( buf) ?;
364368 failed_case. push ( file. clone ( ) ) ;
365369 failed_db. insert ( db_name. clone ( ) ) ;
@@ -376,6 +380,10 @@ async fn run_parallel(
376380 } ;
377381 test_suite. add_test_case ( case) ;
378382 tokio:: task:: block_in_place ( || stdout ( ) . write_all ( & buf) ) ?;
383+ if connection_refused {
384+ eprintln ! ( "Connection refused. The server may be down. Exiting..." ) ;
385+ break ;
386+ }
379387 if fail_fast && failed {
380388 println ! ( "early exit after failure..." ) ;
381389 break ;
@@ -401,22 +409,31 @@ async fn run_parallel(
401409 // in the stream. Abort them before dropping temporary databases.
402410 drop ( stream) ;
403411
404- for db_name in db_names {
405- if keep_db_on_failure && failed_db. contains ( & db_name) {
406- eprintln ! (
407- "+ {}" ,
408- style( format!(
409- "DATABASE {db_name} contains failed cases, kept for debugging"
410- ) )
411- . red( )
412- . bold( )
413- ) ;
414- continue ;
415- }
416- let query = format ! ( "DROP DATABASE {db_name};" ) ;
417- eprintln ! ( "+ {query}" ) ;
418- if let Err ( err) = db. run ( & query) . await {
419- eprintln ! ( " ignore error: {err}" ) ;
412+ if connection_refused {
413+ eprintln ! ( "Skip dropping databases due to connection refused: {db_names:?}" ) ;
414+ } else {
415+ for db_name in db_names {
416+ if keep_db_on_failure && failed_db. contains ( & db_name) {
417+ eprintln ! (
418+ "+ {}" ,
419+ style( format!(
420+ "DATABASE {db_name} contains failed cases, kept for debugging"
421+ ) )
422+ . red( )
423+ . bold( )
424+ ) ;
425+ continue ;
426+ }
427+ let query = format ! ( "DROP DATABASE {db_name};" ) ;
428+ eprintln ! ( "+ {query}" ) ;
429+ if let Err ( err) = db. run ( & query) . await {
430+ let err = err. to_string ( ) ;
431+ if err. contains ( "Connection refused" ) {
432+ eprintln ! ( " Connection refused. The server may be down. Exiting..." ) ;
433+ break ;
434+ }
435+ eprintln ! ( " ignore DROP DATABASE error: {err}" ) ;
436+ }
420437 }
421438 }
422439
@@ -440,6 +457,7 @@ async fn run_serial(
440457 let mut failed_case = vec ! [ ] ;
441458 let mut skipped_case = vec ! [ ] ;
442459 let mut files = files. into_iter ( ) ;
460+ let mut connection_refused = false ;
443461 for file in & mut files {
444462 let mut runner = Runner :: new ( || engines:: connect ( engine, & config) ) ;
445463 for label in labels {
@@ -459,7 +477,11 @@ async fn run_serial(
459477 }
460478 Err ( e) => {
461479 failed = true ;
462- println ! ( "{}\n \n {:?}" , style( "[FAILED]" ) . red( ) . bold( ) , e) ;
480+ let err = format ! ( "{:?}" , e) ;
481+ if err. contains ( "Connection refused" ) {
482+ connection_refused = true ;
483+ }
484+ println ! ( "{}\n \n {}" , style( "[FAILED]" ) . red( ) . bold( ) , err) ;
463485 println ! ( ) ;
464486 failed_case. push ( filename. clone ( ) ) ;
465487 let mut status = TestCaseStatus :: non_success ( NonSuccessKind :: Failure ) ;
@@ -474,6 +496,10 @@ async fn run_serial(
474496 }
475497 } ;
476498 test_suite. add_test_case ( case) ;
499+ if connection_refused {
500+ eprintln ! ( "Connection refused. The server may be down. Exiting..." ) ;
501+ break ;
502+ }
477503 if fail_fast && failed {
478504 println ! ( "early exit after failure..." ) ;
479505 break ;
0 commit comments