diff options
author | Eric Milkie <milkie@10gen.com> | 2015-03-19 15:00:12 -0400 |
---|---|---|
committer | Eric Milkie <milkie@10gen.com> | 2015-03-19 15:01:41 -0400 |
commit | b9b1c95520824c377b4c800e6193d9855be1e14d (patch) | |
tree | 54a1fddd8b5b7cce2c418921764f49e78fa4d4a9 | |
parent | eac8d16add28e197df59bf5fbfd45fa39b9737f7 (diff) | |
download | mongo-b9b1c95520824c377b4c800e6193d9855be1e14d.tar.gz |
SERVER-17652 open sockets before initializing storage engine
-rw-r--r-- | jstests/disk/too_many_fds.js | 22 | ||||
-rw-r--r-- | src/mongo/db/db.cpp | 26 |
2 files changed, 35 insertions, 13 deletions
diff --git a/jstests/disk/too_many_fds.js b/jstests/disk/too_many_fds.js new file mode 100644 index 00000000000..f714d495d7c --- /dev/null +++ b/jstests/disk/too_many_fds.js @@ -0,0 +1,22 @@ +// Create more than 1024 files on certain storage engines, then restart the server and see that it +// can still listen on fd's smaller than FD_SETSIZE. + +(function() { +var baseName = "jstests_disk_too_many_fds"; + +var m = MongoRunner.runMongod( { smallfiles: "" , nssize: 1 } ); +// Make 1026 collections, each in a separate database. On some storage engines, this may cause +// 1026 files to be created. +for (var i = 1; i < 1026; ++i) { + var db = m.getDB("db" + i); + var coll = db.getCollection("coll" + i); + assert.writeOK(coll.insert( {} )); +} + +MongoRunner.stopMongod( m ); + +// Ensure we can still start up with that many files. +var m2 = MongoRunner.runMongod( { dbpath: m.dbpath, smallfiles: "" , nssize: 1, + restart: true, cleanData: false } ); +assert.eq(1, m2.getDB("db1025").getCollection("coll1025").count()); +}()); diff --git a/src/mongo/db/db.cpp b/src/mongo/db/db.cpp index 2fbee0bc850..e070e70c6b5 100644 --- a/src/mongo/db/db.cpp +++ b/src/mongo/db/db.cpp @@ -439,6 +439,19 @@ namespace mongo { static void _initAndListen(int listenPort ) { Client::initThread("initandlisten"); + // Due to SERVER-15389, we must setupSockets first thing at startup in order to avoid + // obtaining too high a file descriptor for our calls to select(). + MessageServer::Options options; + options.port = listenPort; + options.ipList = serverGlobalParams.bind_ip; + + MessageServer* server = createServer(options, new MyMessageHandler()); + server->setAsTimeTracker(); + + // This is what actually creates the sockets, but does not yet listen on them because we + // do not want connections to just hang if recovery takes a very long time. + server->setupSockets(); + // Warn if we detect configurations for multiple registered storage engines in // the same configuration file/environment. if (serverGlobalParams.parsedOpts.hasField("storage")) { @@ -510,19 +523,6 @@ namespace mongo { boost::filesystem::exists(storageGlobalParams.repairpath)); } - // Due to SERVER-15389, we must setupSockets first thing at startup in order to avoid - // obtaining too high a file descriptor for our calls to select(). - MessageServer::Options options; - options.port = listenPort; - options.ipList = serverGlobalParams.bind_ip; - - MessageServer* server = createServer(options, new MyMessageHandler()); - server->setAsTimeTracker(); - - // This is what actually creates the sockets, but does not yet listen on them because we - // do not want connections to just hang if recovery takes a very long time. - server->setupSockets(); - // TODO: This should go into a MONGO_INITIALIZER once we have figured out the correct // dependencies. if (snmpInit) { |