From 43e57ce5e11e9052f5a7db66f2e8613f1784f919 Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Tue, 25 Jun 2019 17:03:28 +0200 Subject: first version of dnbd3-ng --- src/bench/main.c | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 src/bench/main.c (limited to 'src/bench/main.c') diff --git a/src/bench/main.c b/src/bench/main.c new file mode 100644 index 0000000..2f32dbf --- /dev/null +++ b/src/bench/main.c @@ -0,0 +1,154 @@ +/* +* Butchered from the dnbd3-fuse by C.K. +**/ + +#include "connection.h" +#include "helper.h" +#include "../shared/protocol.h" +#include "../shared/log.h" + +#include +#include +#include +#include +#include +#include + +#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 ); + printf( "Or: %s [-d] -h -i [-r revision]\n", argv0 ); + printf( " -h --host List of space separated hosts to use\n" ); + printf( " -i --image Remote image name to request\n" ); + 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( " -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 ); +} + +static const char *optString = "h:i:n:t:HvVd"; +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' }, + { "version", no_argument, NULL, 'v' }, + { 0, 0, 0, 0 } +}; + + +static void printBenchCounters(BenchCounters* c) { + printf ("Attempts:\t%d\n", c->attempts); + printf ("Success :\t%d\n", c->success); + printf ("Fails :\t%d\n", c->fails); +} + + +void* runBenchThread(void* t) { + BenchThreadData* data = t; + connection_init_n_times( + data->server_address, + data->server_address, + 0, + data->runs, + data->counter, + data->closeSockets); + printf("Thread #%d finished\n", data->threadNumber); + return NULL; +} + +int main(int argc, char *argv[]) +{ + char *server_address = NULL; + char *image_Name = NULL; + int opt, lidx; + + bool closeSockets = false; + int n_runs = 100; + int n_threads = 1; + + if ( argc <= 1 || strcmp( argv[1], "--help" ) == 0 || strcmp( argv[1], "--usage" ) == 0 ) { + printUsage( argv[0], 0 ); + } + + while ( ( opt = getopt_long( argc, argv, optString, longOpts, &lidx ) ) != -1 ) { + switch ( opt ) { + case 'h': + server_address = optarg; + break; + case 'i': + image_Name = optarg; + break; + case 'n': + n_runs = atoi(optarg); + break; + case 't': + n_threads = 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 ); + } + } + + printf("Welcome to dnbd3 benchmark tool\n"); + + /* all counters */ + BenchCounters counters[n_threads]; + BenchThreadData threadData[n_threads]; + pthread_t threads[n_threads]; + + /* create all threads */ + for (int i = 0; i < n_threads; i++) { + BenchCounters tmp1 = {0,0,0}; + counters[i] = tmp1; + BenchThreadData tmp2 = { + &(counters[i]), + server_address, + image_Name, + n_runs, + i, + closeSockets}; + threadData[i] = tmp2; + pthread_create(&(threads[i]), NULL, runBenchThread, &(threadData[i])); + } + + + /* join all threads*/ + for (int i = 0; i < n_threads; ++i) { + pthread_join(threads[i], NULL); + } + + /* print out all counters & sum up */ + BenchCounters total = {0,0,0}; + for (int i = 0; i < n_threads; ++i) { + printf("#### Thread %d\n", i); + printBenchCounters(&counters[i]); + total.attempts += counters[i].attempts; + total.success += counters[i].success; + total.fails += counters[i].fails; + } + /* print out summary */ + printf("\n\n#### SUMMARY\n"); + printBenchCounters(&total); + printf("\n-- End of program"); +} -- cgit v1.2.3-55-g7522