Skip to content

Commit 26cb5c6

Browse files
Fixed a hang-bug, added CICD mode !capture ctrlc
1 parent 2d1ded6 commit 26cb5c6

File tree

7 files changed

+79
-60
lines changed

7 files changed

+79
-60
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
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
@@ -1,6 +1,6 @@
11
[package]
22
name = "tfb_toolset"
3-
version = "0.1.0"
3+
version = "0.4.2"
44
authors = ["Mike Smith", "Nate Brady"]
55
edition = "2018"
66

src/benchmarker.rs

Lines changed: 45 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::benchmarker::modes::CICD;
12
use crate::config::{Framework, Named, Project, Test};
23
use crate::docker::container::{
34
create_benchmarker_container, create_container, create_verifier_container,
@@ -34,6 +35,7 @@ use std::{thread, time};
3435
pub mod modes {
3536
pub const BENCHMARK: &str = "benchmark";
3637
pub const VERIFY: &str = "verify";
38+
pub const CICD: &str = "cicd";
3739
pub const DEBUG: &str = "debug";
3840
}
3941

@@ -68,7 +70,7 @@ pub struct Benchmarker<'a> {
6870
}
6971

7072
impl<'a> Benchmarker<'a> {
71-
pub fn new(docker_config: DockerConfig<'a>, projects: Vec<Project>) -> Self {
73+
pub fn new(docker_config: DockerConfig<'a>, projects: Vec<Project>, mode: &str) -> Self {
7274
let application_container_id = Arc::new(Mutex::new(DockerContainerIdFuture::new(
7375
&docker_config.server_docker_host,
7476
)));
@@ -92,37 +94,39 @@ impl<'a> Benchmarker<'a> {
9294
ctrlc_received: Arc::new(AtomicBool::new(false)),
9395
};
9496

95-
let use_unix_socket = benchmarker.docker_config.use_unix_socket;
96-
let application_container_id = Arc::clone(&benchmarker.application_container_id);
97-
let database_container_id = Arc::clone(&benchmarker.database_container_id);
98-
let verifier_container_id = Arc::clone(&benchmarker.verifier_container_id);
99-
let benchmarker_container_id = Arc::clone(&benchmarker.benchmarker_container_id);
100-
let ctrlc_received = Arc::clone(&benchmarker.ctrlc_received);
101-
ctrlc::set_handler(move || {
102-
let logger = Logger::default();
103-
logger.log("Shutting down (may take a moment)").unwrap();
104-
if ctrlc_received.load(Ordering::Acquire) {
105-
logger
106-
.log("Exiting immediately (there may still be running containers to stop)")
107-
.unwrap();
108-
std::process::exit(0);
109-
} else {
110-
let application_container_id = Arc::clone(&application_container_id);
111-
let database_container_id = Arc::clone(&database_container_id);
112-
let verifier_container_id = Arc::clone(&verifier_container_id);
113-
let benchmarker_container_id = Arc::clone(&benchmarker_container_id);
114-
let ctrlc_received = Arc::clone(&ctrlc_received);
115-
thread::spawn(move || {
116-
ctrlc_received.store(true, Ordering::Release);
117-
stop_docker_container_future(use_unix_socket, &verifier_container_id);
118-
stop_docker_container_future(use_unix_socket, &benchmarker_container_id);
119-
stop_docker_container_future(use_unix_socket, &application_container_id);
120-
stop_docker_container_future(use_unix_socket, &database_container_id);
97+
if mode != CICD {
98+
let use_unix_socket = benchmarker.docker_config.use_unix_socket;
99+
let application_container_id = Arc::clone(&benchmarker.application_container_id);
100+
let database_container_id = Arc::clone(&benchmarker.database_container_id);
101+
let verifier_container_id = Arc::clone(&benchmarker.verifier_container_id);
102+
let benchmarker_container_id = Arc::clone(&benchmarker.benchmarker_container_id);
103+
let ctrlc_received = Arc::clone(&benchmarker.ctrlc_received);
104+
ctrlc::set_handler(move || {
105+
let logger = Logger::default();
106+
logger.log("Shutting down (may take a moment)").unwrap();
107+
if ctrlc_received.load(Ordering::Acquire) {
108+
logger
109+
.log("Exiting immediately (there may still be running containers to stop)")
110+
.unwrap();
121111
std::process::exit(0);
122-
});
123-
}
124-
})
125-
.unwrap();
112+
} else {
113+
let application_container_id = Arc::clone(&application_container_id);
114+
let database_container_id = Arc::clone(&database_container_id);
115+
let verifier_container_id = Arc::clone(&verifier_container_id);
116+
let benchmarker_container_id = Arc::clone(&benchmarker_container_id);
117+
let ctrlc_received = Arc::clone(&ctrlc_received);
118+
thread::spawn(move || {
119+
ctrlc_received.store(true, Ordering::Release);
120+
stop_docker_container_future(use_unix_socket, &verifier_container_id);
121+
stop_docker_container_future(use_unix_socket, &benchmarker_container_id);
122+
stop_docker_container_future(use_unix_socket, &application_container_id);
123+
stop_docker_container_future(use_unix_socket, &database_container_id);
124+
std::process::exit(0);
125+
});
126+
}
127+
})
128+
.unwrap();
129+
}
126130

127131
benchmarker
128132
}
@@ -774,30 +778,24 @@ impl<'a> Benchmarker<'a> {
774778
}
775779
}
776780

777-
match self.docker_config.server_host {
778-
"tfb-server" => easy.url(&format!("http://localhost:{}{}", host_port, endpoint))?,
779-
_ => easy.url(&format!(
781+
let url = match self.docker_config.server_host {
782+
"tfb-server" => format!("http://localhost:{}{}", host_port, endpoint),
783+
_ => format!(
780784
"http://{}:{}{}",
781785
&self.docker_config.server_host, host_port, endpoint
782-
))?,
786+
),
783787
};
788+
easy.url(&url)?;
784789
easy.timeout(time::Duration::from_secs(1))?;
785790
let _ = easy.perform();
786791

787-
match easy.response_code() {
788-
Ok(code) => {
789-
if code > 0 {
790-
return Ok(());
791-
} else {
792-
slept_for += 1;
793-
thread::sleep(Duration::from_secs(1));
794-
}
795-
}
796-
_ => {
797-
slept_for += 1;
798-
thread::sleep(Duration::from_secs(1));
792+
if let Ok(code) = easy.response_code() {
793+
if code > 0 {
794+
return Ok(());
799795
}
800796
}
797+
slept_for += 1;
798+
thread::sleep(Duration::from_secs(1));
801799
}
802800
}
803801
}

src/cli.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ pub fn run() -> ToolsetResult<()> {
3434
} else if let Some(mode) = matches.value_of(options::args::MODE) {
3535
let docker_config = DockerConfig::new(&matches);
3636
let projects = metadata::list_projects_to_run(&matches);
37-
let mut benchmarker = Benchmarker::new(docker_config, projects);
37+
let mut benchmarker = Benchmarker::new(docker_config, projects, mode);
3838
match mode {
3939
modes::BENCHMARK => benchmarker.benchmark(),
40-
modes::VERIFY => benchmarker.verify(),
40+
modes::VERIFY | modes::CICD => benchmarker.verify(),
4141
modes::DEBUG => benchmarker.debug(),
4242
_ => Err(UnknownBenchmarkerModeError(mode.to_string())),
4343
}

src/docker/container.rs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::docker::{
1212
};
1313
use crate::error::ToolsetError::{
1414
ContainerPortMappingInspectionError, ExposePortError, FailedBenchmarkCommandRetrievalError,
15+
VerificationFailedException,
1516
};
1617
use crate::error::ToolsetResult;
1718
use crate::io::Logger;
@@ -29,6 +30,7 @@ use std::collections::HashMap;
2930
use std::sync::{Arc, Mutex};
3031
use std::task::Poll;
3132
use std::thread;
33+
use std::thread::sleep;
3234
use std::time::Duration;
3335

3436
/// Note: this function makes the assumption that the image is already
@@ -367,14 +369,33 @@ pub fn start_verification_container(
367369
docker_config.use_unix_socket,
368370
Simple::new(),
369371
)?;
370-
let verifier = attach_to_container(
371-
&container_id,
372-
&docker_config.client_docker_host,
373-
docker_config.use_unix_socket,
374-
Verifier::new(project, test, test_type, logger),
375-
)?;
376372

377-
Ok(verifier.verification)
373+
let mut running = true;
374+
let mut slept = 0;
375+
let max_sleep = 10;
376+
while running && slept < max_sleep {
377+
let inspection = inspect_container(
378+
&container_id,
379+
&docker_config.client_docker_host,
380+
docker_config.use_unix_socket,
381+
Simple::new(),
382+
)?;
383+
running = inspection.state.running;
384+
slept += 1;
385+
sleep(Duration::from_secs(1));
386+
}
387+
if !running {
388+
let verification = get_container_logs(
389+
&container_id,
390+
&docker_config.client_docker_host,
391+
docker_config.use_unix_socket,
392+
Verifier::new(project, test, test_type, logger),
393+
)?;
394+
395+
return Ok(verification.verification);
396+
}
397+
398+
Err(VerificationFailedException)
378399
}
379400

380401
/// Polls until `container` is ready with either some `container_id` or `None`,

src/docker/listener/verifier.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::io::Logger;
44
use curl::easy::{Handler, WriteError};
55
use serde::Deserialize;
66

7-
#[derive(Clone)]
7+
#[derive(Clone, Debug)]
88
pub struct Verifier {
99
pub verification: Verification,
1010
logger: Logger,

src/options.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ pub fn parse<'app>() -> App<'app> {
153153
.long("mode")
154154
.short('m')
155155
.takes_value(true)
156-
.possible_values(&[modes::BENCHMARK, modes::VERIFY, modes::DEBUG])
156+
.possible_values(&[modes::BENCHMARK, modes::VERIFY, modes::CICD, modes::DEBUG])
157157
)
158158
.arg(
159159
Arg::with_name(args::LIST_FRAMEWORKS)

0 commit comments

Comments
 (0)