From 5c8aadc590a7ce851cbbb6dd18e40b6ffcf94ba5 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 17 Sep 2013 18:38:37 +0200 Subject: [SERVER] Block signals on network threads --- src/server/altservers.c | 1 + src/server/helper.c | 12 ++++++++++++ src/server/helper.h | 1 + src/server/net.c | 11 ++++++++--- src/server/server.c | 3 ++- src/server/sockhelper.h | 6 +++--- src/server/uplink.c | 1 + 7 files changed, 28 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/server/altservers.c b/src/server/altservers.c index 39132ad..e8ef14c 100644 --- a/src/server/altservers.c +++ b/src/server/altservers.c @@ -317,6 +317,7 @@ static void *altservers_main(void *data) struct timespec start, end; setThreadName( "altserver-check" ); + blockNoncriticalSignals(); // Init spinlock spin_init( &pendingLock, PTHREAD_PROCESS_PRIVATE ); // Init waiting links queue diff --git a/src/server/helper.c b/src/server/helper.c index 6c0e822..8070fa0 100644 --- a/src/server/helper.c +++ b/src/server/helper.c @@ -4,6 +4,7 @@ #include #include #include // For thread names +#include #include "../config.h" @@ -128,3 +129,14 @@ void setThreadName(char *name) if ( strlen( name ) > 16 ) name[16] = '\0'; prctl( PR_SET_NAME, (unsigned long)name, 0, 0, 0 ); } + +void blockNoncriticalSignals() +{ + sigset_t sigmask; + sigemptyset(&sigmask); + sigaddset(&sigmask, SIGUSR1); + sigaddset(&sigmask, SIGUSR2); + sigaddset(&sigmask, SIGHUP); + sigaddset(&sigmask, SIGPIPE); + pthread_sigmask(SIG_BLOCK, &sigmask, NULL); +} diff --git a/src/server/helper.h b/src/server/helper.h index eb82a00..301a5ea 100644 --- a/src/server/helper.h +++ b/src/server/helper.h @@ -17,6 +17,7 @@ void strtolower(char *string); void remove_trailing_slash(char *string); void trim_right(char * const string); void setThreadName(char *name); +void blockNoncriticalSignals(); static inline int is_same_server(const dnbd3_host_t * const a, const dnbd3_host_t * const b) { diff --git a/src/server/net.c b/src/server/net.c index cd38205..3e9383d 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "sockhelper.h" #include "helper.h" @@ -46,11 +47,12 @@ static inline char recv_request_header(int sock, dnbd3_request_t *request) { - int ret; + int ret, fails = 0; // Read request header from socket - if ( (ret = recv( sock, request, sizeof(*request), MSG_WAITALL )) != sizeof(*request) ) { - if ( ret == 0 ) return FALSE; + while ( (ret = recv( sock, request, sizeof(*request), MSG_WAITALL )) != sizeof(*request) ) { + if ( ret >= 0 || ++fails > 10 ) return FALSE; const int err = errno; + if ( err == EAGAIN || err == EINTR ) continue; printf( "[DEBUG] Error receiving request: Could not read message header (%d/%d, e=%d)\n", ret, (int)sizeof(*request), err ); return FALSE; } @@ -134,6 +136,9 @@ void *net_client_handler(void *dnbd3_client) dnbd3_server_entry_t server_list[NUMBER_SERVERS]; + // Block some signals not important to this thread + blockNoncriticalSignals(); + // Set to zero to make valgrind happy memset( &reply, 0, sizeof(reply) ); memset( &payload, 0, sizeof(payload) ); diff --git a/src/server/server.c b/src/server/server.c index e62c966..51c662b 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -328,11 +328,12 @@ int main(int argc, char *argv[]) memlogf( "[INFO] Server is ready..." ); // +++++++++++++++++++++++++++++++++++++++++++++++++++ main loop - while ( 1 ) { + while ( !_shutdown ) { len = sizeof(client); fd = accept_any( sockets, socket_count, &client, &len ); if ( fd < 0 ) { const int err = errno; + if ( err == EINTR || err == EAGAIN ) continue; memlogf( "[ERROR] Client accept failure (err=%d)", err ); usleep( 10000 ); // 10ms continue; diff --git a/src/server/sockhelper.h b/src/server/sockhelper.h index c20cf8f..4f753c9 100644 --- a/src/server/sockhelper.h +++ b/src/server/sockhelper.h @@ -59,10 +59,10 @@ void sock_set_block(int sock); */ inline void sock_set_addr4(char *ip, uint16_t port, struct sockaddr_in *addr) { - memset(addr, 0, sizeof(*addr)); + memset( addr, 0, sizeof(*addr) ); addr->sin_family = AF_INET; // IPv4 - addr->sin_addr.s_addr = inet_addr(ip); - addr->sin_port = htons(port); // set port number + addr->sin_addr.s_addr = inet_addr( ip ); + addr->sin_port = htons( port ); // set port number } /** diff --git a/src/server/uplink.c b/src/server/uplink.c index 67936d5..35bb26b 100644 --- a/src/server/uplink.c +++ b/src/server/uplink.c @@ -194,6 +194,7 @@ static void* uplink_mainloop(void *data) assert( link != NULL ); assert( link->queueLen == 0 ); setThreadName( "idle-uplink" ); + blockNoncriticalSignals(); // fdEpoll = epoll_create( 2 ); if ( fdEpoll == -1 ) { -- cgit v1.2.3-55-g7522