From 45ce73bfda632ed276ec988b4aed137418126348 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 12 May 2015 17:10:55 +0200 Subject: [SERVER] Reload images in another thread when triggered by signal The server used to reload all images on the main thread, which is also responsible for accepting connections. While reloading the list, no new connections were accepted, which lead to clients marking the server as bad during their RTT measurements, then switching away from it. --- src/server/server.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src/server/server.c') diff --git a/src/server/server.c b/src/server/server.c index 6a317fe..384ffa6 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -60,6 +60,8 @@ static bool sigReload = false, sigLogCycle = false; static bool dnbd3_addClient(dnbd3_client_t *client); static void dnbd3_handleSignal(int signum); +static void* server_asyncImageListLoad(void *data); + /** * Print help text for usage instructions */ @@ -258,7 +260,7 @@ int main(int argc, char *argv[]) if ( demonize ) daemon( 1, 0 ); spin_init( &_clients_lock, PTHREAD_PROCESS_PRIVATE ); - spin_init( &_images_lock, PTHREAD_PROCESS_PRIVATE ); + image_serverStartup(); altservers_init(); integrity_init(); net_init(); @@ -306,9 +308,6 @@ int main(int argc, char *argv[]) socklen_t len; int fd; - // setup rpc - //pthread_t thread_rpc; - //thread_create(&(thread_rpc), NULL, &dnbd3_rpc_mainloop, NULL); // Initialize thread pool if ( !threadpool_init( 8 ) ) { logadd( LOG_ERROR, "Could not init thread pool!\n" ); @@ -323,7 +322,7 @@ int main(int argc, char *argv[]) if ( sigReload ) { sigReload = false; logadd( LOG_INFO, "SIGUSR1 received, re-scanning image directory" ); - image_loadAll( NULL ); + threadpool_run( &server_asyncImageListLoad, NULL ); } if ( sigLogCycle ) { sigLogCycle = false; @@ -357,7 +356,7 @@ int main(int argc, char *argv[]) continue; } - if ( !threadpool_run( net_client_handler, (void *)dnbd3_client ) ) { + if ( !threadpool_run( &net_client_handler, (void *)dnbd3_client ) ) { logadd( LOG_ERROR, "Could not start thread for new client." ); dnbd3_removeClient( dnbd3_client ); dnbd3_client = dnbd3_freeClient( dnbd3_client ); @@ -487,3 +486,10 @@ int dnbd3_serverUptime() return (int)(time( NULL ) - startupTime); } +static void* server_asyncImageListLoad(void *data UNUSED) +{ + setThreadName( "img-list-loader" ); + image_loadAll( NULL ); + return NULL; +} + -- cgit v1.2.3-55-g7522