summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Rettberg2013-09-17 18:38:37 +0200
committerSimon Rettberg2013-09-17 18:38:37 +0200
commit5c8aadc590a7ce851cbbb6dd18e40b6ffcf94ba5 (patch)
tree177c4149ab13cb542c787c13e3499c545c8393c4 /src
parent[SERVER] Properly decrease uplink.queueLen when removing a client (diff)
downloaddnbd3-5c8aadc590a7ce851cbbb6dd18e40b6ffcf94ba5.tar.gz
dnbd3-5c8aadc590a7ce851cbbb6dd18e40b6ffcf94ba5.tar.xz
dnbd3-5c8aadc590a7ce851cbbb6dd18e40b6ffcf94ba5.zip
[SERVER] Block signals on network threads
Diffstat (limited to 'src')
-rw-r--r--src/server/altservers.c1
-rw-r--r--src/server/helper.c12
-rw-r--r--src/server/helper.h1
-rw-r--r--src/server/net.c11
-rw-r--r--src/server/server.c3
-rw-r--r--src/server/sockhelper.h6
-rw-r--r--src/server/uplink.c1
7 files changed, 28 insertions, 7 deletions
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 <stdlib.h>
#include <assert.h>
#include <sys/prctl.h> // For thread names
+#include <signal.h>
#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 <assert.h>
#include <errno.h>
#include <inttypes.h>
+#include <signal.h>
#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 ) {