THRIFT-149. cpp: Make TNonblockingServer handle a shut-down ThreadManager
authorDavid Reiss <dreiss@apache.org>
Tue, 7 Oct 2008 21:39:19 +0000 (21:39 +0000)
committerDavid Reiss <dreiss@apache.org>
Tue, 7 Oct 2008 21:39:19 +0000 (21:39 +0000)
This is a step toward implementing a graceful shutdown.

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@702644 13f79535-47bb-0310-9956-ffa450edef68

lib/cpp/src/server/TNonblockingServer.cpp

index bf9a5b1..c0be8ef 100644 (file)
@@ -5,6 +5,7 @@
 // http://developers.facebook.com/thrift/
 
 #include "TNonblockingServer.h"
+#include <concurrency/Exception.h>
 
 #include <iostream>
 #include <sys/socket.h>
@@ -19,6 +20,7 @@ namespace facebook { namespace thrift { namespace server {
 
 using namespace facebook::thrift::protocol;
 using namespace facebook::thrift::transport;
+using namespace facebook::thrift::concurrency;
 using namespace std;
 
 class TConnection::Task: public Runnable {
@@ -252,7 +254,13 @@ void TConnection::transition() {
           GlobalOutput("TNonblockingServer::serve(): coult not event_add");
           return;
         }
-        server_->addTask(task);
+        try {
+          server_->addTask(task);
+        } catch (IllegalStateException & ise) {
+          // The ThreadManager is not ready to handle any more tasks (it's probably shutting down).
+          GlobalOutput.printf(stderr, "IllegalStateException: Server::process() %s", ise.what());
+          close();
+        }
 
         // Set this connection idle so that libevent doesn't process more
         // data on it while we're still waiting for the threadmanager to