[dbench @ tridge@samba.org-20070715124531-g2327o7r0y3eo3q1]
authorAndrew Tridgell <tridge@samba.org>
Sun, 15 Jul 2007 12:45:31 +0000 (22:45 +1000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 15 Jul 2007 12:45:31 +0000 (22:45 +1000)
convert to popt

Makefile.in
child.c
dbench.c
dbench.h
fileio.c
sockio.c
socklib.c
tbench_srv.c

index 2560ea722f4efe1622a50b80b5672a760678285e..ad885e2179dd21c76876368bb436127243934490 100644 (file)
@@ -1,4 +1,4 @@
-VERSION=3.04
+VERSION=4.00
 
 srcdir=@srcdir@
 VPATH=@srcdir@
@@ -9,7 +9,7 @@ bindir=@bindir@
 mandir=@mandir@
 datadir=@datadir@
 INSTALLCMD=@INSTALL@
-LIBS=@LIBS@
+LIBS=@LIBS@ -lpopt
 
 CC=@CC@
 CFLAGS=@CFLAGS@ -I. -DVERSION=\"$(VERSION)\" -DDATADIR=\"$(datadir)\"
diff --git a/child.c b/child.c
index c35abe4e77e6899cf5b571dfc8b36dd5daaf7745..a9e2641696cff13ff8176f9c143eebb674e24f11 100644 (file)
--- a/child.c
+++ b/child.c
@@ -87,7 +87,6 @@ void child_run(struct child_struct *child, const char *loadfile)
        char *fname2 = NULL;
        FILE *f = fopen(loadfile, "r");
        pid_t parent = getppid();
-       extern double targetrate;
        double targett;
 
        child->line = 0;
@@ -139,8 +138,8 @@ again:
                        targett = 0.0;
                }
 
-               if (targetrate != 0 || targett == 0.0) {
-                       nb_target_rate(child, targetrate);
+               if (options.targetrate != 0 || targett == 0.0) {
+                       nb_target_rate(child, options.targetrate);
                } else {
                        nb_time_delay(child, targett);
                }
index d23a61d0757b2a9b485ddc129d480143af7591fb..660286d7fb2a0a13ce57d2d19ba15d7723568613 100644 (file)
--- a/dbench.c
+++ b/dbench.c
@@ -1,3 +1,7 @@
+/*
+  show max/avg latency for each operation
+ */
+
 /* 
    Copyright (C) by Andrew Tridgell <tridge@samba.org> 1999, 2001
    Copyright (C) 2001 by Martin Pool <mbp@samba.org>
    can choose what kind it wants for each OPEN operation. */
 
 #include "dbench.h"
+#include "popt.h"
 #include <sys/sem.h>
 
-int sync_open = 0, do_fsync = 0, sync_dirs = 0;
-char *tcp_options = TCP_OPTIONS;
-static int timelimit = 600, warmup;
-static const char *directory = ".";
-static char *loadfile = DATADIR "/client.txt";
+struct options options = {
+       .timelimit        = 600,
+       .loadfile         = DATADIR "/client.txt",
+       .directory        = ".",
+       .tcp_options      = TCP_OPTIONS,
+       .nprocs           = 10,
+       .sync_open        = 0,
+       .sync_dirs        = 0,
+       .do_fsync         = 0,
+       .fsync_frequency  = 0,
+       .warmup           = -1,
+       .targetrate       = 0.0,
+       .ea_enable        = 0
+};
+
 static struct timeval tv_start;
 static struct timeval tv_end;
 static int barrier=-1;
-double targetrate;
-
-#if HAVE_EA_SUPPORT
-int ea_enable=0;
-#endif
 
 static FILE *open_loadfile(void)
 {
        FILE            *f;
 
-       if ((f = fopen(loadfile, "rt")) != NULL)
+       if ((f = fopen(options.loadfile, "rt")) != NULL)
                return f;
 
        fprintf(stderr,
-               "dbench: error opening '%s': %s\n", loadfile,
+               "dbench: error opening '%s': %s\n", options.loadfile,
                strerror(errno));
 
        return NULL;
@@ -88,17 +98,17 @@ static void sig_alarm(int sig)
 
        t = timeval_elapsed(&tv_start);
 
-       if (!in_warmup && warmup>0 && t > warmup) {
+       if (!in_warmup && options.warmup>0 && t > options.warmup) {
                tv_start = tnow;
-               warmup = 0;
+               options.warmup = 0;
                for (i=0;i<nprocs;i++) {
                        children[i].bytes_done_warmup = children[i].bytes;
                }
                goto next;
        }
-       if (t < warmup) {
+       if (t < options.warmup) {
                in_warmup = 1;
-       } else if (!in_warmup && !in_cleanup && t > timelimit) {
+       } else if (!in_warmup && !in_cleanup && t > options.timelimit) {
                for (i=0;i<nprocs;i++) {
                        children[i].done = 1;
                }
@@ -171,7 +181,7 @@ static void create_procs(int nprocs, void (*fn)(struct child_struct *, const cha
                children[i].id = i;
                children[i].nprocs = nprocs;
                children[i].cleanup = 0;
-               children[i].directory = directory;
+               children[i].directory = options.directory;
                children[i].starttime = timeval_current();
        }
 
@@ -204,7 +214,7 @@ static void create_procs(int nprocs, void (*fn)(struct child_struct *, const cha
 
                        semctl(barrier,0,IPC_RMID);
 
-                       fn(&children[i], loadfile);
+                       fn(&children[i], options.loadfile);
                        _exit(0);
                }
        }
@@ -274,98 +284,94 @@ static void show_usage(void)
 
 
 
-static int process_opts(int argc, char **argv,
-                       int *nprocs)
+static int process_opts(int argc, const char **argv)
 {
-       int c;
-       extern int sync_open;
-       extern char *server;
-       
-       targetrate = 0;
-
-       while ((c = getopt(argc, argv, "vc:sST:t:xD:R:F")) != -1) 
-               switch (c) {
-               case 'c':
-                       loadfile = optarg;
-                       break;
-               case 's':
-                       sync_open = 1;
-                       break;
-               case 'F':
-                       do_fsync = 1;
-                       break;
-               case 'S':
-                       sync_dirs = 1;
-                       break;
-               case 'T':
-                       tcp_options = optarg;
-                       break;
-               case 't':
-                       timelimit = atoi(optarg);
-                       break;
-               case 'D':
-                       directory = optarg;
-                       break;
-               case 'v':
-                       exit(0);
-                       break;
-               case 'R':
-                       targetrate = strtod(optarg, NULL);
-                       break;
-               case 'x':
-
-#if HAVE_EA_SUPPORT
-                       ea_enable = 1;
-#else
-                       printf("EA suppport not compiled in\n");
-                       exit(1);
-#endif
-                       break;
-               case '?':
-                       if (isprint (optopt))
-                               fprintf (stderr, "Unknown option `-%c'.\n", optopt);
-                       else
-                               fprintf (stderr,
-                                        "Unknown option character `\\x%x'.\n",
-                                        optopt);
-                       return 0;
+       const char **extra_argv;
+       int extra_argc = 0;
+       struct poptOption popt_options[] = {
+               POPT_AUTOHELP
+               { "timelimit", 't', POPT_ARG_INT, &options.timelimit, 0, 
+                 "timelimit", "integer" },
+               { "loadfile",  'c', POPT_ARG_STRING, &options.loadfile, 0, 
+                 "loadfile", "filename" },
+               { "directory", 'D', POPT_ARG_STRING, &options.directory, 0, 
+                 "working directory", NULL },
+               { "tcp-options", 'T', POPT_ARG_STRING, &options.tcp_options, 0, 
+                 "TCP socket options", NULL },
+               { "target-rate", 'R', POPT_ARG_DOUBLE, &options.targetrate, 0, 
+                 "target throughput (MB/sec)", NULL },
+               { "sync", 's', POPT_ARG_NONE, &options.sync_open, 0, 
+                 "use O_SYNC", NULL },
+               { "sync-dir", 'S', POPT_ARG_NONE, &options.sync_dirs, 0, 
+                 "sync directory changes", NULL },
+               { "fsync", 'F', POPT_ARG_NONE, &options.do_fsync, 0, 
+                 "fsync on write", NULL },
+               { "xattr", 'x', POPT_ARG_NONE, &options.ea_enable, 0, 
+                 "use xattrs", NULL },
+               POPT_TABLEEND
+       };
+       poptContext pc;
+       int opt;
+
+       pc = poptGetContext(argv[0], argc, argv, popt_options, POPT_CONTEXT_KEEP_FIRST);
+
+       while ((opt = poptGetNextOpt(pc)) != -1) {
+               switch (opt) {
                default:
-                       abort ();
+                       fprintf(stderr, "Invalid option %s: %s\n", 
+                               poptBadOption(pc, 0), poptStrerror(opt));
+                       exit(1);
                }
-       
-       if (!argv[optind])
-               return 0;
-       
-       *nprocs = atoi(argv[optind++]);
+       }
 
-       if (argv[optind])
-               server = argv[optind++];
+       /* setup the remaining options for the main program to use */
+       extra_argv = poptGetArgs(pc);
+       if (extra_argv) {
+               extra_argv++;
+               while (extra_argv[extra_argc]) extra_argc++;
+       }
+
+       if (extra_argc < 1) {
+               printf("You need to specify NPROCS\n");
+               poptPrintHelp(pc, stdout, 0);
+               exit(1);
+       }
+
+#ifndef HAVE_EA_SUPPORT
+       if (options.ea_enable) {
+               printf("EA suppport not compiled in\n");
+               exit(1);
+       }
+#endif
+       
+       options.nprocs = atoi(extra_argv[0]);
 
        return 1;
 }
 
 
 
- int main(int argc, char *argv[])
+ int main(int argc, const char *argv[])
 {
-       int nprocs;
        double total_bytes = 0;
        double t;
        int i;
 
        printf("dbench version %s - Copyright Andrew Tridgell 1999-2004\n\n", VERSION);
 
-       if (!process_opts(argc, argv, &nprocs))
+       if (!process_opts(argc, argv))
                show_usage();
 
-       warmup = timelimit / 5;
+       if (options.warmup == -1) {
+               options.warmup = options.timelimit / 5;
+       }
 
         printf("Running for %d seconds with load '%s' and minimum warmup %d secs\n", 
-               timelimit, loadfile, warmup);
+               options.timelimit, options.loadfile, options.warmup);
 
-       create_procs(nprocs, child_run);
+       create_procs(options.nprocs, child_run);
 
-       for (i=0;i<nprocs;i++) {
+       for (i=0;i<options.nprocs;i++) {
                total_bytes += children[i].bytes - children[i].bytes_done_warmup;
        }
 
@@ -373,7 +379,7 @@ static int process_opts(int argc, char **argv,
 
        printf("Throughput %g MB/sec%s%s %d procs\n", 
               1.0e-6 * total_bytes / t,
-              sync_open ? " (sync open)" : "",
-              sync_dirs ? " (sync dirs)" : "", nprocs);
+              options.sync_open ? " (sync open)" : "",
+              options.sync_dirs ? " (sync dirs)" : "", options.nprocs);
        return 0;
 }
index 0331cd54cec03026e4f18da1fff2249b1f8a714d..e5bb877ada9e1a498fd7ec6e8bb3288c9edacd91 100644 (file)
--- a/dbench.h
+++ b/dbench.h
@@ -105,8 +105,23 @@ struct child_struct {
        double max_latency;
        struct timeval starttime;
        struct timeval lasttime;
+       off_t bytes_since_fsync;
 };
 
+struct options {
+       int nprocs;
+       int sync_open;
+       int sync_dirs;
+       int do_fsync;
+       int fsync_frequency;
+       char *tcp_options;
+       int timelimit;
+       int warmup;
+       const char *directory;
+       char *loadfile;
+       double targetrate;
+       int ea_enable;
+};
 
 /* CreateDisposition field. */
 #define FILE_SUPERSEDE 0
@@ -132,3 +147,4 @@ struct child_struct {
 
 #include "proto.h"
 
+extern struct options options;
index dcec5ab57f4c2911533a259954253aa90b43771d..b59a481f524e405965c1cc09cbee13936abaee7b 100644 (file)
--- a/fileio.c
+++ b/fileio.c
@@ -22,8 +22,8 @@
 
 #define MAX_FILES 200
 
+
 char *server = NULL;
-extern int sync_open, sync_dirs, do_fsync;
 
 static struct {
        char *name;
@@ -87,9 +87,8 @@ static void sync_parent(char *fname)
 static void xattr_fd_read_hook(int fd)
 {
 #if HAVE_EA_SUPPORT
-       extern int ea_enable;
        char buf[44];
-       if (ea_enable) {
+       if (options.ea_enable) {
                memset(buf, 0, sizeof(buf));
                sys_fgetxattr(fd, "user.DosAttrib", buf, sizeof(buf));
        }
@@ -101,8 +100,7 @@ static void xattr_fd_read_hook(int fd)
 static void xattr_fname_read_hook(const char *fname)
 {
 #if HAVE_EA_SUPPORT
-       extern int ea_enable;
-       if (ea_enable) {
+       if (options.ea_enable) {
                char buf[44];
                sys_getxattr(fname, "user.DosAttrib", buf, sizeof(buf));
        }
@@ -114,8 +112,7 @@ static void xattr_fname_read_hook(const char *fname)
 static void xattr_fd_write_hook(int fd)
 {
 #if HAVE_EA_SUPPORT
-       extern int ea_enable;
-       if (ea_enable) {
+       if (options.ea_enable) {
                struct timeval tv;
                char buf[44];
                sys_fgetxattr(fd, "user.DosAttrib", buf, sizeof(buf));
@@ -208,7 +205,7 @@ void nb_unlink(struct child_struct *child, char *fname, int attr, const char *st
                       child->line, fname, strerror(errno), status);
                failed(child);
        }
-       if (sync_dirs) sync_parent(fname);
+       if (options.sync_dirs) sync_parent(fname);
 }
 
 void nb_mkdir(struct child_struct *child, char *dname, const char *status)
@@ -228,7 +225,7 @@ void nb_rmdir(struct child_struct *child, char *fname, const char *status)
                       child->line, fname, strerror(errno), status);
                failed(child);
        }
-       if (sync_dirs) sync_parent(fname);
+       if (options.sync_dirs) sync_parent(fname);
 }
 
 void nb_createx(struct child_struct *child, const char *fname, 
@@ -241,7 +238,7 @@ void nb_createx(struct child_struct *child, const char *fname,
 
        resolve_name(fname);
 
-       if (sync_open) flags |= O_SYNC;
+       if (options.sync_open) flags |= O_SYNC;
 
        if (create_disposition == FILE_CREATE) {
                flags |= O_CREAT;
@@ -329,11 +326,12 @@ void nb_writex(struct child_struct *child, int handle, int offset,
                exit(1);
        }
 
-       if (do_fsync) fsync(ftable[i].fd);
+       if (options.do_fsync) fsync(ftable[i].fd);
 
        free(buf);
 
        child->bytes += size;
+       child->bytes_since_fsync += size;
 }
 
 void nb_readx(struct child_struct *child, int handle, int offset, 
@@ -375,7 +373,7 @@ void nb_rename(struct child_struct *child, char *old, char *new, const char *sta
                       old, new, strerror(errno), status);
                failed(child);
        }
-       if (sync_dirs) sync_parent(new);
+       if (options.sync_dirs) sync_parent(new);
 }
 
 void nb_flush(struct child_struct *child, int handle, const char *status)
index c2e4e9ca1fa6681cde336d0cdc6c79e4fee309b9..c4aed74574235168ce62da10098bca19504424e9 100644 (file)
--- a/sockio.c
+++ b/sockio.c
@@ -66,14 +66,12 @@ static void do_packets(int send_size, int recv_size)
 
 void nb_setup(struct child_struct *child)
 {
-       extern char *tcp_options;
-
        sock = open_socket_out(server, TCP_PORT);
        if (sock == -1) {
                printf("client %d failed to start\n", child->id);
                exit(1);
        }
-       set_socket_options(sock, tcp_options);
+       set_socket_options(sock, options.tcp_options);
 
        do_packets(8, 8);
 }
index 595885cc231ce3c18104aeeb16b0189610b1ba30..aa82dbd2d7a3c82fa84703664cc06f280fa79266 100644 (file)
--- a/socklib.c
+++ b/socklib.c
@@ -27,7 +27,6 @@ int open_socket_in(int type, int port)
        struct sockaddr_in sock;
        int res;
        int one=1;
-       extern char *tcp_options;
 
        memset((char *)&sock,0, sizeof(sock));
        sock.sin_port = htons(port);
@@ -45,7 +44,7 @@ int open_socket_in(int type, int port)
                return(-1); 
        }
 
-       set_socket_options(res, tcp_options);
+       set_socket_options(res, options.tcp_options);
 
        return res;
 }
@@ -59,7 +58,6 @@ int open_socket_out(char *host, int port)
        struct sockaddr_in sock_out;
        int res;
        struct hostent *hp;  
-       extern char *tcp_options;
 
        res = socket(PF_INET, type, 0);
        if (res == -1) {
@@ -76,7 +74,7 @@ int open_socket_out(char *host, int port)
        sock_out.sin_port = htons(port);
        sock_out.sin_family = PF_INET;
 
-       set_socket_options(res, tcp_options);
+       set_socket_options(res, options.tcp_options);
 
        if (connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out))) {
                close(res);
index 6cd1e14b7896b99bbaa2498fdac765dd4438db94..a63aab93c73f342f67ae4d43c25e5a55e3fb4815 100644 (file)
@@ -19,7 +19,9 @@
 
 #include "dbench.h"
 
-char *tcp_options = TCP_OPTIONS;
+struct options options = {
+       .tcp_options = TCP_OPTIONS
+};
 
 static void server(int fd)
 {
@@ -64,12 +66,12 @@ static void listener(void)
 
        while (1) {
                struct sockaddr addr;
-               int in_addrlen = sizeof(addr);
+               socklen_t in_addrlen = sizeof(addr);
                int fd;
 
                while (waitpid((pid_t)-1,(int *)NULL, WNOHANG) > 0) ;
 
-               fd = accept(sock,&addr,&in_addrlen);
+               fd = accept(sock, &addr, &in_addrlen);
 
                if (fd != -1) {
                        if (fork() == 0) server(fd);
@@ -95,7 +97,7 @@ static void process_opts(int argc, char **argv)
        while ((c = getopt(argc, argv, "t:")) != -1) {
                switch (c) {
                case 't':
-                       tcp_options = optarg;
+                       options.tcp_options = optarg;
                        break;
                default:
                        usage();