Add using Ctrl+C to stop ghttp

This commit is contained in:
suxunbin 2019-03-29 13:58:17 +08:00
parent 612cb4f968
commit c93f869f54
2 changed files with 56 additions and 2 deletions

View File

@ -1384,7 +1384,7 @@ bool Database::save()
this->stringindex->flush();
this->clear_update_log();
cerr<<"database checkpoint: "<<this->getName()<<endl;
//cerr<<"database checkpoint: "<<this->getName()<<endl;
return true;
}

View File

@ -109,6 +109,7 @@ void query_thread(bool update_flag, string db_name, string format, string db_que
bool checkall_thread(const shared_ptr<HttpServer::Response>& response, const shared_ptr<HttpServer::Request>& request);
void signalHandler(int signum);
//=============================================================================
//TODO: use locak to protect logs when running in multithreading environment
@ -117,6 +118,7 @@ string queryLog = "logs/endpoint/query.log";
mutex query_log_lock;
string system_password;
string NAMELOG_PATH = "name.log";
int port;
//pthread_rwlock_t database_load_lock;
@ -753,6 +755,7 @@ int initialize(int argc, char *argv[])
return -1;
}
}
port = server.config.port;
cout << "server port: " << server.config.port << " database name: " << db_name << endl;
//USAGE: then user can use http://localhost:port/ to visit the server or coding with RESTful API
//HTTP-server at port 9000 using 1 thread
@ -1060,7 +1063,7 @@ int initialize(int argc, char *argv[])
server.resource["^/%3[F|f]operation%3[D|d]stop%26username%3[D|d](.*)%26password%3[D|d](.*)$"]["GET"]=[&server](shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request)
{
bool flag = stop_handler(server, response, request);
if(flag)
if (flag)
exit(0);
};
server.resource["^/?operation=stop&username=(.*)&password=(.*)$"]["GET"]=[&server](shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request)
@ -1130,6 +1133,8 @@ int initialize(int argc, char *argv[])
};
thread server_thread([&server](){
//handle the Ctrl+C signal
signal(SIGINT, signalHandler);
//Start server
server.start();
cout<<"check: server started"<<endl;
@ -1160,6 +1165,55 @@ int initialize(int argc, char *argv[])
return 0;
}
void signalHandler(int signum)
{
pthread_rwlock_rdlock(&databases_map_lock);
std::map<std::string, Database *>::iterator iter;
for (iter = databases.begin(); iter != databases.end(); iter++)
{
string database_name = iter->first;
if (database_name == "system")
continue;
Database *current_database = iter->second;
pthread_rwlock_rdlock(&already_build_map_lock);
std::map<std::string, struct DBInfo *>::iterator it_already_build = already_build.find(database_name);
pthread_rwlock_unlock(&already_build_map_lock);
if (pthread_rwlock_trywrlock(&(it_already_build->second->db_lock)) != 0)
{
string error = "Unable to checkpoint due to loss of lock";
cout << error << endl;
pthread_rwlock_unlock(&databases_map_lock);
//cout << "Stop server failed." << endl;
exit(signum);
}
current_database->save();
delete current_database;
current_database = NULL;
//cout << "Database " << database_name << " saved successfully." << endl;
pthread_rwlock_unlock(&(it_already_build->second->db_lock));
}
system_database->save();
delete system_database;
system_database = NULL;
//cout << "Database system saved successfully." << endl;
pthread_rwlock_unlock(&databases_map_lock);
pthread_rwlock_rdlock(&already_build_map_lock);
std::map<std::string, struct DBInfo *>::iterator it_already_build;
for (it_already_build = already_build.begin(); it_already_build != already_build.end(); it_already_build++)
{
struct DBInfo *temp_db = it_already_build->second;
delete temp_db;
temp_db = NULL;
}
pthread_rwlock_unlock(&already_build_map_lock);
string cmd = "rm system.db/password" + Util::int2string(port) + ".txt";
system(cmd.c_str());
//cout << "Server stopped." << endl;
exit(signum);
}
//QUERY: can server.send() in default_resource_send run in parallism?
//TCP is slower than UDP, but more safely, and can support large data transfer well