Skip to content

Commit

Permalink
Wasm-wc: Fix application restarts
Browse files Browse the repository at this point in the history
Liam reported a problem when trying to restart wasm-wasi-component based
applications using the /control/applications/APPLICATION_NAME/restart
endpoint.

The application would become unresponsive.

What was happening was the old application process(es) weren't
exit(3)ing and so while we were starting new application processes, the
old ones were still hanging around in a non-functioning state.

When we are terminating an application it must call exit(3).

So that's what we do. We use the return value of nxt_unit_run() as the
exit status.

Due to exit(3)ing we also need to now explicitly handle the return on
error case.

Reported-by: Liam Crilly <[email protected]>
Fixes: 20ada4b ("Wasm-wc: Core of initial Wasm component model language module support")
Closes: nginx#1179
Tested-by: Liam Crilly <[email protected]>
Tested-by: Danielle De Leo <[email protected]>
Co-developed-by: Dan Callahan <[email protected]>
Signed-off-by: Dan Callahan <[email protected]>
Signed-off-by: Andrew Clayton <[email protected]>
  • Loading branch information
ac000 committed Mar 14, 2024
1 parent a8cfea8 commit e75f8d5
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions src/wasm-wasi-component/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use http_body_util::combinators::BoxBody;
use http_body_util::{BodyExt, Full};
use std::ffi::{CStr, CString};
use std::mem::MaybeUninit;
use std::process::exit;
use std::ptr;
use std::sync::OnceLock;
use tokio::sync::mpsc;
Expand Down Expand Up @@ -101,7 +102,9 @@ unsafe extern "C" fn start(
task: *mut bindings::nxt_task_t,
data: *mut bindings::nxt_process_data_t,
) -> bindings::nxt_int_t {
handle_result(task, || {
let mut rc: i32 = 0;

let result = handle_result(task, || {
let config = GLOBAL_CONFIG.get().unwrap();
let state = GlobalState::new(&config)
.context("failed to create initial state")?;
Expand All @@ -123,11 +126,17 @@ unsafe extern "C" fn start(
bail!("nxt_unit_init() failed");
}

bindings::nxt_unit_run(unit_ctx);
rc = bindings::nxt_unit_run(unit_ctx);
bindings::nxt_unit_done(unit_ctx);

Ok(())
})
});

if result != bindings::NXT_OK as bindings::nxt_int_t {
return result;
}

exit(rc);
}

unsafe fn handle_result(
Expand Down

0 comments on commit e75f8d5

Please sign in to comment.