From 46ce1b0cc7b231396b69c4ba53800ff0d9e56cd0 Mon Sep 17 00:00:00 2001 From: Wouter Verhelst Date: Mon, 9 Aug 2010 13:52:00 -0400 Subject: [PATCH] Extend test suite and fix named exports --- Makefile.am | 3 +- nbd-server.c | 14 +++++++-- nbd-tester-client.c | 80 ++++++++++++++++++++++++++++----------------------- simple_test | 32 +++++++-------------- 4 files changed, 69 insertions(+), 60 deletions(-) diff --git a/Makefile.am b/Makefile.am index fafbfac..fed359c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ bin_PROGRAMS = nbd-server EXTRA_PROGRAMS = nbd-client knbd-client TESTS_ENVIRONMENT=$(srcdir)/simple_test -TESTS = cmd cfg1 cfgmulti +TESTS = cmd cfg1 cfgmulti cfgnew check_PROGRAMS = nbd-tester-client knbd_client_SOURCES = nbd-client.c cliserv.h nbd_client_SOURCES = nbd-client.c cliserv.h @@ -28,3 +28,4 @@ dist-hook: cmd: cfg1: cfgmulti: +cfgnew: diff --git a/nbd-server.c b/nbd-server.c index ea446db..844e416 100644 --- a/nbd-server.c +++ b/nbd-server.c @@ -1232,14 +1232,17 @@ CLIENT* negotiate(int net, CLIENT *client, GArray* servers) { memset(zeros, '\0', sizeof(zeros)); if(!client || !client->modern) { + /* common */ if (write(net, INIT_PASSWD, 8) < 0) { err_nonfatal("Negotiation failed: %m"); if(client) exit(EXIT_FAILURE); } - if(client && client->modern) { + if(!client || client->modern) { + /* modern */ magic = htonll(opts_magic); } else { + /* oldstyle */ magic = htonll(cliserv_magic); } if (write(net, &magic, sizeof(magic)) < 0) { @@ -1249,6 +1252,7 @@ CLIENT* negotiate(int net, CLIENT *client, GArray* servers) { } } if(!client) { + /* modern */ uint32_t reserved; uint32_t opt; uint32_t namelen; @@ -1274,7 +1278,7 @@ CLIENT* negotiate(int net, CLIENT *client, GArray* servers) { read(net, &namelen, sizeof(namelen)); namelen = ntohl(namelen); name = malloc(namelen+1); - name[namelen+1]=0; + name[namelen]=0; read(net, name, namelen); for(i=0; ilen; i++) { SERVER* serve = &(g_array_index(servers, SERVER, i)); @@ -1287,23 +1291,28 @@ CLIENT* negotiate(int net, CLIENT *client, GArray* servers) { return client; } } + return NULL; } + /* common */ size_host = htonll((u64)(client->exportsize)); if (write(net, &size_host, 8) < 0) err("Negotiation failed: %m"); if (client->server->flags & F_READONLY) flags |= NBD_FLAG_READ_ONLY; if (!client->modern) { + /* oldstyle */ flags = htonl(flags); if (write(client->net, &flags, 4) < 0) err("Negotiation failed: %m"); } else { + /* modern */ smallflags = (uint16_t)(flags & ~((uint16_t)0)); smallflags = htons(smallflags); if (write(client->net, &smallflags, sizeof(smallflags)) < 0) { err("Negotiation failed: %m"); } } + /* common */ if (write(client->net, zeros, 124) < 0) err("Negotiation failed: %m"); return NULL; @@ -1707,6 +1716,7 @@ int serveloop(GArray* servers) { if(!client) { err_nonfatal("negotiation failed"); close(net); + net=0; } } for(i=0;ilen && !net;i++) { diff --git a/nbd-tester-client.c b/nbd-tester-client.c index 8572f29..3169ab1 100644 --- a/nbd-tester-client.c +++ b/nbd-tester-client.c @@ -40,6 +40,8 @@ static gchar errstr[1024]; const static int errstr_len=1024; +static uint64_t size; + typedef enum { CONNECTION_TYPE_NONE, CONNECTION_TYPE_CONNECT, @@ -69,12 +71,14 @@ inline int read_all(int f, void *buf, size_t len) { return retval; } -int setup_connection(gchar *hostname, int port, CONNECTION_TYPE ctype) { +int setup_connection(gchar *hostname, int port, gchar* name, CONNECTION_TYPE ctype) { int sock; struct hostent *host; struct sockaddr_in addr; char buf[256]; + uint64_t mymagic = (name ? opts_magic : cliserv_magic); u64 tmp64; + uint32_t tmp32 = 0; sock=0; if(ctype ", (int)getpid(), argv[0]); + g_message("%d: Or: %s -N ", (int)getpid(), argv[0]); exit(EXIT_FAILURE); } logging(); hostname=g_strdup(argv[1]); - p=(strtol(argv[2], NULL, 0)); - if(p==LONG_MIN||p==LONG_MAX) { - g_critical("Could not parse port number: %s", strerror(errno)); - exit(EXIT_FAILURE); + if(!strncmp(argv[2], "-N", 2)) { + name = g_strdup(argv[3]); + p = 10809; + } else { + p=(strtol(argv[2], NULL, 0)); + if(p==LONG_MIN||p==LONG_MAX) { + g_critical("Could not parse port number: %s", strerror(errno)); + exit(EXIT_FAILURE); + } } port=(int)p; - if(throughput_test(hostname, port, sock, FALSE, TRUE)<0) { + if(throughput_test(hostname, port, name, sock, FALSE, TRUE)<0) { g_warning("Could not run throughput test: %s", errstr); exit(EXIT_FAILURE); } diff --git a/simple_test b/simple_test index 9bd3d07..d7a698c 100755 --- a/simple_test +++ b/simple_test @@ -3,6 +3,8 @@ tmpnam=`mktemp` +ulimit -c unlimited + # Create a one-meg device dd if=/dev/zero of=$tmpnam bs=1024 count=1024 @@ -50,6 +52,7 @@ EOF exportname = $tmpnam port = 11114 readonly = true + listenaddr = 127.0.0.1 EOF ./nbd-server -C nbd-server.conf -p `pwd`/nbd-server.pid & PID=$! @@ -65,7 +68,10 @@ EOF else kill $PID fi - rm -f $tmpnam nbd-server.conf + if [ -z "$2" ] + then + rm -f $tmpnam nbd-server.conf + fi exit $retval fi ./nbd-tester-client localhost 11114 @@ -77,31 +83,12 @@ EOF [generic] [export1] exportname = $tmpnam - copyonwrite = true - listenaddr = 127.0.0.1 -[export2] - exportname = $tmpnam - readonly = true EOF ./nbd-server -C nbd-server.conf -p `pwd`/nbd-server.pid & PID=$! sleep 1 ./nbd-tester-client localhost -N export1 retval=$? - if [ $retval -ne 0 ] - then - if [ -f nbd-server.pid ] - then - kill `cat nbd-server.pid` - rm -f nbd-server.pid - else - kill $PID - fi - rm -f $tmpnam nbd-server.conf - exit $retval - fi - ./nbd-tester-client localhost -N export2 - retval=$? ;; *) echo "E: unknown test $1" @@ -115,8 +102,11 @@ then else kill $PID fi +if [ -z "$2" ] +then + rm -f $tmpnam nbd-server.conf +fi if [ $retval -ne 0 ] then exit $retval fi -rm -f $tmpnam nbd-server.conf -- 1.7.10.4