Skip to content

Investigate persistent Windows test failure on test.wasi/test-return-on-exit #37374

Description

@Trott
  • Test: test.wasi/test-return-on-exit
  • Platform: win2012r2
  • Console Output:
00:30:50 not ok 778 wasi/test-return-on-exit # TODO : Fix flaky test
00:30:50   ---
00:30:50   duration_ms: 49.248
00:30:50   severity: flaky
00:30:50   exitcode: 134
00:30:50   stack: |-
00:30:50     (node:972) ExperimentalWarning: WASI is an experimental feature. This feature could change at any time
00:30:50     (Use `node --trace-warnings ...` to show where the warning was created)
00:30:50     
00:30:50     <--- Last few GCs --->
00:30:50     
00:30:50     
00:30:50     <--- JS stacktrace --->
00:30:50     
00:30:50     FATAL ERROR: Zone Allocation failed - process out of memory
00:30:50   ...
  • Build Links:

https://ci.nodejs.org/job/node-test-binary-windows-js-suites/8229/RUN_SUBSET=3,nodes=win2012r2-COMPILED_BY-vs2019-x86/console and pretty much any other recent Jenkins CI run as the failure is persistent.

Activity

  1. Trott commented on Feb 15, 2021

    @Trott
    MemberAuthor
  2. Trott commented on Feb 15, 2021

    @Trott
    MemberAuthor

    @nodejs/platform-windows

  3. added
    flaky-testIssues and PRs involving tests that fail intermittently in CI.
    wasiIssues and PRs related to the WebAssembly System Interface.
    windowsIssues and PRs related to the Windows platform.
    on Feb 15, 2021
  4. Trott commented on Feb 15, 2021

    @Trott
    MemberAuthor

    Since this apparently started happening with the V8 update to 8.8: @nodejs/v8

  5. added
    v8 engineIssues and PRs related to the V8 dependency.
    on Feb 15, 2021
  6. targos commented on Feb 15, 2021

    @targos
    Member

    Also @nodejs/wasi

  7. targos commented on Feb 22, 2021

    @targos
    Member

    There's probably a real bug somewhere, because this only happens on a 32 bit system.

  8. Trott commented on Feb 28, 2021

    @Trott
    MemberAuthor

    There's probably a real bug somewhere, because this only happens on a 32 bit system.

    Any thoughts on how we can make some progress on this?

  9. Trott commented on Feb 28, 2021

    @Trott
    MemberAuthor

    Refs: #36139 (comment)

    @gengjiawen Any ideas on what to do here?

  10. Trott commented on Feb 28, 2021

    @Trott
    MemberAuthor

    @nodejs/testing Any ideas for what we might be able to do in CI or elsewhere to figure this out?

  11. cjihrig commented on Feb 28, 2021

    @cjihrig
    Contributor

    I agree that this is probably a genuine bug since it only shows up on 32-bit Windows, and coincided with the V8 8.8 update (which had wasm related changes). The returnOnExit feature also relies on somewhat corner case behavior - monkey patching the WASI import to throw a JavaScript exception that WebAssembly can't catch.

    Regarding the test - as a last resort, we could skip it on Windows. It looks like there are two test cases in test/wasi/test-return-on-exit.js. Can we identify which of them is causing the crash, or if splitting them into separate test files somehow mitigates the problem?

  12. targos commented on Mar 1, 2021

    @targos
    Member
  13. cjihrig commented on Mar 1, 2021

    @cjihrig
    Contributor

    I re-ran the Windows CI a couple times as well. All failures were in test-return-on-exit-1, which contains the following code:

    // Flags: --experimental-wasi-unstable-preview1
    'use strict';
    const common = require('../common');
    const assert = require('assert');
    const fs = require('fs');
    const path = require('path');
    const { WASI } = require('wasi');
    const wasmDir = path.join(__dirname, 'wasm');
    const modulePath = path.join(wasmDir, 'exitcode.wasm');
    const buffer = fs.readFileSync(modulePath);
    
    (async () => {
      // Verify that if a WASI application throws an exception, Node rethrows it
      // properly.
      const wasi = new WASI({ returnOnExit: true });
      wasi.wasiImport.proc_exit = () => { throw new Error('test error'); };
      const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
      const { instance } = await WebAssembly.instantiate(buffer, importObject);
    
      assert.throws(() => {
        wasi.start(instance);
      }, /^Error: test error$/);
    })().then(common.mustCall());

    The main difference here is that wasi.wasiImport.proc_exit() is monkey-patched a second time here to throw an Error object, rather than throwing a Symbol as returnOnExit would normally.

  14. cjihrig commented on Mar 1, 2021

    @cjihrig
    Contributor

    I noticed another small difference that shouldn't have any impact. In the flaky test, the proc_exit() function is not bound to the WASI import. I ran cjihrig@32cb5b7 through the CI a few times, and haven't seen this test fail. Maybe I'm doing something wrong? If that does fix the flakiness, this seems like a probable bug in V8.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    flaky-testIssues and PRs involving tests that fail intermittently in CI.v8 engineIssues and PRs related to the V8 dependency.wasiIssues and PRs related to the WebAssembly System Interface.windowsIssues and PRs related to the Windows platform.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions