fix service memory leak
authorDave Watson <davejwatson@fb.com>
Thu, 19 Mar 2015 19:57:13 +0000 (12:57 -0700)
committerNoam Lerner <noamler@fb.com>
Wed, 25 Mar 2015 22:34:34 +0000 (15:34 -0700)
Summary:
This code is only used in a test so far.

Basically it looks like Pipeline has some dependency issues - any addBack() pipelines have to be deleted *after* the main pipeline is destroyed.  Ideally if the pipeline is already closed, the destruction order wouldn't matter.  There is currently no removeBack() call either.   This is a quick fix for the test to just delete stuff in the right order, we can discuss a better solution when @jsedgwick returns

Test Plan: fbconfig --sanitize=address --with-project-version=clang:3.5 --clang folly/wangle/service && fbmake runtests

Reviewed By: hans@fb.com

Subscribers: trunkagent, doug, fugalh, folly-diffs@, yfeldblum, jsedgwick

FB internal diff: D1903200

Tasks: 6415578

Signature: t1:1903200:1426528298:e109dcc0ec586a505a26cd95a6f20434d22cbd37

folly/wangle/bootstrap/ServerBootstrap-inl.h
folly/wangle/service/ServiceTest.cpp

index a47b458283ee253cef86555836023a14a7a4fdd0..ac18f314bd946cf50ce4a88715bc8bf279b33983 100644 (file)
@@ -45,7 +45,9 @@ class ServerAcceptor : public Acceptor {
     }
     void notifyPendingShutdown() {}
     void closeWhenIdle() {}
-    void dropConnection() {}
+    void dropConnection() {
+      delete this;
+    }
     void dumpConnectionState(uint8_t loglevel) {}
    private:
     PipelinePtr pipeline_;
index d54ac9ec69d36727666699c5db688875b8a4c568..8c1c8314fa7374b133df300a862457469a36c288 100644 (file)
@@ -127,13 +127,14 @@ TEST(Wangle, ClientServerTest) {
   server.bind(port);
 
   // client
-  ClientBootstrap<Pipeline> client;
+  auto client = std::make_shared<ClientBootstrap<Pipeline>>();
   ClientServiceFactory<Pipeline, std::string, std::string> serviceFactory;
-  client.pipelineFactory(
+  client->pipelineFactory(
     std::make_shared<ClientPipelineFactory<std::string, std::string>>());
   SocketAddress addr("127.0.0.1", port);
-  client.connect(addr);
-  auto service = serviceFactory(&client).value();
+  client->connect(addr);
+  auto service = std::shared_ptr<Service<std::string, std::string>>(
+    serviceFactory(client.get()).value());
   auto rep = (*service)("test");
 
   rep.then([&](std::string value) {
@@ -143,6 +144,7 @@ TEST(Wangle, ClientServerTest) {
   });
   EventBaseManager::get()->getEventBase()->loopForever();
   server.stop();
+  client.reset();
 }
 
 class AppendFilter : public Filter<std::string, std::string> {