summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsamantharitter <samantha.ritter@10gen.com>2016-03-16 16:04:17 -0400
committersamantharitter <samantha.ritter@10gen.com>2016-03-17 11:01:31 -0400
commita8412488599ba9def9dea29505ea69323ba6e1fc (patch)
tree49e036799399b728d97ee4847b0a6d0c000168b0
parent0654b0f626fd4a2f1f8842fa41a98704aada6e01 (diff)
downloadmongo-a8412488599ba9def9dea29505ea69323ba6e1fc.tar.gz
SERVER-23125 MessageHandler has shared ownership
-rw-r--r--src/mongo/client/scoped_db_conn_test.cpp10
-rw-r--r--src/mongo/db/db.cpp3
-rw-r--r--src/mongo/s/server.cpp4
-rw-r--r--src/mongo/util/net/message_server.h3
-rw-r--r--src/mongo/util/net/message_server_port.cpp23
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