Repository: nodejs/node
Pull request: test: disable flaky WPT Blob test on AIX

The test Blob-array-buffer.any.js can be flaky on AIX due to a recognized race condition in v8.

The failed assert is in deps/v8/src/base/platform/platform-aix.cc on line 199, preceeded by the comment:

https://github.com/nodejs/node/blob/5b6091ce31068e1c86f863273cdd397ecb47e3b7/deps/v8/src/base/platform/platform-aix.cc#L194-L198

Disabling the test on AIX until the underlying issue can be resolved (if it can be resolved at all) is really the only option currently.

Reliability Report: https://github.com/nodejs/reliability/blob/main/reports/2026-03-28.md
Signed-off-by: James M Snell <jasnell@gmail.com>
Assisted-by: Opencode/Opus 4.6

Changed files:
filename: test/wpt/status/FileAPI/blob.cjs
patch: @@ -0,0 +1,59 @@
+'use strict';
+
+const os = require('node:os');
+
+// On AIX, V8's OS::DecommitPages() has an inherent race condition caused by
+// AIX's non-POSIX MAP_FIXED behavior. The implementation must munmap() then
+// mmap(), and another thread can steal the address range in between. The
+// Blob.arrayBuffer() tests trigger this by creating enough GC pressure
+// (especially the concurrent reads test) to hit the race window.
+// See deps/v8/src/base/platform/platform-aix.cc, lines 168-203.
+const isAIX = os.type() === 'AIX';
+
+const conditionalSkips = {};
+
+if (isAIX) {
+  conditionalSkips['Blob-array-buffer.any.js'] = {
+    skip: 'V8 DecommitPages race condition on AIX (munmap/mmap non-atomic)',
+  };
+}
+
+module.exports = {
+  ...conditionalSkips,
+  'Blob-constructor-dom.window.js': {
+    skip: 'Depends on DOM API',
+  },
+  'Blob-constructor.any.js': {
+    fail: {
+      expected: [
+        'blobParts not an object: boolean with Boolean.prototype[Symbol.iterator]',
+        'blobParts not an object: number with Number.prototype[Symbol.iterator]',
+        'blobParts not an object: BigInt with BigInt.prototype[Symbol.iterator]',
+        'blobParts not an object: Symbol with Symbol.prototype[Symbol.iterator]',
+        'Getters and value conversions should happen in order until an exception is thrown.',
+        'Arguments should be evaluated from left to right.',
+      ],
+      flaky: [
+        'Passing typed arrays as elements of the blobParts array should work.',
+        'Passing a Float16Array as element of the blobParts array should work.',
+        'Passing a Float64Array as element of the blobParts array should work.',
+        'Passing BigInt typed arrays as elements of the blobParts array should work.',
+      ],
+    },
+  },
+  'Blob-in-worker.worker.js': {
+    skip: 'Depends on Web Workers API',
+  },
+  'Blob-slice.any.js': {
+    fail: {
+      expected: [
+        'Slicing test: slice (1,1).',
+        'Slicing test: slice (1,3).',
+        'Slicing test: slice (1,5).',
+        'Slicing test: slice (1,7).',
+        'Slicing test: slice (1,8).',
+        'Slicing test: slice (1,9).',
+      ],
+    },
+  },
+};

filename: test/wpt/status/FileAPI/blob.json
patch: @@ -1,38 +0,0 @@
-{
-  "Blob-constructor-dom.window.js": {
-    "skip": "Depends on DOM API"
-  },
-  "Blob-constructor.any.js": {
-    "fail": {
-      "expected": [
-        "blobParts not an object: boolean with Boolean.prototype[Symbol.iterator]",
-        "blobParts not an object: number with Number.prototype[Symbol.iterator]",
-        "blobParts not an object: BigInt with BigInt.prototype[Symbol.iterator]",
-        "blobParts not an object: Symbol with Symbol.prototype[Symbol.iterator]",
-        "Getters and value conversions should happen in order until an exception is thrown.",
-        "Arguments should be evaluated from left to right."
-      ],
-      "flaky": [
-        "Passing typed arrays as elements of the blobParts array should work.",
-        "Passing a Float16Array as element of the blobParts array should work.",
-        "Passing a Float64Array as element of the blobParts array should work.",
-        "Passing BigInt typed arrays as elements of the blobParts array should work."
-      ]
-    }
-  },
-  "Blob-in-worker.worker.js": {
-    "skip": "Depends on Web Workers API"
-  },
-  "Blob-slice.any.js": {
-    "fail": {
-      "expected": [
-        "Slicing test: slice (1,1).",
-        "Slicing test: slice (1,3).",
-        "Slicing test: slice (1,5).",
-        "Slicing test: slice (1,7).",
-        "Slicing test: slice (1,8).",
-        "Slicing test: slice (1,9)."
-      ]
-    }
-  }
-}