From 6a6a0e03482a7a799d2bc9ac3440b81d0780547a Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Sun, 10 Nov 2013 21:30:24 +0100 Subject: [SERVER] Minor tweaks here and there --- src/config.h | 17 +++++++++-------- src/kernel/blk.c | 13 +------------ src/server/altservers.c | 2 +- src/server/globals.c | 2 ++ src/server/globals.h | 5 +++++ src/server/image.c | 14 +++++++------- src/server/net.c | 2 +- 7 files changed, 26 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/config.h b/src/config.h index 7df49a0..0228ae9 100644 --- a/src/config.h +++ b/src/config.h @@ -25,19 +25,19 @@ // ########### SERVER ########### // +++++ Performance related -#define SERVER_MAX_CLIENTS 5000 +#define SERVER_MAX_CLIENTS 2000 #define SERVER_MAX_IMAGES 5000 -#define SERVER_MAX_ALTS 1000 -#define SERVER_MAX_UPLINK_QUEUE 1500 -#define SERVER_MAX_UPLINK_FAILS 4 // How many times may a server fail until it is considered bad -#define SERVER_BAD_UPLINK_IGNORE 300 // How many seconds is a server considered bad? -#define SERVER_UPLINK_QUEUELEN_THRES 900 +#define SERVER_MAX_ALTS 250 +#define SERVER_MAX_UPLINK_QUEUE 1500 +#define SERVER_MAX_UPLINK_FAILS 8 // How many times may a server fail until it is considered bad +#define SERVER_BAD_UPLINK_IGNORE 120 // How many seconds is a server considered bad? +#define SERVER_UPLINK_QUEUELEN_THRES 900 #define SERVER_MAX_PENDING_ALT_CHECKS 50 // +++++ Other magic constants #define SERVER_RTT_PROBES 5 #define SERVER_RTT_DELAY_INIT 5 -#define SERVER_RTT_DELAY_MAX 15 +#define SERVER_RTT_DELAY_MAX 45 #define SERVER_REMOTE_IMAGE_CHECK_CACHETIME 600 // 10 minutes #define SERVER_MAX_PROXY_IMAGE_SIZE 100000000000LL // 100GB @@ -61,7 +61,8 @@ #define COMMENT_LENGTH 120 // in seconds if not stated otherwise (MS = milliseconds) -#define SOCKET_TIMEOUT_SERVER_MS 30000 +#define SOCKET_TIMEOUT_SERVER_MS 15000 +#define SOCKET_TIMEOUT_SERVER_RETRIES 3 // When waiting for next header, max reties * above timeout is the actual total timeout (ping timeout) #define SOCKET_TIMEOUT_CLIENT_DATA 2 #define SOCKET_TIMEOUT_CLIENT_DISCOVERY 1 diff --git a/src/kernel/blk.c b/src/kernel/blk.c index 9cd4a76..e55de25 100644 --- a/src/kernel/blk.c +++ b/src/kernel/blk.c @@ -200,18 +200,7 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u break; case IOCTL_SWITCH: - if (msg == NULL) - { - result = -EINVAL; - } - else if (memcmp(&dev->cur_server.host, &msg->host, sizeof(msg->host))) - { - dnbd3_net_disconnect(dev); - dev->cur_server.host = msg->host; - result = dnbd3_net_connect(dev); - } - else - result = 0; + result = -EINVAL; break; case IOCTL_ADD_SRV: diff --git a/src/server/altservers.c b/src/server/altservers.c index 2eca369..17e8e4b 100644 --- a/src/server/altservers.c +++ b/src/server/altservers.c @@ -424,7 +424,7 @@ static void *altservers_main(void *data) usleep( 1000 ); // Wait a very short moment for the network to recover (we might be doing lots of measurements...) // Connect clock_gettime( CLOCK_MONOTONIC_RAW, &start ); - int sock = sock_connect( &servers[itAlt], 750, 1250 ); + int sock = sock_connect( &servers[itAlt], 750, _uplinkTimeout ); if ( sock < 0 ) continue; // Select image ++++++++++++++++++++++++++++++ if ( !dnbd3_select_image( sock, uplink->image->lower_name, uplink->image->rid, FLAGS8_SERVER ) ) { diff --git a/src/server/globals.c b/src/server/globals.c index 4f081c7..3fcb61d 100644 --- a/src/server/globals.c +++ b/src/server/globals.c @@ -14,6 +14,7 @@ int _serverPenalty = 0; int _clientPenalty = 0; int _isProxy = FALSE; int _proxyPrivateOnly = FALSE; +int _uplinkTimeout = 1250; #define SAVE_TO_VAR_STR(ss, kk) do { if (strcmp(section, #ss) == 0 && strcmp(key, #kk) == 0) { if (_ ## kk != NULL) free(_ ## kk); _ ## kk = strdup(value); } } while (0) #define SAVE_TO_VAR_BOOL(ss, kk) do { if (strcmp(section, #ss) == 0 && strcmp(key, #kk) == 0) _ ## kk = atoi(value) != 0 || strcmp(value, "true") == 0 || strcmp(value, "True") == 0 || strcmp(value, "TRUE") == 0; } while (0) @@ -27,6 +28,7 @@ static int ini_handler(void *custom, const char* section, const char* key, const SAVE_TO_VAR_BOOL( dnbd3, proxyPrivateOnly ); SAVE_TO_VAR_INT( dnbd3, serverPenalty ); SAVE_TO_VAR_INT( dnbd3, clientPenalty ); + SAVE_TO_VAR_INT( dnbd3, uplinkTimeout ); return TRUE; } diff --git a/src/server/globals.h b/src/server/globals.h index a15678b..921398d 100644 --- a/src/server/globals.h +++ b/src/server/globals.h @@ -163,6 +163,11 @@ extern int _isProxy; */ extern int _proxyPrivateOnly; +/** + * Read timeout when waiting for data on an uplink + */ +extern int _uplinkTimeout; + void globals_loadConfig(); #endif /* GLOBALS_H_ */ diff --git a/src/server/image.c b/src/server/image.c index e137a1b..37eb11c 100644 --- a/src/server/image.c +++ b/src/server/image.c @@ -184,7 +184,7 @@ int image_saveCacheMap(dnbd3_image_t *image) strcpy( mapfile, image->path ); strcat( mapfile, ".map" ); - fd = open( mapfile, O_WRONLY | O_CREAT, 0640 ); + fd = open( mapfile, O_WRONLY | O_CREAT, 0644 ); if ( fd < 0 ) { spin_lock( &image->lock ); image->users--; @@ -732,8 +732,8 @@ int image_create(char *image, int revision, uint64_t size) const int mapsize = IMGSIZE_TO_MAPBYTES(size); // Write files int fdImage = -1, fdCache = -1; - fdImage = open( path, O_RDWR | O_TRUNC | O_CREAT, 0640 ); - fdCache = open( cache, O_RDWR | O_TRUNC | O_CREAT, 0640 ); + fdImage = open( path, O_RDWR | O_TRUNC | O_CREAT, 0644 ); + fdCache = open( cache, O_RDWR | O_TRUNC | O_CREAT, 0644 ); if ( fdImage < 0 ) { memlogf( "[ERROR] Could not open %s for writing.", path ); goto failure_cleanup; @@ -798,7 +798,7 @@ dnbd3_image_t* image_getOrClone(char *name, uint16_t revision) || remoteCloneCache[i].deadline < now || strcmp( cmpname, remoteCloneCache[i].name ) != 0 ) continue; pthread_mutex_unlock( &remoteCloneLock ); // Was recently checked... - return NULL ; + return image_get( name, revision ); } // Re-check to prevent two clients at the same time triggering this image = image_get( name, revision ); @@ -821,7 +821,7 @@ dnbd3_image_t* image_getOrClone(char *name, uint16_t revision) uint16_t remoteVersion, remoteRid; uint64_t remoteImageSize; for (i = 0; i < count; ++i) { - int sock = sock_connect( &servers[i], 500, 1500 ); + int sock = sock_connect( &servers[i], 750, _uplinkTimeout ); if ( sock < 0 ) continue; if ( !dnbd3_select_image( sock, name, revision, FLAGS8_SERVER ) ) goto server_fail; char *remoteName; @@ -882,7 +882,7 @@ static int image_clone(int sock, char *name, uint16_t revision, uint64_t imageSi if ( lists_crc != masterCrc ) { memlogf( "[WARNING] OTF-Clone: Corrupted CRC-32 list. ignored. (%s)", name ); } else { - int fd = open( crcFile, O_WRONLY | O_CREAT, 0640 ); + int fd = open( crcFile, O_WRONLY | O_CREAT, 0644 ); write( fd, &lists_crc, sizeof(uint32_t) ); write( fd, crc32list, crc32len ); close( fd ); @@ -938,7 +938,7 @@ int image_generateCrcFile(char *image) close( fdImage ); return FALSE; } - int fdCrc = open( crcFile, O_RDWR | O_CREAT, 0640 ); + int fdCrc = open( crcFile, O_RDWR | O_CREAT, 0644 ); if ( fdCrc < 0 ) { printf( "Could not open CRC File %s for writing..\n", crcFile ); close( fdImage ); diff --git a/src/server/net.c b/src/server/net.c index 3e9383d..1d9d226 100644 --- a/src/server/net.c +++ b/src/server/net.c @@ -50,7 +50,7 @@ static inline char recv_request_header(int sock, dnbd3_request_t *request) int ret, fails = 0; // Read request header from socket while ( (ret = recv( sock, request, sizeof(*request), MSG_WAITALL )) != sizeof(*request) ) { - if ( ret >= 0 || ++fails > 10 ) return FALSE; + if ( ret >= 0 || ++fails > SOCKET_TIMEOUT_SERVER_RETRIES ) 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 ); -- cgit v1.2.3-55-g7522