diff options
author | samantharitter <samantha.ritter@10gen.com> | 2016-03-16 16:04:17 -0400 |
---|---|---|
committer | samantharitter <samantha.ritter@10gen.com> | 2016-03-17 11:01:31 -0400 |
commit | a8412488599ba9def9dea29505ea69323ba6e1fc (patch) | |
tree | 49e036799399b728d97ee4847b0a6d0c000168b0 | |
parent | 0654b0f626fd4a2f1f8842fa41a98704aada6e01 (diff) | |
download | mongo-a8412488599ba9def9dea29505ea69323ba6e1fc.tar.gz |
SERVER-23125 MessageHandler has shared ownership
-rw-r--r-- | src/mongo/client/scoped_db_conn_test.cpp | 10 | ||||
-rw-r--r-- | src/mongo/db/db.cpp | 3 | ||||
-rw-r--r-- | src/mongo/s/server.cpp | 4 | ||||
-rw-r--r-- | src/mongo/util/net/message_server.h | 3 | ||||
-rw-r--r-- | src/mongo/util/net/message_server_port.cpp | 23 |
5 files changed, 22 insertions, 21 deletions
diff --git a/src/mongo/client/scoped_db_conn_test.cpp b/src/mongo/client/scoped_db_conn_test.cpp index b4b02da84eb..342342895d8 100644 --- a/src/mongo/client/scoped_db_conn_test.cpp +++ b/src/mongo/client/scoped_db_conn_test.cpp @@ -127,8 +127,7 @@ public: } virtual void close() {} - -} dummyHandler; +}; // TODO: Take this out and make it as a reusable class in a header file. The only // thing that is preventing this from happening is the dependency on the inShutdown @@ -162,7 +161,7 @@ public: * @param messageHandler the message handler to use for this server. Ownership * of this object is passed to this server. */ - void run(MessageHandler* messsageHandler) { + void run(std::shared_ptr<MessageHandler> messsageHandler) { if (_server != NULL) { return; } @@ -175,7 +174,7 @@ public: shuttingDown = false; } - _server.reset(createServer(options, messsageHandler)); + _server.reset(createServer(options, std::move(messsageHandler))); _serverThread = stdx::thread(runServer, _server.get()); } @@ -234,7 +233,8 @@ public: _maxPoolSizePerHost = globalConnPool.getMaxPoolSize(); _dummyServer = new DummyServer(TARGET_PORT); - _dummyServer->run(&dummyHandler); + auto dummyHandler = std::make_shared<DummyMessageHandler>(); + _dummyServer->run(std::move(dummyHandler)); DBClientConnection conn; Timer timer; diff --git a/src/mongo/db/db.cpp b/src/mongo/db/db.cpp index a7db4a24b97..c20fa2426bd 100644 --- a/src/mongo/db/db.cpp +++ b/src/mongo/db/db.cpp @@ -458,7 +458,8 @@ static void _initAndListen(int listenPort) { options.port = listenPort; options.ipList = serverGlobalParams.bind_ip; - MessageServer* server = createServer(options, new MyMessageHandler()); + auto handler = std::make_shared<MyMessageHandler>(); + MessageServer* server = createServer(options, std::move(handler)); server->setAsTimeTracker(); // This is what actually creates the sockets, but does not yet listen on them because we diff --git a/src/mongo/s/server.cpp b/src/mongo/s/server.cpp index 5af21b57d7b..f657bbbbd5f 100644 --- a/src/mongo/s/server.cpp +++ b/src/mongo/s/server.cpp @@ -339,8 +339,8 @@ static ExitCode runMongosServer() { opts.port = serverGlobalParams.port; opts.ipList = serverGlobalParams.bind_ip; - ShardedMessageHandler handler; - MessageServer* server = createServer(opts, &handler); + auto handler = std::make_shared<ShardedMessageHandler>(); + MessageServer* server = createServer(opts, std::move(handler)); server->setAsTimeTracker(); if (!server->setupSockets()) { return EXIT_NET_ERROR; diff --git a/src/mongo/util/net/message_server.h b/src/mongo/util/net/message_server.h index 47c545c4196..dd7ff686e59 100644 --- a/src/mongo/util/net/message_server.h +++ b/src/mongo/util/net/message_server.h @@ -76,5 +76,6 @@ public: }; // TODO use a factory here to decide between port and asio variations -MessageServer* createServer(const MessageServer::Options& opts, MessageHandler* handler); +MessageServer* createServer(const MessageServer::Options& opts, + std::shared_ptr<MessageHandler> handler); } diff --git a/src/mongo/util/net/message_server_port.cpp b/src/mongo/util/net/message_server_port.cpp index 07a04756151..af230519ca7 100644 --- a/src/mongo/util/net/message_server_port.cpp +++ b/src/mongo/util/net/message_server_port.cpp @@ -75,19 +75,18 @@ class MessagingPortWithHandler : public MessagingPort { public: MessagingPortWithHandler(const std::shared_ptr<Socket>& socket, - MessageHandler* handler, + const std::shared_ptr<MessageHandler> handler, long long connectionId) : MessagingPort(socket), _handler(handler) { setConnectionId(connectionId); } - MessageHandler* getHandler() const { + const std::shared_ptr<MessageHandler> getHandler() const { return _handler; } private: - // Not owned. - MessageHandler* const _handler; + const std::shared_ptr<MessageHandler> _handler; }; } // namespace @@ -98,11 +97,10 @@ public: * Creates a new message server. * * @param opts - * @param handler the handler to use. Caller is responsible for managing this object - * and should make sure that it lives longer than this server. + * @param handler the handler to use. */ - PortMessageServer(const MessageServer::Options& opts, MessageHandler* handler) - : Listener("", opts.ipList, opts.port), _handler(handler) {} + PortMessageServer(const MessageServer::Options& opts, std::shared_ptr<MessageHandler> handler) + : Listener("", opts.ipList, opts.port), _handler(std::move(handler)) {} virtual void accepted(std::shared_ptr<Socket> psocket, long long connectionId) { ScopeGuard sleepAfterClosingPort = MakeGuard(sleepmillis, 2); @@ -181,7 +179,7 @@ public: } private: - MessageHandler* _handler; + const std::shared_ptr<MessageHandler> _handler; /** * Handles incoming messages from a given socket. @@ -201,7 +199,7 @@ private: invariant(arg); unique_ptr<MessagingPortWithHandler> portWithHandler( static_cast<MessagingPortWithHandler*>(arg)); - MessageHandler* const handler = portWithHandler->getHandler(); + const std::shared_ptr<MessageHandler> handler = portWithHandler->getHandler(); setThreadName(std::string(str::stream() << "conn" << portWithHandler->connectionId())); portWithHandler->psock->setLogLevel(logger::LogSeverity::Debug(1)); @@ -261,8 +259,9 @@ private: }; -MessageServer* createServer(const MessageServer::Options& opts, MessageHandler* handler) { - return new PortMessageServer(opts, handler); +MessageServer* createServer(const MessageServer::Options& opts, + std::shared_ptr<MessageHandler> handler) { + return new PortMessageServer(opts, std::move(handler)); } } // namespace mongo |