[dbench @ tridge@samba.org-20070726004655-8330ilxbx6n6q69a]
authorAndrew Tridgell <tridge@samba.org>
Thu, 26 Jul 2007 00:46:55 +0000 (10:46 +1000)
committerAndrew Tridgell <tridge@samba.org>
Thu, 26 Jul 2007 00:46:55 +0000 (10:46 +1000)
added --stat-check

dbench.c
dbench.h
fileio.c

index 5b8d910..0095f03 100644 (file)
--- a/dbench.c
+++ b/dbench.c
@@ -388,6 +388,8 @@ static int process_opts(int argc, const char **argv)
                  "number of clients per process", NULL },
                { "one-byte-write-fix", 0, POPT_ARG_NONE, &options.one_byte_write_fix, 0, 
                  "try to fix 1 byte writes", NULL },
+               { "stat-check", 0, POPT_ARG_NONE, &options.stat_check, 0, 
+                 "check for pointless calls with stat", NULL },
                POPT_TABLEEND
        };
        poptContext pc;
index 89456db..e61ef26 100644 (file)
--- a/dbench.h
+++ b/dbench.h
@@ -157,6 +157,7 @@ struct options {
        const char *server;
        int clients_per_process;
        int one_byte_write_fix;
+       int stat_check;
 };
 
 /* CreateDisposition field. */
index 852c621..21a8695 100644 (file)
--- a/fileio.c
+++ b/fileio.c
@@ -218,16 +218,26 @@ void nb_unlink(struct child_struct *child, const char *fname, int attr, const ch
 
 void nb_mkdir(struct child_struct *child, const char *dname, const char *status)
 {
+       struct stat st;
        (void)child;
        (void)status;
        resolve_name(child, dname);
+       if (options.stat_check && stat(dname, &st) == 0) {
+               return;
+       }
        mkdir(dname, 0777);
 }
 
 void nb_rmdir(struct child_struct *child, const char *fname, const char *status)
 {
+       struct stat st;
        resolve_name(child, fname);
 
+       if (options.stat_check && 
+           (stat(fname, &st) != 0 || !S_ISDIR(st.st_mode))) {
+               return;
+       }
+
        if (rmdir(fname) != expected_status(status)) {
                printf("[%d] rmdir %s failed (%s) - expected %s\n", 
                       child->line, fname, strerror(errno), status);
@@ -250,6 +260,9 @@ void nb_createx(struct child_struct *child, const char *fname,
        if (options.sync_open) flags |= O_SYNC;
 
        if (create_disposition == FILE_CREATE) {
+               if (options.stat_check && stat(fname, &st) == 0) {
+                       return;
+               }
                flags |= O_CREAT;
        }
 
@@ -341,7 +354,7 @@ void nb_writex(struct child_struct *child, int handle, int offset,
        }
        if (ret != ret_size) {
                printf("[%d] wrote %d bytes, expected to write %d bytes on handle %d\n", 
-                      child->line, ret, ret_size, handle);
+                      child->line, (int)ret, (int)ret_size, handle);
                exit(1);
        }
 
@@ -390,6 +403,16 @@ void nb_rename(struct child_struct *child, const char *old, const char *new, con
        resolve_name(child, old);
        resolve_name(child, new);
 
+       if (options.stat_check) {
+               struct stat st;
+               if (stat(old, &st) != 0 && expected_status(status) == 0) {
+                       printf("[%d] rename %s %s failed - file doesn't exist\n",
+                              child->line, old, new);
+                       failed(child);
+                       return;
+               }
+       }
+
        if (rename(old, new) != expected_status(status)) {
                printf("[%d] rename %s %s failed (%s) - expected %s\n", 
                       child->line, old, new, strerror(errno), status);