summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Rettberg2013-11-10 21:30:24 +0100
committerSimon Rettberg2013-11-10 21:30:24 +0100
commit6a6a0e03482a7a799d2bc9ac3440b81d0780547a (patch)
tree3bc87bdf03109d4e46e90c283f21991217216b10 /src
parentRemove outdated and invalid example configs (diff)
downloaddnbd3-6a6a0e03482a7a799d2bc9ac3440b81d0780547a.tar.gz
dnbd3-6a6a0e03482a7a799d2bc9ac3440b81d0780547a.tar.xz
dnbd3-6a6a0e03482a7a799d2bc9ac3440b81d0780547a.zip
[SERVER] Minor tweaks here and there
Diffstat (limited to 'src')
-rw-r--r--src/config.h17
-rw-r--r--src/kernel/blk.c13
-rw-r--r--src/server/altservers.c2
-rw-r--r--src/server/globals.c2
-rw-r--r--src/server/globals.h5
-rw-r--r--src/server/image.c14
-rw-r--r--src/server/net.c2
7 files changed, 26 insertions, 29 deletions
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 );