From 9b1cfe9bc09fad8ed0a111ea7db6ebf21def19be Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 6 Aug 2019 11:46:56 +0200 Subject: [BENCH] Fix a couple bugs in stress tester --- src/bench/connection.c | 135 +++++++++++++++++++++++-------------------------- src/bench/connection.h | 2 +- src/bench/main.c | 15 +++--- 3 files changed, 70 insertions(+), 82 deletions(-) (limited to 'src/bench') diff --git a/src/bench/connection.c b/src/bench/connection.c index 129ae3c..2e40019 100644 --- a/src/bench/connection.c +++ b/src/bench/connection.c @@ -18,23 +18,10 @@ static const size_t SHORTBUF = 100; #define SOCKET_KEEPALIVE_TIMEOUT (3) #define MAX_ALTS (8) #define MAX_HOSTS_PER_ADDRESS (2) -// If a server wasn't reachable this many times, we slowly start skipping it on measurements -static const int FAIL_BACKOFF_START_COUNT = 8; #define RTT_COUNT (4) /* Module variables */ - -// Init guard -static bool connectionInitDone = false; -static bool keepRunning = true; - -static struct { - int sockFd; - pthread_mutex_t sendMutex; - dnbd3_signal_t* panicSignal; - dnbd3_host_t currentServer; - uint64_t startupTime; -} connection; +static char trash[4096]; // Known alt servers typedef struct _alt_server { @@ -54,13 +41,13 @@ bool connection_init_n_times( const char *lowerImage, const uint16_t rid, int ntimes, - BenchCounters* counters, - bool closeSockets + BenchCounters* counters ) { for (int run_i = 0; run_i < ntimes; ++run_i) { counters->attempts++; - printf("."); + putchar('.'); + fflush(stdout); int sock = -1; char host[SHORTBUF]; serialized_buffer_t buffer; @@ -68,66 +55,70 @@ bool connection_init_n_times( char *remoteName; uint64_t remoteSize; - if ( !connectionInitDone && keepRunning ) { - dnbd3_host_t tempHosts[MAX_HOSTS_PER_ADDRESS]; - const char *current, *end; - int altIndex = 0; - memset( altservers, 0, sizeof altservers ); - connection.sockFd = -1; - current = hosts; - do { - // Get next host from string - while ( *current == ' ' ) current++; - end = strchr( current, ' ' ); - size_t len = (end == NULL ? SHORTBUF : (size_t)( end - current ) + 1); - if ( len > SHORTBUF ) len = SHORTBUF; - snprintf( host, len, "%s", current ); - int newHosts = sock_resolveToDnbd3Host( host, tempHosts, MAX_HOSTS_PER_ADDRESS ); - for ( int i = 0; i < newHosts; ++i ) { - if ( altIndex >= MAX_ALTS ) - break; - altservers[altIndex].host = tempHosts[i]; - altIndex += 1; - } - current = end + 1; - } while ( end != NULL && altIndex < MAX_ALTS ); - logadd( LOG_INFO, "Got %d servers from init call", altIndex ); - // Connect - for ( int i = 0; i < altIndex; ++i ) { - if ( altservers[i].host.type == 0 ) - continue; - // Try to connect - sock = sock_connect( &altservers[i].host, 500, SOCKET_KEEPALIVE_TIMEOUT * 1000 ); - if ( sock == -1 ) { - counters->fails++; - logadd( LOG_ERROR, "Could not connect to host" ); - } else if ( !dnbd3_select_image( sock, lowerImage, rid, 0 ) ) { - counters->fails++; - logadd( LOG_ERROR, "Could not send select image" ); - } else if ( !dnbd3_select_image_reply( &buffer, sock, &remoteVersion, &remoteName, &remoteRid, &remoteSize ) ) { - counters->fails++; - logadd( LOG_ERROR, "Could not read select image reply (%d)", errno ); - } else if ( rid != 0 && rid != remoteRid ) { - counters->fails++; - logadd( LOG_ERROR, "rid mismatch" ); - } else { - counters->success++; + dnbd3_host_t tempHosts[MAX_HOSTS_PER_ADDRESS]; + const char *current, *end; + int altIndex = 0; + memset( altservers, 0, sizeof altservers ); + current = hosts; + do { + // Get next host from string + while ( *current == ' ' ) current++; + end = strchr( current, ' ' ); + size_t len = (end == NULL ? SHORTBUF : (size_t)( end - current ) + 1); + if ( len > SHORTBUF ) len = SHORTBUF; + snprintf( host, len, "%s", current ); + int newHosts = sock_resolveToDnbd3Host( host, tempHosts, MAX_HOSTS_PER_ADDRESS ); + for ( int i = 0; i < newHosts; ++i ) { + if ( altIndex >= MAX_ALTS ) break; - } - // Failed - logadd( LOG_DEBUG1, "Server does not offer requested image... " ); - if ( sock != -1 ) { - close( sock ); - sock = -1; - } + altservers[altIndex].host = tempHosts[i]; + altIndex += 1; } + current = end + 1; + } while ( end != NULL && altIndex < MAX_ALTS ); + // Connect + for ( int i = 0; i < altIndex; ++i ) { + if ( altservers[i].host.type == 0 ) + continue; + // Try to connect + dnbd3_reply_t reply; + sock = sock_connect( &altservers[i].host, 500, SOCKET_KEEPALIVE_TIMEOUT * 1000 ); + if ( sock == -1 ) { + counters->fails++; + logadd( LOG_ERROR, "Could not connect to host" ); + } else if ( !dnbd3_select_image( sock, lowerImage, rid, 0 ) ) { + counters->fails++; + logadd( LOG_ERROR, "Could not send select image" ); + } else if ( !dnbd3_select_image_reply( &buffer, sock, &remoteVersion, &remoteName, &remoteRid, &remoteSize ) ) { + counters->fails++; + logadd( LOG_ERROR, "Could not read select image reply (%d)", errno ); + } else if ( rid != 0 && rid != remoteRid ) { + counters->fails++; + logadd( LOG_ERROR, "rid mismatch" ); + } else if ( !dnbd3_get_block( sock, run_i * 4096, 4096, 0, 0 ) ) { + counters->fails++; + logadd( LOG_ERROR, "send: get block failed" ); + } else if ( !dnbd3_get_reply( sock, &reply ) ) { + counters->fails++; + logadd( LOG_ERROR, "recv: get block header failed" ); + } else if ( recv( sock, trash, sizeof(trash), 0 ) != sizeof(trash) ) { + counters->fails++; + logadd( LOG_ERROR, "recv: get block payload failed" ); + } else { + counters->success++; + close( sock ); + sock = -1; + continue; + } + // Failed if ( sock != -1 ) { - // connectionInitDone = true; - if (closeSockets) { - close( sock ); - } + close( sock ); + sock = -1; } } + if ( sock != -1 ) { + close( sock ); + } } return true; } diff --git a/src/bench/connection.h b/src/bench/connection.h index 9cb59ef..ff71e15 100644 --- a/src/bench/connection.h +++ b/src/bench/connection.h @@ -19,7 +19,7 @@ typedef struct _dnbd3_async { } dnbd3_async_t; -bool connection_init_n_times(const char *hosts, const char *image, const uint16_t rid, int ntimes, BenchCounters* counters, bool closeSockets); +bool connection_init_n_times(const char *hosts, const char *image, const uint16_t rid, int ntimes, BenchCounters* counters); bool connection_init(const char *hosts, const char *image, const uint16_t rid); diff --git a/src/bench/main.c b/src/bench/main.c index 2f32dbf..c86af81 100644 --- a/src/bench/main.c +++ b/src/bench/main.c @@ -31,8 +31,6 @@ static void printUsage(char *argv0, int exitCode) printf( " -n --runs Number of connection attempts per thread\n" ); printf( " -t --threads number of threads\n" ); printf( " -l --log Write log to given location\n" ); - printf( " -d --debug Don't fork and print debug output (fuse > stderr, dnbd3 > stdout)\n" ); - // // fuse_main( 2, arg, &dnbd3_fuse_no_operations, NULL ); exit( exitCode ); } @@ -41,8 +39,8 @@ static const struct option longOpts[] = { { "host", required_argument, NULL, 'h' }, { "image", required_argument, NULL, 'i' }, { "nruns", optional_argument, NULL, 'n' }, - { "threads", optional_argument, NULL, 't' }, - { "help", optional_argument, NULL, 'H' }, + { "threads", required_argument, NULL, 't' }, + { "help", required_argument, NULL, 'H' }, { "version", no_argument, NULL, 'v' }, { 0, 0, 0, 0 } }; @@ -59,11 +57,10 @@ void* runBenchThread(void* t) { BenchThreadData* data = t; connection_init_n_times( data->server_address, - data->server_address, + data->image_name, 0, data->runs, - data->counter, - data->closeSockets); + data->counter); printf("Thread #%d finished\n", data->threadNumber); return NULL; } @@ -85,10 +82,10 @@ int main(int argc, char *argv[]) while ( ( opt = getopt_long( argc, argv, optString, longOpts, &lidx ) ) != -1 ) { switch ( opt ) { case 'h': - server_address = optarg; + server_address = strdup(optarg); break; case 'i': - image_Name = optarg; + image_Name = strdup(optarg); break; case 'n': n_runs = atoi(optarg); -- cgit v1.2.3-55-g7522 From 9f5a61cc018831e33161d44ff940f59105b792e3 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 6 Aug 2019 14:04:58 +0200 Subject: [BENCH] Increase timeouts, fix block payload reading --- src/bench/connection.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/bench') diff --git a/src/bench/connection.c b/src/bench/connection.c index 2e40019..03ad9e5 100644 --- a/src/bench/connection.c +++ b/src/bench/connection.c @@ -82,10 +82,10 @@ bool connection_init_n_times( continue; // Try to connect dnbd3_reply_t reply; - sock = sock_connect( &altservers[i].host, 500, SOCKET_KEEPALIVE_TIMEOUT * 1000 ); + sock = sock_connect( &altservers[i].host, 3500, 10000 ); if ( sock == -1 ) { counters->fails++; - logadd( LOG_ERROR, "Could not connect to host" ); + logadd( LOG_ERROR, "Could not connect to host (errno=%d)", errno ); } else if ( !dnbd3_select_image( sock, lowerImage, rid, 0 ) ) { counters->fails++; logadd( LOG_ERROR, "Could not send select image" ); @@ -101,7 +101,7 @@ bool connection_init_n_times( } else if ( !dnbd3_get_reply( sock, &reply ) ) { counters->fails++; logadd( LOG_ERROR, "recv: get block header failed" ); - } else if ( recv( sock, trash, sizeof(trash), 0 ) != sizeof(trash) ) { + } else if ( recv( sock, trash, sizeof(trash), MSG_WAITALL|MSG_NOSIGNAL ) != sizeof(trash) ) { counters->fails++; logadd( LOG_ERROR, "recv: get block payload failed" ); } else { -- cgit v1.2.3-55-g7522 From bd0a4d66acaf8ebf6388f6304a90b39434e9e36a Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 7 Aug 2019 14:48:55 +0200 Subject: [BENCH] Allow specifying request block size --- src/bench/connection.c | 28 ++++++++++++++++++++-------- src/bench/connection.h | 2 +- src/bench/helper.h | 1 + src/bench/main.c | 20 ++++++++++---------- 4 files changed, 32 insertions(+), 19 deletions(-) (limited to 'src/bench') diff --git a/src/bench/connection.c b/src/bench/connection.c index 03ad9e5..ce9438a 100644 --- a/src/bench/connection.c +++ b/src/bench/connection.c @@ -41,6 +41,7 @@ bool connection_init_n_times( const char *lowerImage, const uint16_t rid, int ntimes, + int blockSize, BenchCounters* counters ) { for (int run_i = 0; run_i < ntimes; ++run_i) { @@ -95,20 +96,31 @@ bool connection_init_n_times( } else if ( rid != 0 && rid != remoteRid ) { counters->fails++; logadd( LOG_ERROR, "rid mismatch" ); - } else if ( !dnbd3_get_block( sock, run_i * 4096, 4096, 0, 0 ) ) { + } else if ( !dnbd3_get_block( sock, run_i * blockSize, blockSize, 0, 0 ) ) { counters->fails++; logadd( LOG_ERROR, "send: get block failed" ); } else if ( !dnbd3_get_reply( sock, &reply ) ) { counters->fails++; logadd( LOG_ERROR, "recv: get block header failed" ); - } else if ( recv( sock, trash, sizeof(trash), MSG_WAITALL|MSG_NOSIGNAL ) != sizeof(trash) ) { - counters->fails++; - logadd( LOG_ERROR, "recv: get block payload failed" ); } else { - counters->success++; - close( sock ); - sock = -1; - continue; + int rv, togo = blockSize; + do { + rv = recv( sock, trash, MIN( sizeof(trash), togo ), MSG_WAITALL|MSG_NOSIGNAL ); + if ( rv == -1 && errno == EINTR ) + continue; + if ( rv <= 0 ) + break; + togo -= rv; + } while ( togo > 0 ); + if ( togo != 0 ) { + counters->fails++; + logadd( LOG_ERROR, "recv: get block payload failed (remaining %d)", togo ); + } else { + counters->success++; + close( sock ); + sock = -1; + continue; + } } // Failed if ( sock != -1 ) { diff --git a/src/bench/connection.h b/src/bench/connection.h index ff71e15..69207ff 100644 --- a/src/bench/connection.h +++ b/src/bench/connection.h @@ -19,7 +19,7 @@ typedef struct _dnbd3_async { } dnbd3_async_t; -bool connection_init_n_times(const char *hosts, const char *image, const uint16_t rid, int ntimes, BenchCounters* counters); +bool connection_init_n_times(const char *hosts, const char *image, const uint16_t rid, int ntimes, int blockSize, BenchCounters* counters); bool connection_init(const char *hosts, const char *image, const uint16_t rid); diff --git a/src/bench/helper.h b/src/bench/helper.h index 8342a79..e0c0262 100644 --- a/src/bench/helper.h +++ b/src/bench/helper.h @@ -29,6 +29,7 @@ typedef struct BenchThreadData { char* server_address; char * image_name; int runs; + int bs; int threadNumber; bool closeSockets; } BenchThreadData; diff --git a/src/bench/main.c b/src/bench/main.c index c86af81..f8c55c3 100644 --- a/src/bench/main.c +++ b/src/bench/main.c @@ -17,10 +17,6 @@ #define debugf(...) do { logadd( LOG_DEBUG1, __VA_ARGS__ ); } while (0) -/* Debug/Benchmark variables */ -static bool useDebug = false; - - static void printUsage(char *argv0, int exitCode) { printf( "Usage: %s [--debug] --host --image [--rid revision]\n", argv0 ); @@ -30,17 +26,18 @@ static void printUsage(char *argv0, int exitCode) printf( " -r --rid Revision to use (omit or pass 0 for latest)\n" ); printf( " -n --runs Number of connection attempts per thread\n" ); printf( " -t --threads number of threads\n" ); - printf( " -l --log Write log to given location\n" ); + printf( " -b --blocksize Size of blocks to request (def. 4096)\n" ); exit( exitCode ); } -static const char *optString = "h:i:n:t:HvVd"; +static const char *optString = "b:h:i:n:t:Hv"; static const struct option longOpts[] = { { "host", required_argument, NULL, 'h' }, { "image", required_argument, NULL, 'i' }, { "nruns", optional_argument, NULL, 'n' }, { "threads", required_argument, NULL, 't' }, - { "help", required_argument, NULL, 'H' }, + { "blocksize", required_argument, NULL, 'b' }, + { "help", no_argument, NULL, 'H' }, { "version", no_argument, NULL, 'v' }, { 0, 0, 0, 0 } }; @@ -60,6 +57,7 @@ void* runBenchThread(void* t) { data->image_name, 0, data->runs, + data->bs, data->counter); printf("Thread #%d finished\n", data->threadNumber); return NULL; @@ -74,6 +72,7 @@ int main(int argc, char *argv[]) bool closeSockets = false; int n_runs = 100; int n_threads = 1; + int bs = 4096; if ( argc <= 1 || strcmp( argv[1], "--help" ) == 0 || strcmp( argv[1], "--usage" ) == 0 ) { printUsage( argv[0], 0 ); @@ -93,15 +92,15 @@ int main(int argc, char *argv[]) case 't': n_threads = atoi(optarg); break; + case 'b': + bs = atoi(optarg); + break; case 'c': closeSockets = true; break; case 'H': printUsage( argv[0], 0 ); break; - case 'd': - useDebug = true; - break; default: printUsage( argv[0], EXIT_FAILURE ); } @@ -123,6 +122,7 @@ int main(int argc, char *argv[]) server_address, image_Name, n_runs, + bs, i, closeSockets}; threadData[i] = tmp2; -- cgit v1.2.3-55-g7522 From 64348f92494484c69e182f41d3d13e419632e30e Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 23 Aug 2019 12:31:21 +0200 Subject: [BENCH] Check CMD_GET_BLOCK reply cmd type --- src/bench/connection.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/bench') diff --git a/src/bench/connection.c b/src/bench/connection.c index ce9438a..498bc62 100644 --- a/src/bench/connection.c +++ b/src/bench/connection.c @@ -102,6 +102,9 @@ bool connection_init_n_times( } else if ( !dnbd3_get_reply( sock, &reply ) ) { counters->fails++; logadd( LOG_ERROR, "recv: get block header failed" ); + } else if ( reply.cmd != CMD_GET_BLOCK ) { + counters->fails++; + logadd( LOG_ERROR, "recv: get block reply is not CMD_GET_BLOCK" ); } else { int rv, togo = blockSize; do { -- cgit v1.2.3-55-g7522 From 8d2c5cae4bd68d7015a438ca6f1c23a02f2f8203 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 29 Aug 2019 14:48:12 +0200 Subject: [BENCH] Request random blocks --- src/bench/connection.c | 5 +++-- src/bench/connection.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src/bench') diff --git a/src/bench/connection.c b/src/bench/connection.c index 498bc62..26be440 100644 --- a/src/bench/connection.c +++ b/src/bench/connection.c @@ -41,7 +41,7 @@ bool connection_init_n_times( const char *lowerImage, const uint16_t rid, int ntimes, - int blockSize, + uint64_t blockSize, BenchCounters* counters ) { for (int run_i = 0; run_i < ntimes; ++run_i) { @@ -96,7 +96,8 @@ bool connection_init_n_times( } else if ( rid != 0 && rid != remoteRid ) { counters->fails++; logadd( LOG_ERROR, "rid mismatch" ); - } else if ( !dnbd3_get_block( sock, run_i * blockSize, blockSize, 0, 0 ) ) { + //} else if ( !dnbd3_get_block( sock, run_i * blockSize, blockSize, 0, 0 ) ) { + } else if ( !dnbd3_get_block( sock, (((uint64_t)rand()) << 16 + rand()) % (remoteSize - blockSize), blockSize, 0, 0 ) ) { counters->fails++; logadd( LOG_ERROR, "send: get block failed" ); } else if ( !dnbd3_get_reply( sock, &reply ) ) { diff --git a/src/bench/connection.h b/src/bench/connection.h index 69207ff..770bf0d 100644 --- a/src/bench/connection.h +++ b/src/bench/connection.h @@ -19,7 +19,7 @@ typedef struct _dnbd3_async { } dnbd3_async_t; -bool connection_init_n_times(const char *hosts, const char *image, const uint16_t rid, int ntimes, int blockSize, BenchCounters* counters); +bool connection_init_n_times(const char *hosts, const char *image, const uint16_t rid, int ntimes, uint64_t blockSize, BenchCounters* counters); bool connection_init(const char *hosts, const char *image, const uint16_t rid); -- cgit v1.2.3-55-g7522 From 94608a6297bd959dd0b2fd03ddaf7484a4bcc5d8 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Mon, 23 Mar 2020 11:33:13 +0100 Subject: [BENCH] fix wrong operator precedence --- src/bench/connection.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/bench') diff --git a/src/bench/connection.c b/src/bench/connection.c index 26be440..65f1757 100644 --- a/src/bench/connection.c +++ b/src/bench/connection.c @@ -97,7 +97,7 @@ bool connection_init_n_times( counters->fails++; logadd( LOG_ERROR, "rid mismatch" ); //} else if ( !dnbd3_get_block( sock, run_i * blockSize, blockSize, 0, 0 ) ) { - } else if ( !dnbd3_get_block( sock, (((uint64_t)rand()) << 16 + rand()) % (remoteSize - blockSize), blockSize, 0, 0 ) ) { + } else if ( !dnbd3_get_block( sock, (((uint64_t)rand() << 16) + rand()) % (remoteSize - blockSize), blockSize, 0, 0 ) ) { counters->fails++; logadd( LOG_ERROR, "send: get block failed" ); } else if ( !dnbd3_get_reply( sock, &reply ) ) { -- cgit v1.2.3-55-g7522