[SERVER-24915] getcwd() failure should report errno Created: 06/Jul/16  Updated: 02/Sep/16  Resolved: 16/Aug/16

Status: Closed
Project: Core Server
Component/s: Diagnostics
Affects Version/s: None
Fix Version/s: 3.3.12

Type: Bug Priority: Major - P3
Reporter: Kevin Pulo Assignee: Kevin Pulo
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Related
related to SERVER-24914 Cannot start mongod from cwd > 1000 b... Closed
is related to SERVER-24916 Only get current working directory (c... Closed
Backwards Compatibility: Fully Compatible
Operating System: ALL
Steps To Reproduce:
  • EACCES:

    mkdir -p /tmp/data
    mkdir -p noaccess
    cd noaccess
    # Works on (modern) Linux, but fails on OSX:
    chmod 0 .
    mongod --dbpath /tmp/data
    

    bash-3.2$ chmod 0 .
    bash-3.2$ mongod --dbpath /tmp/data
    2016-07-06T12:29:50.913+1000 I -        [main] Assertion failure getcwd(buffer, 1000) src/mongo/db/server_options_helpers.cpp 450
    2016-07-06T12:29:50.928+1000 I CONTROL  [main]
    0x104e899ba 0x104e288d1 0x104e16399 0x104b6207e 0x1048a91c3 0x10456e556 0x10456dae2 0x10457307e 0x1045738c5 0x1045662ae 0x104562204
    ----- BEGIN BACKTRACE -----
    {"backtrace":[{"b":"104561000","o":"9289BA","s":"_ZN5mongo15printStackTraceERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEE"},{"b":"104561000","o":"8C78D1","s":"_ZN5mongo10logContextEPKc"},{"b":"104561000","o":"8B5399","s":"_ZN5mongo12verifyFailedEPKcS1_j"},{"b":"104561000","o":"60107E","s":"_ZN5mongo18storeServerOptionsERKNS_17optionenvironment11EnvironmentERKNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEE"},{"b":"104561000","o":"3481C3","s":"_ZN5mongo18storeMongodOptionsERKNS_17optionenvironment11EnvironmentERKNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEE"},{"b":"104561000","o":"D556","s":"_ZN5mongo45_mongoInitializerFunction_MongodOptions_StoreEPNS_18InitializerContextE"},{"b":"104561000","o":"CAE2","s":"ZNSt3__110__function6__funcIPFN5mongo6StatusEPNS2_18InitializerContextEENS_9allocatorIS7_EES6_EclEOS5"},{"b":"104561000","o":"1207E","s":"_ZNK5mongo11Initializer7executeERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEERKNS1_3mapIS8_S8_NS1_4lessIS8_EENS6_INS1_4pairIKS8_S8_EEEEEE"},{"b":"104561000","o":"128C5","s":"ZN5mongo21runGlobalInitializersEiPKPKcS3"},{"b":"104561000","o":"52AE","s":"main"},{"b":"104561000","o":"1204","s":"start"}]}
    mongod(_ZN5mongo15printStackTraceERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEE+0x3A) [0x104e899ba]
    mongod(_ZN5mongo10logContextEPKc+0x171) [0x104e288d1]
    mongod(_ZN5mongo12verifyFailedEPKcS1_j+0x239) [0x104e16399]
    mongod(_ZN5mongo18storeServerOptionsERKNS_17optionenvironment11EnvironmentERKNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEE+0x397E) [0x104b6207e]
    mongod(_ZN5mongo18storeMongodOptionsERKNS_17optionenvironment11EnvironmentERKNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEE+0x23) [0x1048a91c3]
    mongod(_ZN5mongo45_mongoInitializerFunction_MongodOptions_StoreEPNS_18InitializerContextE+0x26) [0x10456e556]
    mongod(ZNSt3__110__function6__funcIPFN5mongo6StatusEPNS2_18InitializerContextEENS_9allocatorIS7_EES6_EclEOS5+0x12) [0x10456dae2]
    mongod(_ZNK5mongo11Initializer7executeERKNSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEERKNS1_3mapIS8_S8_NS1_4lessIS8_EENS6_INS1_4pairIKS8_S8_EEEEEE+0x13E) [0x10457307e]
    mongod(ZN5mongo21runGlobalInitializersEiPKPKcS3+0x355) [0x1045738c5]
    mongod(main+0x8E) [0x1045662ae]
    mongod(start+0x34) [0x104562204]
    -----  END BACKTRACE  -----
    2016-07-06T12:29:50.936+1000 F CONTROL  [main] Failed global initialization: UnknownError: assertion src/mongo/db/server_options_helpers.cpp:450
    

  • ENOENT:

    kev@genique:~$ mkdir -p /tmp/data
    kev@genique:~$ mkdir unlinkme
    kev@genique:~$ cd unlinkme
    kev@genique:~/unlinkme$ mongod --dbpath /tmp/data
    2016-07-06T12:02:26.431+1000 I CONTROL  [initandlisten] MongoDB starting : pid=7540 port=27017 dbpath=/tmp/data 64-bit host=genique
    2016-07-06T12:02:26.431+1000 I CONTROL  [initandlisten] db version v3.2.6
    2016-07-06T12:02:26.431+1000 I CONTROL  [initandlisten] git version: 05552b562c7a0b3143a729aaa0838e558dc49b25
    2016-07-06T12:02:26.431+1000 I CONTROL  [initandlisten] allocator: tcmalloc
    2016-07-06T12:02:26.431+1000 I CONTROL  [initandlisten] modules: none
    2016-07-06T12:02:26.431+1000 I CONTROL  [initandlisten] build environment:
    2016-07-06T12:02:26.431+1000 I CONTROL  [initandlisten]     distarch: x86_64
    2016-07-06T12:02:26.431+1000 I CONTROL  [initandlisten]     target_arch: x86_64
    2016-07-06T12:02:26.431+1000 I CONTROL  [initandlisten] options: { storage: { dbPath: "/tmp/data" } }
    2016-07-06T12:02:26.448+1000 E NETWORK  [initandlisten] listen(): bind() failed errno:98 Address already in use for socket: 0.0.0.0:27017
    2016-07-06T12:02:26.449+1000 E NETWORK  [initandlisten]   addr already in use
    2016-07-06T12:02:26.449+1000 E STORAGE  [initandlisten] Failed to set up sockets during startup.
    2016-07-06T12:02:26.449+1000 I CONTROL  [initandlisten] dbexit:  rc: 48
    kev@genique:~/unlinkme$ rmdir ../unlinkme
    kev@genique:~/unlinkme$ mongod --dbpath /tmp/data
    2016-07-06T12:02:34.144+1000 I -        [main] Assertion failure getcwd(buffer, 1000) src/mongo/db/server_options_helpers.cpp 450
    2016-07-06T12:02:34.152+1000 I CONTROL  [main]
     0x12fa192 0x12a5538 0x1291074 0xf87cc1 0xcd0476 0x962ccb 0x95fa24 0x96ac2b 0x96b2dc 0x96b60e 0x962678 0x7f8a1b759ec5 0x959d09
    ----- BEGIN BACKTRACE -----
    {"backtrace":[{"b":"400000","o":"EFA192","s":"_ZN5mongo15printStackTraceERSo"},{"b":"400000","o":"EA5538","s":"_ZN5mongo10logContextEPKc"},{"b":"400000","o":"E91074","s":"_ZN5mongo12verifyFailedEPKcS1_j"},{"b":"400000","o":"B87CC1","s":"_ZN5mongo18storeServerOptionsERKNS_17optionenvironment11EnvironmentERKSt6vectorISsSaISsEE"},{"b":"400000","o":"8D0476","s":"_ZN5mongo18storeMongodOptionsERKNS_17optionenvironment11EnvironmentERKSt6vectorISsSaISsEE"},{"b":"400000","o":"562CCB","s":"_ZN5mongo45_mongoInitializerFunction_MongodOptions_StoreEPNS_18InitializerContextE"},{"b":"400000","o":"55FA24","s":"_ZNSt17_Function_handlerIFN5mongo6StatusEPNS0_18InitializerContextEEPS4_E9_M_invokeERKSt9_Any_dataS3_"},{"b":"400000","o":"56AC2B","s":"_ZNK5mongo11Initializer7executeERKSt6vectorISsSaISsEERKSt3mapISsSsSt4lessISsESaISt4pairIKSsSsEEE"},{"b":"400000","o":"56B2DC","s":"_ZN5mongo21runGlobalInitializersERKSt6vectorISsSaISsEERKSt3mapISsSsSt4lessISsESaISt4pairIKSsSsEEE"},{"b":"400000","o":"56B60E","s":"_ZN5mongo21runGlobalInitializersEiPKPKcS3_"},{"b":"400000","o":"562678","s":"main"},{"b":"7F8A1B738000","o":"21EC5","s":"__libc_start_main"},{"b":"400000","o":"559D09"}]}
     mongod(_ZN5mongo15printStackTraceERSo+0x32) [0x12fa192]
     mongod(_ZN5mongo10logContextEPKc+0x138) [0x12a5538]
     mongod(_ZN5mongo12verifyFailedEPKcS1_j+0xB4) [0x1291074]
     mongod(_ZN5mongo18storeServerOptionsERKNS_17optionenvironment11EnvironmentERKSt6vectorISsSaISsEE+0x2C01) [0xf87cc1]
     mongod(_ZN5mongo18storeMongodOptionsERKNS_17optionenvironment11EnvironmentERKSt6vectorISsSaISsEE+0x26) [0xcd0476]
     mongod(_ZN5mongo45_mongoInitializerFunction_MongodOptions_StoreEPNS_18InitializerContextE+0x2B) [0x962ccb]
     mongod(_ZNSt17_Function_handlerIFN5mongo6StatusEPNS0_18InitializerContextEEPS4_E9_M_invokeERKSt9_Any_dataS3_+0x14) [0x95fa24]
     mongod(_ZNK5mongo11Initializer7executeERKSt6vectorISsSaISsEERKSt3mapISsSsSt4lessISsESaISt4pairIKSsSsEEE+0x1CB) [0x96ac2b]
     mongod(_ZN5mongo21runGlobalInitializersERKSt6vectorISsSaISsEERKSt3mapISsSsSt4lessISsESaISt4pairIKSsSsEEE+0x2C) [0x96b2dc]
     mongod(_ZN5mongo21runGlobalInitializersEiPKPKcS3_+0x31E) [0x96b60e]
     mongod(main+0x68) [0x962678]
     libc.so.6(__libc_start_main+0xF5) [0x7f8a1b759ec5]
     mongod(+0x559D09) [0x959d09]
    -----  END BACKTRACE  -----
    2016-07-06T12:02:34.152+1000 F CONTROL  [main] Failed global initialization: UnknownError: assertion src/mongo/db/server_options_helpers.cpp:450
    kev@genique:~/unlinkme$
    

Participants:

 Description   

In various circumstances, getcwd() can return NULL and set errno. The server checks for this, but it results in an inelegant assertion that does not include the errno. This hinders diagnosis of the root cause of the getcwd() failure.

See also SERVER-24916.

https://github.com/mongodb/mongo/blob/r3.3.9/src/mongo/db/server_options_helpers.cpp#L462-L464

458
Status setupCwd() {
459
    // setup cwd
460
    char buffer[1024];
461
#ifdef _WIN32
462
    verify(_getcwd(buffer, 1000));
463
#else
464
    verify(getcwd(buffer, 1000));
465
#endif
466
    serverGlobalParams.cwd = buffer;
467
    return Status::OK();
468
}

Relevant possible errors:

  • ERANGE (Path too long for supplied buffer) (See also SERVER-24914) (POSIX, Linux, Darwin, Windows)
  • EACCES (Permission denied) (POSIX, Linux (kindof), Darwin)
  • ENOMEM (Insufficient memory) (POSIX, Linux, Darwin, Windows)
  • ENOENT (Directory has been unlinked) (Linux, Darwin)

Manpages:



 Comments   
Comment by Githook User [ 16/Aug/16 ]

Author:

{u'username': u'devkev', u'name': u'Kevin Pulo', u'email': u'kevin.pulo@mongodb.com'}

Message: SERVER-24914 SERVER-24915 improve getting cwd at server startup
Branch: master
https://github.com/mongodb/mongo/commit/512a1d57f6b3560cc3531355676cf06d362c93a1

Generated at Thu Feb 08 04:07:46 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.