Skip to content

Commit

Permalink
test: specialize OOM check for AIX
Browse files Browse the repository at this point in the history
Assumption that if memory can be malloc()ed it can be used is not true
on AIX. Later access of the allocated pages can trigger SIGKILL if there
are insufficient VM pages.

Use psdanger() to better estimate available memory.

Fixes: nodejs/build#1849

More info:
- https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/generalprogramming/sys_mem_alloc.html
- https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/p_bostechref/psdanger.html

Related to:
- nodejs/build#1820 (comment)
- #28469
- #28516

PR-URL: #28857
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Reviewed-By: Beth Griggs <Bethany.Griggs@uk.ibm.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
  • Loading branch information
sam-github authored and targos committed Aug 2, 2019
1 parent 82f263d commit f6051f9
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 15 deletions.
14 changes: 0 additions & 14 deletions test/addons/addon.status
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,3 @@ prefix addons
[true] # This section applies to all platforms

[$system==aix]
# https://github.com/nodejs/build/issues/1820#issuecomment-505998851
# https://github.com/nodejs/node/pull/28469
# https://github.com/nodejs/node/pull/28516
stringbytes-external-exceed-max/test-stringbytes-external-exceed-max.js: SKIP

# https://github.com/nodejs/node/pull/28516
stringbytes-external-exceed-max/test-stringbytes-external-at-max: SKIP
stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-ascii: SKIP
stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-base64: SKIP
stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-binary: SKIP
stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-hex: SKIP
stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-1-utf8: SKIP
stringbytes-external-exceed-max/test-stringbytes-external-exceed-max-by-2: SKIP
stringbytes-external-exceed-max/test-stringbytes-external-exceed-max: SKIP
32 changes: 31 additions & 1 deletion test/addons/stringbytes-external-exceed-max/binding.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,42 @@
#include <node.h>
#include <v8.h>

#ifdef _AIX
// AIX allows over-allocation, and will SIGKILL when the allocated pages are
// used if there is not enough VM. Check for available space until
// out-of-memory. Don't allow more then some (large) proportion of it to be
// used for the test strings, so Node & V8 have some space for allocations.
#include <signal.h>
#include <sys/vminfo.h>

static void* Allowed(size_t size) {
blkcnt_t allowedBlocks = psdanger(SIGKILL);

if (allowedBlocks < 1) {
// Already OOM
return nullptr;
}
const size_t BYTES_PER_BLOCK = 512;
size_t allowed = (allowedBlocks * BYTES_PER_BLOCK * 4) / 5;
if (size < allowed) {
return malloc(size);
}
return nullptr;
}
#else
// Other systems also allow over-allocation, but this malloc-and-free approach
// seems to be working for them.
static void* Allowed(size_t size) {
return malloc(size);
}
#endif // _AIX

void EnsureAllocation(const v8::FunctionCallbackInfo<v8::Value> &args) {
v8::Isolate* isolate = args.GetIsolate();
uintptr_t size = args[0].As<v8::Integer>()->Value();
v8::Local<v8::Boolean> success;

void* buffer = malloc(size);
void* buffer = Allowed(size);
if (buffer) {
success = v8::Boolean::New(isolate, true);
free(buffer);
Expand Down

0 comments on commit f6051f9

Please sign in to comment.