Skip to content

Commit 89b82d6

Browse files
authored
fix: backports (#521)
* chore: add old eszip migration test (#512) * chore(base): add a dependency * chore(base): add `.gitignore` * chore: add scripts * chore(ci): add a step that brings test eszip binaries * chore(base): update `.gitignore` * chore(base): add old eszip migration test * chore(base): add snapshots for old eszip migration tests * stamp(ci): change bucket name * stamp: update snapshots * stamp: polishing * fix(base): triggering `beforeunload` event may cause `Uncaught null` (#520) * fix(base): triggering `beforeunload` event may cause `Uncaught null` * chore: add an integration test
1 parent e588476 commit 89b82d6

9 files changed

+87
-6
lines changed

crates/base/src/runtime/mod.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,10 +1373,12 @@ where
13731373
if accumulated_cpu_time_ns >= threshold_ns {
13741374
beforeunload_cpu_threshold.store(None);
13751375

1376-
if let Err(err) = MaybeDenoRuntime::DenoRuntime(&mut this)
1377-
.dispatch_beforeunload_event(WillTerminateReason::CPU)
1378-
{
1379-
return Poll::Ready(Err(err));
1376+
if !state.is_terminated() {
1377+
if let Err(err) = MaybeDenoRuntime::DenoRuntime(&mut this)
1378+
.dispatch_beforeunload_event(WillTerminateReason::CPU)
1379+
{
1380+
return Poll::Ready(Err(err));
1381+
}
13801382
}
13811383
}
13821384
}
@@ -1397,7 +1399,7 @@ where
13971399
if total_malloced_bytes >= threshold_bytes {
13981400
beforeunload_mem_threshold.store(None);
13991401

1400-
if !mem_state.is_exceeded() {
1402+
if !state.is_terminated() && !mem_state.is_exceeded() {
14011403
if let Err(err) = MaybeDenoRuntime::DenoRuntime(&mut this)
14021404
.dispatch_beforeunload_event(WillTerminateReason::Memory)
14031405
{

crates/base/src/worker/supervisor/strategy_per_worker.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,13 +223,17 @@ pub async fn supervise(args: Arguments) -> (ShutdownReason, i64) {
223223
});
224224

225225
let terminate_fn = {
226+
let state = state.runtime.clone();
226227
let thread_safe_handle = thread_safe_handle.clone();
227228
move |should_terminate: bool| {
228229
let data_ptr_mut = Box::into_raw(Box::new(V8HandleTerminationData {
229230
should_terminate,
230231
isolate_memory_usage_tx: Some(isolate_memory_usage_tx),
231232
}));
232233

234+
if should_terminate {
235+
state.terminated.raise();
236+
}
233237
if !thread_safe_handle.request_interrupt(
234238
v8_handle_termination,
235239
data_ptr_mut as *mut std::ffi::c_void,
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { FFmpeg } from "npm:@ffmpeg.wasm/main";
2+
import {
3+
default as core,
4+
type FFmpegCoreConstructor,
5+
} from "npm:@ffmpeg.wasm/core-st";
6+
7+
const ff = await FFmpeg.create({
8+
core: core as FFmpegCoreConstructor,
9+
});
10+
11+
Deno.serve(async (_req) => {
12+
const resp = await fetch(
13+
"https://raw.githubusercontent.com/ffmpegwasm/testdata/master/Big_Buck_Bunny_180_10s.webm",
14+
);
15+
const buf = new Uint8Array(await resp.arrayBuffer());
16+
17+
ff.fs.writeFile("meow.webm", buf);
18+
19+
await ff.run("-i", "meow.webm", "meow.mp4");
20+
const data = ff.fs.readFile("meow.mp4");
21+
22+
return new Response(data, {
23+
headers: {
24+
"content-type": "video/mp4",
25+
},
26+
});
27+
});

crates/base/test_cases/main/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ Deno.serve((req: Request) => {
6262
const envVars = Object.keys(envVarsObj).map((k) => [k, envVarsObj[k]]);
6363
const context = {
6464
sourceMap: req.headers.get("x-context-source-map") == "true",
65+
useReadSyncFileAPI: req.headers.get("x-use-read-sync-file-api") == "true",
6566
};
6667

6768
return await EdgeRuntime.userWorkers.create({
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
migration is not supported for this version: 2.0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
migration is not supported for this version: 2.0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
migration is not supported for this version: 2.0

crates/base/tests/integration_tests.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ use deno_facade::EmitterFactory;
4343
use deno_facade::EszipPayloadKind;
4444
use deno_facade::Metadata;
4545
use ext_event_worker::events::LogLevel;
46+
use ext_event_worker::events::ShutdownReason;
4647
use ext_event_worker::events::WorkerEvents;
4748
use ext_runtime::SharedMetricSource;
4849
use ext_workers::context::MainWorkerRuntimeOpts;
@@ -2494,6 +2495,49 @@ async fn test_supabase_issue_29583() {
24942495
);
24952496
}
24962497

2498+
#[tokio::test]
2499+
#[serial]
2500+
async fn test_issue_func_205() {
2501+
let (tx, mut rx) = mpsc::unbounded_channel();
2502+
let tb = TestBedBuilder::new("./test_cases/main")
2503+
.with_per_worker_policy(None)
2504+
.with_worker_event_sender(Some(tx))
2505+
.with_server_flags(ServerFlags {
2506+
beforeunload_wall_clock_pct: Some(90),
2507+
beforeunload_cpu_pct: Some(90),
2508+
beforeunload_memory_pct: Some(90),
2509+
..Default::default()
2510+
})
2511+
.build()
2512+
.await;
2513+
2514+
let resp = tb
2515+
.request(|b| {
2516+
b.uri("/issue-func-205")
2517+
.header("x-cpu-time-soft-limit-ms", HeaderValue::from_static("500"))
2518+
.header("x-cpu-time-hard-limit-ms", HeaderValue::from_static("1000"))
2519+
.header("x-use-read-sync-file-api", HeaderValue::from_static("true"))
2520+
.body(Body::empty())
2521+
.context("can't make request")
2522+
})
2523+
.await
2524+
.unwrap();
2525+
2526+
assert_eq!(resp.status().as_u16(), StatusCode::INTERNAL_SERVER_ERROR);
2527+
2528+
tb.exit(Duration::from_secs(TESTBED_DEADLINE_SEC)).await;
2529+
2530+
while let Some(ev) = rx.recv().await {
2531+
let WorkerEvents::Shutdown(ev) = ev.event else {
2532+
continue;
2533+
};
2534+
assert_eq!(ev.reason, ShutdownReason::CPUTime);
2535+
return;
2536+
}
2537+
2538+
unreachable!("test failed");
2539+
}
2540+
24972541
#[tokio::test]
24982542
#[serial]
24992543
async fn test_should_render_detailed_failed_to_create_graph_error() {

ext/event_worker/events.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub struct WorkerMemoryUsed {
2121
pub mem_check_captured: MemCheckState,
2222
}
2323

24-
#[derive(Serialize, Deserialize, Debug)]
24+
#[derive(Serialize, Deserialize, Debug, PartialEq)]
2525
pub enum ShutdownReason {
2626
EventLoopCompleted,
2727
WallClockTime,

0 commit comments

Comments
 (0)