Skip to content

Commit 79d7b40

Browse files
committed
finish graph for exec test
1 parent ee1297f commit 79d7b40

5 files changed

Lines changed: 149 additions & 101 deletions

File tree

src/judge/src/controller/task_loading.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,13 @@ fn interpolate_command(
8484
for (name, val) in &command.env {
8585
let name = interpolate_string(name, dict)?;
8686
let val = interpolate_string(val, dict)?;
87-
res.env.push(format!("{}={}", name, val));
87+
res.env.push((name, val));
8888
used_env_vars.insert(name);
8989
}
9090
res.cwd = interpolate_string(&command.cwd, dict)?;
9191
for (default_key, default_val) in &toolchain_spec.env {
9292
if !used_env_vars.contains(default_key) {
93-
res.env.push(format!("{}={}", default_key, default_val));
93+
res.env.push((default_key.clone(), default_val.clone()));
9494
}
9595
}
9696
Ok(res)

src/judge/src/invoker_set.rs

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@ use tracing::{debug, instrument};
1010
#[derive(Clone)]
1111
pub struct InvokerSet {
1212
/// Information abount spawned invokers
13-
managed: Arc<[Arc<WorkerInfo>]>,
14-
/// these field is used to signal that a worker is reclaimed
15-
worker_reclamation: Arc<event_listener::Event>,
13+
managed: Arc<[Arc<Invoker>]>,
14+
/// these field is used to signal that an invoker lock was released
15+
invoker_released: Arc<event_listener::Event>,
1616
}
1717

1818
pub struct InvokerSetBuilder {
1919
/// Path to invoker binary
2020
invoker_path: PathBuf,
21-
/// workers spawned so far
22-
managed: Vec<Arc<WorkerInfo>>,
21+
/// Managed invokers spawned so far
22+
managed: Vec<Arc<Invoker>>,
2323
}
2424

2525
impl InvokerSetBuilder {
2626
/// Starts new invoker process and adds it to this InvokerSet
2727
#[instrument(skip(self))]
28-
pub async fn add_managed_worker(&mut self) -> anyhow::Result<()> {
28+
pub async fn add_managed_invoker(&mut self) -> anyhow::Result<()> {
2929
let mut child = tokio::process::Command::new(&self.invoker_path)
3030
.arg("serve")
3131
.arg("--address=cli")
@@ -43,8 +43,8 @@ impl InvokerSetBuilder {
4343
req_rx,
4444
res_tx,
4545
));
46-
let info = WorkerInfo {
47-
state: Mutex::new(WorkerState::Idle),
46+
let info = Invoker {
47+
state: Mutex::new(InvokerState::Idle),
4848
send_request: req_tx,
4949
recv_response: res_rx,
5050
};
@@ -56,7 +56,7 @@ impl InvokerSetBuilder {
5656
pub fn build(self) -> InvokerSet {
5757
InvokerSet {
5858
managed: self.managed.into(),
59-
worker_reclamation: Arc::new(event_listener::Event::new()),
59+
invoker_released: Arc::new(event_listener::Event::new()),
6060
}
6161
}
6262
}
@@ -77,9 +77,9 @@ impl InvokerSet {
7777
loop {
7878
debug!(attempt_id, "scanning all workers");
7979
attempt_id += 1;
80-
let worker_reclaimed = self.worker_reclamation.listen();
81-
for worker in &*self.managed {
82-
if let Some(handle) = worker.try_lock(self.worker_reclamation.clone()) {
80+
let released = self.invoker_released.listen();
81+
for invoker in &*self.managed {
82+
if let Some(handle) = invoker.try_lock(self.invoker_released.clone()) {
8383
handle.send_request.send(req).await.expect("worker died");
8484
let resp = handle
8585
.recv_response
@@ -90,38 +90,36 @@ impl InvokerSet {
9090
}
9191
}
9292

93-
worker_reclaimed.await;
93+
released.await;
9494
}
9595
}
9696
}
9797

9898
#[derive(Eq, PartialEq)]
99-
enum WorkerState {
100-
/// Worker is ready for new tasks
99+
enum InvokerState {
100+
/// Ready for new tasks
101101
Idle,
102-
/// Worker is ready, but it is locked by a WorkerHandle
102+
/// Ready, but it is locked by a WorkerHandle
103103
Locked,
104-
/// Worker is juding run
105-
Judge,
106-
/// Worker has crashed
104+
/// Crashed
107105
Crash,
108106
}
109-
struct WorkerInfo {
107+
struct Invoker {
110108
// could be AtomicU8, but mutex is simpler
111-
state: Mutex<WorkerState>,
109+
state: Mutex<InvokerState>,
112110
// Danger: must not be used concurrently, otherwise
113111
// we can receive wrong response
114112
send_request: async_channel::Sender<hyper::Request<hyper::Body>>,
115113
recv_response: async_channel::Receiver<hyper::Response<hyper::Body>>,
116114
}
117-
struct LockedWorker {
115+
struct LockedInvoker {
118116
send_request: async_channel::Sender<hyper::Request<hyper::Body>>,
119117
recv_response: async_channel::Receiver<hyper::Response<hyper::Body>>,
120118
notify_on_drop: Arc<event_listener::Event>,
121-
worker: Arc<WorkerInfo>,
119+
raw: Arc<Invoker>,
122120
}
123121

124-
impl LockedWorker {
122+
impl LockedInvoker {
125123
async fn call(self, req: hyper::Request<hyper::Body>) -> hyper::Response<hyper::Body> {
126124
let wake = {
127125
let ev = self.notify_on_drop.clone();
@@ -147,29 +145,29 @@ impl LockedWorker {
147145
}
148146
}
149147

150-
impl Drop for LockedWorker {
148+
impl Drop for LockedInvoker {
151149
fn drop(&mut self) {
152-
// mark Worker as idle
153-
*self.worker.state.lock() = WorkerState::Idle;
150+
// mark invoker as idle
151+
*self.raw.state.lock() = InvokerState::Idle;
154152
// trigger event
155153
self.notify_on_drop.notify_additional(1);
156154
}
157155
}
158156

159-
impl WorkerInfo {
157+
impl Invoker {
160158
fn try_lock(
161159
self: &Arc<Self>,
162160
notify_on_drop: Arc<event_listener::Event>,
163-
) -> Option<LockedWorker> {
161+
) -> Option<LockedInvoker> {
164162
let mut lock = self.state.lock();
165-
if *lock != WorkerState::Idle {
163+
if *lock != InvokerState::Idle {
166164
return None;
167165
}
168-
*lock = WorkerState::Locked;
169-
Some(LockedWorker {
166+
*lock = InvokerState::Locked;
167+
Some(LockedInvoker {
170168
send_request: self.send_request.clone(),
171169
recv_response: self.recv_response.clone(),
172-
worker: self.clone(),
170+
raw: self.clone(),
173171
notify_on_drop,
174172
})
175173
}

src/judge/src/request_handler.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub type InvokerClient = rpc::Client<rpc::BoxEngine>;
2626
#[derive(Debug, Default)]
2727
pub(crate) struct Command {
2828
pub argv: Vec<String>,
29-
pub env: Vec<String>,
29+
pub env: Vec<(String, String)>,
3030
pub cwd: String,
3131
}
3232

@@ -58,11 +58,6 @@ impl LoweredJudgeRequest {
5858
pom::FileRefRoot::Root => Path::new("/").into(),
5959
};
6060

61-
debug!(
62-
"full checker path: {}",
63-
root.join(&short_path.path).to_str().unwrap()
64-
);
65-
6661
root.join(&short_path.path)
6762
}
6863

0 commit comments

Comments
 (0)