Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RangeError: Maximum call stack size exceeded #1034

Closed
oleksiyk opened this issue Mar 4, 2016 · 6 comments
Closed

RangeError: Maximum call stack size exceeded #1034

oleksiyk opened this issue Mar 4, 2016 · 6 comments

Comments

@oleksiyk
Copy link

oleksiyk commented Mar 4, 2016

  • bluebird 3.3.3
  • node.js 4.3.1
  • OSX

Can someone please help me debug the call stack overflow problem:

repl/node_modules/bluebird/js/release/util.js:257
        return function(value) {
                       ^

RangeError: Maximum call stack size exceeded
    at Object.ensureErrorObject (repl/node_modules/bluebird/js/release/util.js:257:24)
    at Promise._rejectCallback (repl/node_modules/bluebird/js/release/promise.js:458:22)
    at Promise._settlePromiseFromHandler (repl/node_modules/bluebird/js/release/promise.js:512:17)
    at Promise._settlePromise (repl/node_modules/bluebird/js/release/promise.js:560:18)
    at Promise._settlePromise0 (repl/node_modules/bluebird/js/release/promise.js:605:10)
    at Promise._settlePromises (repl/node_modules/bluebird/js/release/promise.js:684:18)
    at Promise._fulfill (repl/node_modules/bluebird/js/release/promise.js:629:18)
    at Promise._settlePromise (repl/node_modules/bluebird/js/release/promise.js:573:21)
    at Promise._settlePromise0 (repl/node_modules/bluebird/js/release/promise.js:605:10)
    at Promise._settlePromises (repl/node_modules/bluebird/js/release/promise.js:684:18)
    at Promise._fulfill (repl/node_modules/bluebird/js/release/promise.js:629:18)
    at Promise._resolveCallback (repl/node_modules/bluebird/js/release/promise.js:424:57)
    at Promise._settlePromiseFromHandler (repl/node_modules/bluebird/js/release/promise.js:515:17)
    at Promise._settlePromise (repl/node_modules/bluebird/js/release/promise.js:560:18)
    at Promise._settlePromise0 (repl/node_modules/bluebird/js/release/promise.js:605:10)
    at Promise._settlePromises (repl/node_modules/bluebird/js/release/promise.js:684:18)
    at Promise._fulfill (repl/node_modules/bluebird/js/release/promise.js:629:18)
    at Promise._settlePromise (repl/node_modules/bluebird/js/release/promise.js:573:21)
    at Promise._settlePromise0 (repl/node_modules/bluebird/js/release/promise.js:605:10)
    at Promise._settlePromises (repl/node_modules/bluebird/js/release/promise.js:684:18)
    at Promise._fulfill (repl/node_modules/bluebird/js/release/promise.js:629:18)
    at Promise._resolveCallback (repl/node_modules/bluebird/js/release/promise.js:424:57)
    at Promise._settlePromiseFromHandler (repl/node_modules/bluebird/js/release/promise.js:515:17)
    at Promise._settlePromise (repl/node_modules/bluebird/js/release/promise.js:560:18)
    at Promise._settlePromise0 (repl/node_modules/bluebird/js/release/promise.js:605:10)
    at Promise._settlePromises (repl/node_modules/bluebird/js/release/promise.js:684:18)
    at Promise._fulfill (repl/node_modules/bluebird/js/release/promise.js:629:18)
    at Promise._settlePromise (repl/node_modules/bluebird/js/release/promise.js:573:21)
    at Promise._settlePromise0 (repl/node_modules/bluebird/js/release/promise.js:605:10)
    at Promise._settlePromises (repl/node_modules/bluebird/js/release/promise.js:684:18)
    at Promise._fulfill (repl/node_modules/bluebird/js/release/promise.js:629:18)
    at Promise._resolveCallback (repl/node_modules/bluebird/js/release/promise.js:424:57)
    at Promise._settlePromiseFromHandler (repl/node_modules/bluebird/js/release/promise.js:515:17)
    at Promise._settlePromise (repl/node_modules/bluebird/js/release/promise.js:560:18)

The code that triggers it basically is a recursive async loop like this:

function f(){
  return Promise.delay(1000).then(f);
}

I can't replicate it with any simplified code but most of the time it happens when I hibernate the laptop while the program is running, once the lid is open that error is triggered. Few times it was triggered when I stopped the application with SIGINT.

What can I do to debug the problem further?

@petkaantonov
Copy link
Owner

setTimeout is assumed to be called asynchronously and it's being called synchronously. This seems to be a bug in node?

@oleksiyk
Copy link
Author

oleksiyk commented Mar 5, 2016

Can this be related: nodejs/node-v0.x-archive#25763 ?

@oleksiyk
Copy link
Author

oleksiyk commented Mar 5, 2016

I can't replicate it if I add some randomness to timeout value:

updated: unfortunately thats not the case, it probably just makes it harder to replicate

@oleksiyk
Copy link
Author

p.s.

It is broken in Node 0.10, 4.3 and 5.7. The code like this:

function f(){
  return Promise.delay(1000).then(f);
}

will eventually fail with either call stack size exceeded or memory allocation failed.

I ended up breaking the loop (which is definitely not as convenient):

function f(){
    fTimeout = setTimeout(function(){
        fPromise = f();
    }, 1000);
}

fTimeout = null;
fPromise = f();

@benjamingr
Copy link
Collaborator

Wait, you can reproduce this in Node? How?

@oleksiyk
Copy link
Author

I don't have any simplified code that reproduces this unfortunately.

The library where this issue happened is no-kafka: oleksiyk/kafka#33

And this small change "fixed" the problem for me: oleksiyk/kafka@f597761

I can reproduce this issue in some circumstances so if anyone can give me hints how to add some debugging I will do that. Unless this issue is considered as closed of course.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants