code0100fun
code0100fun

Reputation: 180

Raspberry Pi running Meteor bundle throws call stack exception

I've installed Node.js on a Raspberry Pi and I'm attempting to run the Meteor.js leaderboard example on it. I've bundled it and copied it to the Pi. I've set my MONGO_URL and npm installed Fiber (after some trouble). When I try to run:

$ node main.js

I get a Maximum call stack size exceeded exception.

  /home/pi/bundle/server/server.js:143
  }).run();
  ^
  RangeError: Maximum call stack size exceeded

I ran the command with --trace and got this:

  /home/pi/bundle/server/server.js:143
  1: GetLineNumber+56(this=0x4e92928d <JS Object>, 0x26693f79 <JSMessageObject>) {
  2:  ScriptLocationFromPosition+64(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 0x4e9080a1 <true>) {
  3:   ScriptLineFromPosition+60(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636) {
  4:    ScriptLineCount+40(this=0x26693f25 <a Script value = 0x4e953839 <Script>>) {
  4:    } -> 151
  4:    SUB+48(this=151, 1) {
  4:    } -> 150
  4:    ADD+52(this=0, 150) {
  4:    } -> 150
  4:    SAR+48(this=150, 1) {
  4:    } -> 75
  4:    ADD+52(this=75, 1) {
  4:    } -> 76
  4:    SUB+48(this=146, 1) {
  4:    } -> 145
  4:    SUB+48(this=146, 1) {
  4:    } -> 145
  3:   } -> 142
  3:   SUB+48(this=142, 1) {
  3:   } -> 141
  3:   ADD+52(this=4630, 1) {
  3:   } -> 4631
  3:   SUB+48(this=4642, 1) {
  3:   } -> 4641
  3:   charAt+48(this=0x3735a0cd <Very long string[4703]>, 4641) {
  3:   } -> 0x37324625 <String[1]: ;>
  3:   SUB+48(this=4636, 4631) {
  3:   } -> 5
  3:   ADD+52(this=142, 0) {
  3:   } -> 142
  3:   new SourceLocation+40(this=0x26694b99 <a SourceLocation>, 0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 142, 5, 4631, 4642) {
  3:   } -> 0x4e908091 <undefined>
  2:  } -> 0x26694b99 <a SourceLocation>
  2:  ADD+52(this=142, 1) {
  2:  } -> 143
  1: } -> 143
  /home/pi/bundle/server/server.js:143
  1: GetSourceLine+56(this=0x4e92928d <JS Object>, 0x26693f79 <JSMessageObject>) {
  2:  ScriptLocationFromPosition+64(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 0x4e9080a1 <true>) {
  3:   ScriptLineFromPosition+60(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636) {
  4:    ScriptLineCount+40(this=0x26693f25 <a Script value = 0x4e953839 <Script>>) {
  4:    } -> 151
  3:   } -> 142
  3:   charAt+48(this=0x3735a0cd <Very long string[4703]>, 4641) {
  3:   } -> 0x37324625 <String[1]: ;>
  3:   new SourceLocation+40(this=0x26694ce5 <a SourceLocation>, 0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 142, 5, 4631, 4642) {
  3:   } -> 0x4e908091 <undefined>
  2:  } -> 0x26694ce5 <a SourceLocation>
  2:  SourceLocationRestrict+60(this=0x26694ce5 <a SourceLocation>, 0x4e908091 <undefined>, 0x4e908091 <undefined>) {
  3:   SUB+48(this=78, 10) {
  3:   } -> 68
  3:   SUB+48(this=4642, 4631) {
  3:   } -> 11
  2:  } -> 0x4e908091 <undefined>
  2:  SourceLocationSourceText+40(this=0x26694ce5 <a SourceLocation>) {
  3:   substring+64(this=0x3735a0cd <Very long string[4703]>, 4631, 4642) {
  3:   } -> 0x26694d29 <String[11]:   }).run();>
  2:  } -> 0x26694d29 <String[11]:   }).run();>
  1: } -> 0x26694d29 <String[11]:   }).run();>
 }).run();
  1: GetPositionInLine+56(this=0x4e92928d <JS Object>, 0x26693f79 <JSMessageObject>) {
  2:  ScriptLocationFromPosition+64(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 0x4e9080b1 <false>) {
  3:   ScriptLineFromPosition+60(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636) {
  4:    ScriptLineCount+40(this=0x26693f25 <a Script value = 0x4e953839 <Script>>) {
  4:    } -> 151
  3:   } -> 142
  3:   charAt+48(this=0x3735a0cd <Very long string[4703]>, 4641) {
  3:   } -> 0x37324625 <String[1]: ;>
  3:   new SourceLocation+40(this=0x26694d71 <a SourceLocation>, 0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 142, 5, 4631, 4642) {
  3:   } -> 0x4e908091 <undefined>
  2:  } -> 0x26694d71 <a SourceLocation>
  2:  SourceLocationRestrict+60(this=0x26694d71 <a SourceLocation>, 0x4e908091 <undefined>, 0x4e908091 <undefined>) {
  2:  } -> 0x4e908091 <undefined>
  2:  SUB+48(this=4636, 4631) {
  2:  } -> 5
  1: } -> 5
  1: GetPositionInLine+56(this=0x4e92928d <JS Object>, 0x26693f79 <JSMessageObject>) {
  2:  ScriptLocationFromPosition+64(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 0x4e9080b1 <false>) {
  3:   ScriptLineFromPosition+60(this=0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636) {
  4:    ScriptLineCount+40(this=0x26693f25 <a Script value = 0x4e953839 <Script>>) {
  4:    } -> 151
  3:   } -> 142
  3:   charAt+48(this=0x3735a0cd <Very long string[4703]>, 4641) {
  3:   } -> 0x37324625 <String[1]: ;>
  3:   new SourceLocation+40(this=0x26694e7d <a SourceLocation>, 0x26693f25 <a Script value = 0x4e953839 <Script>>, 4636, 142, 5, 4631, 4642) {
  3:   } -> 0x4e908091 <undefined>
  2:  } -> 0x26694e7d <a SourceLocation>
  2:  SourceLocationRestrict+60(this=0x26694e7d <a SourceLocation>, 0x4e908091 <undefined>, 0x4e908091 <undefined>) {
  2:  } -> 0x4e908091 <undefined>
  1: } -> 5
  ^
  1: ToString+40(this=0x4e92928d <JS Object>, 0x4e908091 <undefined>) {
  1: } -> 0x373080bd <String[9]: undefined>
  1: getter+40(this=0x26693e85 <a RangeError>) {
  2:  +40(this=0x4e908091 <undefined>, 0x4e96824d <a RangeError>) {
  3:   FormatMessage+72(this=0x4e908091 <undefined>, 0x26694ed5 <JSMessageObject>) {
  4:    ADD+52(this=0, 1) {
  4:    } -> 1
  4:    ADD+52(this=1, 0) {
  4:    } -> 1
  4:    ADD+52(this=0, 2) {
  4:    } -> 2
  4:    FormatString+64(this=0x4e908091 <undefined>, 0x2669611d <JS array[1]>, 0x26694ed5 <JSMessageObject>) {
  5:     ADD+52(this=0x373082e5 <String[0]: >, 0x59c1f9cd <String[32]: Maximum call stack size exceeded>) {
  5:     } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded>
  5:     ADD+52(this=1, 0) {
  5:     } -> 1
  4:    } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded>
  3:   } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded>
  2:  } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded>
  1: } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded>
  RangeError:    1: getter+40(this=0x26693e85 <a RangeError>) {
  1: } -> 0x59c1f9cd <String[32]: Maximum call stack size exceeded>
  Maximum call stack size exceeded

The last place I can track this problem to is in the file:

app/packages/mongo-livedata/mongo_driver.js

at around line 10:

var MongoDB = __meteor_bootstrap__.require('mongodb');

I have the latest npm installed (1.1.50) and have npm installed mongodb globally. I am pointing to a hosted mongodb at mongolab.com. I've created a simple test to connect and insert a few records. It uses the exact same url that I'm trying to use for Meteor and it works as expected:

var connect = require('mongodb').connect;
var url = 'mongodb://<user>:<password>@<cloud_id>.mongolab.com:<port>/<database>';
connect(url, function(err, db) {
    db.collection('test', function(err, collection) {
       // Insert 3 records
        for(var i = 0; i < 3; i++) {
          collection.insert({'a':i});
        }
    });
});

I don't really understand the trace message but it seems like FormatString call is what triggers the exception. Any suggestions?

Update:

I've debugged this a little more and isolated the problem to the loading of a specific mongodb module shown here as filename. From stepping through it for a while, it seems like the module is recursively including itself.

break in module.js:311
Watchers:
  0: path = ...
  1: parent = ...
  2: filename = "/home/pi/bundle/server/node_modules/mongodb/lib/mongodb/connection/repl_set.js"
 
 308   var hadException = true;
 309 
 310   try {
 311     module.load(filename);
 312     hadException = false;
 313   } finally {
 314     if (hadException) {
 315       delete Module._cache[filename];
 316     }
 317   }
debug> 
< RangeError: Maximum call stack size exceeded
program terminated

Upvotes: 1

Views: 1051

Answers (3)

Tom Freudenberg
Tom Freudenberg

Reputation: 1367

not sure if you now our meteor universal fork at

https://github.com/4commerce-technologies-AG/meteor

but we covered a number of issues there. Also some errors about fibers and mongo. Please take a look at the (closed) issues and check out the pre-built binaries on bintray at

https://bintray.com/4commerce-technologies-ag/meteor-universal/arm-dev-bundles/1.3.3.1/view#files/arm_dev_bundles

You may also use the node and the mongo tgz just to bring up the services.

Hope that helps Tom

Upvotes: 0

bmorin
bmorin

Reputation: 645

Indeed, as pointed out by Wilfred Knievel, MongoDB currently does not support the ARM architecture. I have made available the (unofficial) binaries of MongoDB so that you do not need to recompile them (as it is quite a long/tricky procedure). These binaries, together with a sample program (in C) are available here

Upvotes: 0

Wilfred Knievel
Wilfred Knievel

Reputation: 3245

Unfortunately I don't think that MongoDB currently supports the ARM architecture see https://jira.mongodb.org/browse/SERVER-1811

However you could run Mongo on another machine and have the drivers connect to that or if you really wanted it to run on your raspberry PI you could try an unofficial build

Upvotes: 3

Related Questions