databases/mongodb fails to start, assertion failure in unit test
Wesley Shields
wxs at FreeBSD.org
Mon Jan 28 16:19:31 UTC 2013
On Sat, Jan 26, 2013 at 07:06:21AM -0800, Waitman Gobble wrote:
> Waitman Gobble <uzimac at da3m0n8t3r.com> wrote ..
> >
> > Hi,
> >
> > I've installed databases/mongodb and get an error when starting.
> >
> > # /usr/local/etc/rc.d/mongod start
> > Starting mongod.
> > forked process: 59576
> > all output going to: /var/db/mongodb/mongod.log
> > /usr/local/etc/rc.d/mongod: WARNING: failed to start mongod
> >
> > # cat /var/db/mongodb/mongod.log
> >
> > Fri Jan 25 00:30:57 Assertion failure l < bigl src/mongo/db/btree.cpp 1973
> > 0x5a503d 0x5eb41d 0x74dce9 0x547638 0x545ed9 0x542bc1
> > 0x5a503d <_ZN5mongo12verifyFailedEPKcS1_j+285> at /usr/local/bin/mongod
> > 0x5eb41d <_ZN5mongo10BTUnitTest3runEv+333> at /usr/local/bin/mongod
> > 0x74dce9 <_ZN5mongo11StartupTest8runTestsEv+57> at /usr/local/bin/mongod
> > 0x547638 <main+5992> at /usr/local/bin/mongod
> > 0x545ed9 <main+9> at /usr/local/bin/mongod
> > 0x542bc1 <_start+145> at /usr/local/bin/mongod
> > Fri Jan 25 00:30:57 Got signal: 6 (Abort trap: 6).
> >
> >
> >
> > # portversion -v mongodb
> > mongodb-2.2.0_1 = up-to-date with port
> >
> > # uname -a
> > FreeBSD kamira.waitman.net 9.1-STABLE FreeBSD 9.1-STABLE #0 r245772M: Tue Jan 22
> > 06:09:00 PST 2013 root at kamira.waitman.net:/usr/obj/usr/src/sys/BURPLEX amd64
> >
> >
> > I added a couple lines to print the values before the failure.
> >
> >
> > src/mongo/db/btree.h
> >
> > ..
> >
> > struct BTUnitTest : public StartupTest {
> > void run() {
> > DiskLoc big(0xf12312, 0x70001234);
> > DiskLoc56Bit bigl;
> > {
> > bigl = big;
> > verify( big == bigl );
> > DiskLoc e = bigl;
> > verify( big == e );
> > }
> > {
> > DiskLoc d;
> > verify( d.isNull() );
> > DiskLoc56Bit l;
> > l = d;
> > verify( l.isNull() );
> > d = l;
> > verify( d.isNull() );
> >
> > printf("bigl %s\n",bigl.toString().c_str());
> > printf("l %s\n",l.toString().c_str());
> >
> > verify( l < bigl );
> > }
> > }
> > } btunittest;
> > ..
> >
> >
> > output:
> >
> > bigl f12312:70001234
> > l null
> > Thu Jan 24 23:18:17 Assertion failure l < bigl src/mongo/db/btree.cpp 1978
> >
> >
> > looking at
> > src/mongo/db/diskloc.h
> >
> > bool isNull() const { return _a == -1; }
> > ..
> > int compare(const DiskLoc& b) const {
> > int x = _a - b._a;
> > if ( x )
> > return x;
> > return ofs - b.ofs;
> > }
> > bool operator<(const DiskLoc& b) const {
> > return compare(b) < 0;
> > }
> > ..
> > void Null() {
> > _a = -1;
> > ofs = 0; /* note NullOfs is different. todo clean up. see refs to
> > NullOfs in code - use is valid but outside DiskLoc context so confusing as-is.
> > */
> > }
> >
> >
> >
> > it seems that this should be working!
> >
> > test model:
> >
> > #include <stdio.h>
> >
> > int
> > compare (int a, int b)
> > {
> > int x = a - b;
> > if ( x )
> > return x;
> > return 555;
> > }
> >
> > bool
> > ncompare (int a, int b)
> > {
> > return compare(a,b) < 0;
> > }
> >
> > int
> > main (void)
> > {
> > int a, b;
> > a = -1;
> > b = 0xf12312;
> > int c = a - b;
> > printf("%d\n",c);
> > c = compare(a,b);
> > printf("%d\n",c);
> > bool d = ncompare(a,b);
> > printf("%d\n",d);
> > bool e = ncompare(b,a);
> > printf("%d\n",e);
> > return 0;
> > }
> >
> > # clang++ -o test test.cpp
> > # ./test
> > -15803155
> > -15803155
> > 1
> > 0
> >
> >
> > I'm missing something...
> >
> > Suggestions, tips, hints much appreciated.
> >
> > Thanks,
> >
> > --
> > Waitman Gobble
> > San Jose California USA
>
> Hi,
>
> I've tinkered around with this problem. Commenting out the 'verify( l
> < bigl );' line in src/mongo/db/btree.h solves the assertion failure
> problem, and mongodb starts and runs. However, after reviewing the
> code it seems this 'start' unit test is only actually testing if the
> thing can 'subtract integers.' I'm very puzzled as to why it is
> failing, it's bombing out when it does 'verify ((-1 - 0xf12312)<0)'.
> which seems trivial.
>
> The code that runs the unit test/StartupTest is simple, but i haven't
> yet found the 'verify' macro, at least i believe it's a macro.
>
> Anyhow, commenting out the test line gets mongodb running, but I'm
> wondering what other problems there could be. (?)
>
> I found that compiling with base gcc avoids the startup problem, so
> this indeed seems to be an issue related to building with clang. clang
> builds mongodb without error, however running the mongodb compiled
> with clang fails during 'startuptest'.
>
> IMHO It would be good to track down the problem, at least understand
> the cause, but at this moment it seems like compiling mongodb with gcc
> is the way to go.
>
> I've updated the port to use the latest release/ 2.2.2 version of
> mongodb, I'll submit a PR in a bit, (it does not appear to have been
> submitted already) maybe somebody wants to use it. (The startup
> assertion failure affects the existing port '2.2.0' as well as 2.2.2)
Please CC me on the PR as I would like to get that in the tree.
As for the clang problem, I think this might be something to take up
with the mongodb developers.
-- WXS
More information about the freebsd-ports
mailing list