Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-24914

Cannot start mongod from cwd > 1000 bytes long

    • Type: Icon: Bug Bug
    • Resolution: Done
    • Priority: Icon: Major - P3 Major - P3
    • 3.3.12
    • Affects Version/s: None
    • Component/s: Internal Code
    • None
    • Fully Compatible
    • ALL
    • Hide
      # Create dbpath
      mkdir /tmp/data
      
      # Create long path
      for i in {0..9}; do s+=0123456789; done
      d=/tmp/$s/$s/$s/$s/$s/$s/$s/$s/$s/$s
      mkdir -p $d
      
      # Succeeds:
      cd /tmp
      mongod --dbpath /tmp/data
      
      # Fails:
      cd $d
      mongod --dbpath /tmp/data
      
      Show
      # Create dbpath mkdir /tmp/data # Create long path for i in {0..9}; do s+=0123456789; done d=/tmp/$s/$s/$s/$s/$s/$s/$s/$s/$s/$s mkdir -p $d # Succeeds: cd /tmp mongod --dbpath /tmp/data # Fails: cd $d mongod --dbpath /tmp/data

      The expectation is that the server should start successfully from any working directory that the OS considers valid. This is especially true when only absolute paths have been specified for dbpath and logpath, and if --fork is used (whereupon the server will chdir to /).

      See also SERVER-24916.

      Success case:

      kev@genique:~$ cd /tmp
      kev@genique:/tmp$ mongod --dbpath /tmp/data
      2016-07-06T11:51:57.347+1000 I CONTROL  [initandlisten] MongoDB starting : pid=24560 port=27017 dbpath=/tmp/data 64-bit host=genique
      2016-07-06T11:51:57.347+1000 I CONTROL  [initandlisten] db version v3.2.6
      2016-07-06T11:51:57.347+1000 I CONTROL  [initandlisten] git version: 05552b562c7a0b3143a729aaa0838e558dc49b25
      2016-07-06T11:51:57.347+1000 I CONTROL  [initandlisten] allocator: tcmalloc
      2016-07-06T11:51:57.347+1000 I CONTROL  [initandlisten] modules: none
      2016-07-06T11:51:57.347+1000 I CONTROL  [initandlisten] build environment:
      2016-07-06T11:51:57.347+1000 I CONTROL  [initandlisten]     distarch: x86_64
      2016-07-06T11:51:57.347+1000 I CONTROL  [initandlisten]     target_arch: x86_64
      2016-07-06T11:51:57.347+1000 I CONTROL  [initandlisten] options: { storage: { dbPath: "/tmp/data" } }
      2016-07-06T11:51:57.368+1000 E NETWORK  [initandlisten] listen(): bind() failed errno:98 Address already in use for socket: 0.0.0.0:27017
      2016-07-06T11:51:57.368+1000 E NETWORK  [initandlisten]   addr already in use
      2016-07-06T11:51:57.368+1000 E STORAGE  [initandlisten] Failed to set up sockets during startup.
      2016-07-06T11:51:57.368+1000 I CONTROL  [initandlisten] dbexit:  rc: 48
      kev@genique:/tmp$ 
      

      Failure case:

      kev@genique:/tmp$ cd $d
      kev@genique:/tmp/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789$ mongod --dbpath /tmp/data
      2016-07-06T11:52:10.470+1000 I -        [main] Assertion failure getcwd(buffer, 1000) src/mongo/db/server_options_helpers.cpp 450
      2016-07-06T11:52:10.476+1000 I CONTROL  [main]
       0x12fa192 0x12a5538 0x1291074 0xf87cc1 0xcd0476 0x962ccb 0x95fa24 0x96ac2b 0x96b2dc 0x96b60e 0x962678 0x7f2d89ef2ec5 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":"7F2D89ED1000","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) [0x7f2d89ef2ec5]
       mongod(+0x559D09) [0x959d09]
      -----  END BACKTRACE  -----
      2016-07-06T11:52:10.476+1000 F CONTROL  [main] Failed global initialization: UnknownError: assertion src/mongo/db/server_options_helpers.cpp:450
      kev@genique:/tmp/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789/0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789$
      

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

      Status setupCwd() {
          // setup cwd
          char buffer[1024];
      #ifdef _WIN32
          verify(_getcwd(buffer, 1000));
      #else
          verify(getcwd(buffer, 1000));
      #endif
          serverGlobalParams.cwd = buffer;
          return Status::OK();
      }
      

      A quick and easy (though partial) fix is to just change the hardcoded 1024 and 1000 to PATH_MAX (which POSIX defines as >= 4096), so as to be better aligned with OS limits (though not definitively so).

      It turns out that POSIX requires PATH_MAX >= 256 (or >= 1024 for XSI). Darwin/OSX and Solaris are 1024, but Linux is 10k or more.

      A fuller (but more involved) fix would be to dynamically allocate and grow the buffer as necessary.

            Assignee:
            kevin.pulo@mongodb.com Kevin Pulo
            Reporter:
            kevin.pulo@mongodb.com Kevin Pulo
            Votes:
            0 Vote for this issue
            Watchers:
            7 Start watching this issue

              Created:
              Updated:
              Resolved: