Skip to content

Commit c3b8c52

Browse files
authored
feat(bin): detect connection refused error and exit early (#248)
1 parent b80af30 commit c3b8c52

File tree

4 files changed

+54
-23
lines changed

4 files changed

+54
-23
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## Unreleased
99

10+
## [0.26.4] - 2025-01-27
11+
12+
* runner: add random string in path generation to avoid conflict when using `include`.
13+
* bin: detect connection refused error and exit early to make error message clearer.
14+
1015
## [0.26.3] - 2025-01-14
1116

1217
* bin: when `--fail-fast` is enabled, abort all remaining connections before dropping temporary databases.

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ resolver = "2"
33
members = ["sqllogictest", "sqllogictest-bin", "sqllogictest-engines", "tests"]
44

55
[workspace.package]
6-
version = "0.26.3"
6+
version = "0.26.4"
77
edition = "2021"
88
homepage = "https://github.com/risinglightdb/sqllogictest-rs"
99
keywords = ["sql", "database", "parser", "cli"]

sqllogictest-bin/src/main.rs

Lines changed: 45 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)