diff options
Diffstat (limited to 'source3/torture/nbio.c')
-rw-r--r-- | source3/torture/nbio.c | 271 |
1 files changed, 159 insertions, 112 deletions
diff --git a/source3/torture/nbio.c b/source3/torture/nbio.c index 678f3ab556..0785c4e196 100644 --- a/source3/torture/nbio.c +++ b/source3/torture/nbio.c @@ -28,12 +28,68 @@ static char buf[70000]; extern int line_count; +extern int nbio_id; +static int nprocs; static struct { int fd; int handle; } ftable[MAX_FILES]; +static struct { + double bytes_in, bytes_out; + int line; +} *children; + +double nbio_total(void) +{ + int i; + double total = 0; + for (i=0;i<nprocs;i++) { + total += children[i].bytes_out + children[i].bytes_in; + } + return total; +} + +void nb_alarm(void) +{ + int i; + int lines=0; + if (nbio_id != -1) return; + + for (i=0;i<nprocs;i++) { + lines += children[i].line; + } + + printf("%8d %.2f MB/sec\r", lines/nprocs, 1.0e-6 * nbio_total() / end_timer()); + + signal(SIGALRM, nb_alarm); + alarm(1); +} + +void nbio_shmem(int n) +{ + nprocs = n; + children = shm_setup(sizeof(*children) * nprocs); + if (!children) { + printf("Failed to setup shared memory!\n"); + exit(1); + } +} + +static int find_handle(int handle) +{ + int i; + children[nbio_id].line = line_count; + for (i=0;i<MAX_FILES;i++) { + if (ftable[i].handle == handle) return i; + } + printf("ERROR: handle %d was not found\n", + line_count, handle); + exit(1); +} + + static struct cli_state *c; static void sigsegv(int sig) @@ -50,13 +106,12 @@ void nb_setup(struct cli_state *cli) { signal(SIGSEGV, sigsegv); c = cli; + start_timer(); } void nb_unlink(char *fname) { - strupper(fname); - if (!cli_unlink(c, fname)) { #if NBDEBUG printf("(%d) unlink %s failed (%s)\n", @@ -65,175 +120,167 @@ void nb_unlink(char *fname) } } -void nb_open(char *fname, int handle, int size) + +void nb_createx(char *fname, + unsigned create_options, unsigned create_disposition, int handle) { int fd, i; - int flags = O_RDWR|O_CREAT; - size_t st_size; static int count; - strupper(fname); - - if (size == 0) flags |= O_TRUNC; - - fd = cli_open(c, fname, flags, DENY_NONE); - if (fd == -1) { -#if NBDEBUG - printf("(%d) open %s failed for handle %d (%s)\n", - line_count, fname, handle, cli_errstr(c)); -#endif - return; + fd = cli_nt_create_full(c, fname, + FILE_READ_DATA | FILE_WRITE_DATA, + 0, + FILE_SHARE_READ|FILE_SHARE_WRITE, + create_disposition, + create_options); + if (fd == -1 && handle != -1) { + printf("ERROR: cli_nt_create_full failed for %s - %s\n", + fname, cli_errstr(c)); + exit(1); } - cli_getattrE(c, fd, NULL, &st_size, NULL, NULL, NULL); - if (size > st_size) { -#if NBDEBUG - printf("(%d) needs expanding %s to %d from %d\n", - line_count, fname, size, (int)st_size); -#endif - } else if (size < st_size) { -#if NBDEBUG - printf("(%d) needs truncating %s to %d from %d\n", - line_count, fname, size, (int)st_size); -#endif + if (fd != -1 && handle == -1) { + printf("ERROR: cli_nt_create_full succeeded for %s\n", fname); + exit(1); } + if (fd == -1) return; + for (i=0;i<MAX_FILES;i++) { if (ftable[i].handle == 0) break; } if (i == MAX_FILES) { - printf("file table full for %s\n", fname); + printf("(%d) file table full for %s\n", line_count, + fname); exit(1); } ftable[i].handle = handle; ftable[i].fd = fd; - if (count++ % 100 == 0) { - printf("."); - } } -void nb_write(int handle, int size, int offset) +void nb_writex(int handle, int offset, int size, int ret_size) { int i; if (buf[0] == 0) memset(buf, 1, sizeof(buf)); - for (i=0;i<MAX_FILES;i++) { - if (ftable[i].handle == handle) break; - } - if (i == MAX_FILES) { -#if NBDEBUG - printf("(%d) nb_write: handle %d was not open size=%d ofs=%d\n", - line_count, handle, size, offset); -#endif - return; - } - if (cli_smbwrite(c, ftable[i].fd, buf, offset, size) != size) { - printf("(%d) write failed on handle %d, fd %d \ + i = find_handle(handle); + if (cli_write(c, ftable[i].fd, 0, buf, offset, size) != ret_size) { + printf("(%d) ERROR: write failed on handle %d, fd %d \ errno %d (%s)\n", line_count, handle, ftable[i].fd, errno, strerror(errno)); - if (errno == ENOSPC) { - printf("Halting.\n"); - fflush(stdout); - fflush(stderr); - exit(3); - } + exit(1); } + + children[nbio_id].bytes_out += ret_size; } -void nb_read(int handle, int size, int offset) +void nb_readx(int handle, int offset, int size, int ret_size) { int i, ret; - for (i=0;i<MAX_FILES;i++) { - if (ftable[i].handle == handle) break; - } - if (i == MAX_FILES) { - printf("(%d) nb_read: handle %d was not open size=%d ofs=%d\n", - line_count, handle, size, offset); - return; - } - if ((ret=cli_read(c, ftable[i].fd, buf, offset, size)) != size) { -#if NBDEBUG - printf("(%d) read failed on handle %d ofs=%d size=%d res=%d fd %d errno %d (%s)\n", + i = find_handle(handle); + if ((ret=cli_read(c, ftable[i].fd, buf, offset, size)) != ret_size) { + printf("(%d) ERROR: read failed on handle %d ofs=%d size=%d res=%d fd %d errno %d (%s)\n", line_count, handle, offset, size, ret, ftable[i].fd, errno, strerror(errno)); -#endif + exit(1); } + children[nbio_id].bytes_in += ret_size; } void nb_close(int handle) { int i; - for (i=0;i<MAX_FILES;i++) { - if (ftable[i].handle == handle) break; - } - if (i == MAX_FILES) { - printf("(%d) nb_close: handle %d was not open\n", - line_count, handle); - return; + i = find_handle(handle); + if (!cli_close(c, ftable[i].fd)) { + printf("(%d) close failed on handle %d\n", line_count, handle); + exit(1); } - cli_close(c, ftable[i].fd); ftable[i].handle = 0; } -void nb_mkdir(char *fname) -{ - strupper(fname); - - if (!cli_mkdir(c, fname)) { -#if NBDEBUG - printf("mkdir %s failed (%s)\n", - fname, cli_errstr(c)); -#endif - } -} - void nb_rmdir(char *fname) { - strupper(fname); - if (!cli_rmdir(c, fname)) { -#if NBDEBUG - printf("rmdir %s failed (%s)\n", + printf("ERROR: rmdir %s failed (%s)\n", fname, cli_errstr(c)); -#endif + exit(1); } } void nb_rename(char *old, char *new) { - strupper(old); - strupper(new); - if (!cli_rename(c, old, new)) { -#if NBDEBUG - printf("rename %s %s failed (%s)\n", + printf("ERROR: rename %s %s failed (%s)\n", old, new, cli_errstr(c)); -#endif + exit(1); } } -void nb_stat(char *fname, int size) +void nb_qpathinfo(char *fname) +{ + cli_qpathinfo(c, fname, NULL, NULL, NULL, NULL, NULL); +} + +void nb_qfileinfo(int fnum) +{ + int i; + i = find_handle(fnum); + cli_qfileinfo(c, ftable[i].fd, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +} + +void nb_qfsinfo(int level) { - size_t st_size; + int bsize, total, avail; + /* this is not the right call - we need cli_qfsinfo() */ + cli_dskattr(c, &bsize, &total, &avail); +} - strupper(fname); +static void find_fn(file_info *finfo, const char *name, void *state) +{ + /* noop */ +} - if (!cli_getatr(c, fname, NULL, &st_size, NULL)) { -#if NBDEBUG - printf("(%d) nb_stat: %s size=%d %s\n", - line_count, fname, size, cli_errstr(c)); -#endif - return; - } - if (st_size != size) { -#if NBDEBUG - printf("(%d) nb_stat: %s wrong size %d %d\n", - line_count, fname, (int)st_size, size); -#endif +void nb_findfirst(char *mask) +{ + cli_list(c, mask, 0, find_fn, NULL); +} + +void nb_flush(int fnum) +{ + int i; + i = find_handle(fnum); + /* hmmm, we don't have cli_flush() yet */ +} + +static int total_deleted; + +static void delete_fn(file_info *finfo, const char *name, void *state) +{ + char *s, *n; + if (finfo->name[0] == '.') return; + + n = strdup(name); + n[strlen(n)-1] = 0; + asprintf(&s, "%s%s", n, finfo->name); + if (finfo->mode & aDIR) { + nb_deltree(s); + } else { + total_deleted++; + nb_unlink(s); } + free(s); + free(n); } -void nb_create(char *fname, int size) +void nb_deltree(char *dname) { - nb_open(fname, 5000, size); - nb_close(5000); + char *mask; + asprintf(&mask, "%s\\*", dname); + + total_deleted = 0; + + cli_list(c, mask, aDIR, delete_fn, NULL); + free(mask); + nb_rmdir(dname); + + if (total_deleted) printf("WARNING: Cleaned up %d files\n", total_deleted); } |