2 Unix SMB/CIFS implementation.
3 SMB torture tester - NBENCH test
4 Copyright (C) Andrew Tridgell 1997-2004
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include "torture/torture.h"
23 #include "libcli/libcli.h"
24 #include "system/filesys.h"
27 #include "torture/nbench/proto.h"
29 int nbench_line_count = 0;
30 static int timelimit = 600;
32 static const char *loadfile;
34 #define ival(s) strtol(s, NULL, 0)
36 /* run a test that simulates an approximate netbench client load */
37 static BOOL run_netbench(struct smbcli_state *cli, int client)
39 extern int torture_nprocs;
47 if (torture_nprocs == 1) {
48 if (!torture_setup_dir(cli, "\\clients")) {
53 nb_setup(cli, client);
55 asprintf(&cname, "client%d", client+1);
57 f = fopen(loadfile, "r");
65 while (fgets(line, sizeof(line)-1, f)) {
70 line[strlen(line)-1] = 0;
72 all_string_sub(line,"client1", cname, sizeof(line));
74 params = str_list_make_shell(NULL, line, " ");
75 i = str_list_length(params);
77 if (i < 2 || params[0][0] == '#') continue;
79 if (!strncmp(params[0],"SMB", 3)) {
80 printf("ERROR: You are using a dbench 1 load file\n");
84 if (strncmp(params[i-1], "NT_STATUS_", 10) != 0) {
85 printf("Badly formed status at line %d\n", nbench_line_count);
90 status = nt_status_string_to_code(params[i-1]);
92 DEBUG(9,("run_netbench(%d): %s %s\n", client, params[0], params[1]));
94 if (!strcmp(params[0],"NTCreateX")) {
95 nb_createx(params[1], ival(params[2]), ival(params[3]),
96 ival(params[4]), status);
97 } else if (!strcmp(params[0],"Close")) {
98 nb_close(ival(params[1]), status);
99 } else if (!strcmp(params[0],"Rename")) {
100 nb_rename(params[1], params[2], status);
101 } else if (!strcmp(params[0],"Unlink")) {
102 nb_unlink(params[1], ival(params[2]), status);
103 } else if (!strcmp(params[0],"Deltree")) {
104 nb_deltree(params[1]);
105 } else if (!strcmp(params[0],"Rmdir")) {
106 nb_rmdir(params[1], status);
107 } else if (!strcmp(params[0],"Mkdir")) {
108 nb_mkdir(params[1], status);
109 } else if (!strcmp(params[0],"QUERY_PATH_INFORMATION")) {
110 nb_qpathinfo(params[1], ival(params[2]), status);
111 } else if (!strcmp(params[0],"QUERY_FILE_INFORMATION")) {
112 nb_qfileinfo(ival(params[1]), ival(params[2]), status);
113 } else if (!strcmp(params[0],"QUERY_FS_INFORMATION")) {
114 nb_qfsinfo(ival(params[1]), status);
115 } else if (!strcmp(params[0],"SET_FILE_INFORMATION")) {
116 nb_sfileinfo(ival(params[1]), ival(params[2]), status);
117 } else if (!strcmp(params[0],"FIND_FIRST")) {
118 nb_findfirst(params[1], ival(params[2]),
119 ival(params[3]), ival(params[4]), status);
120 } else if (!strcmp(params[0],"WriteX")) {
121 nb_writex(ival(params[1]),
122 ival(params[2]), ival(params[3]), ival(params[4]),
124 } else if (!strcmp(params[0],"Write")) {
125 nb_write(ival(params[1]),
126 ival(params[2]), ival(params[3]), ival(params[4]),
128 } else if (!strcmp(params[0],"LockX")) {
129 nb_lockx(ival(params[1]),
130 ival(params[2]), ival(params[3]), status);
131 } else if (!strcmp(params[0],"UnlockX")) {
132 nb_unlockx(ival(params[1]),
133 ival(params[2]), ival(params[3]), status);
134 } else if (!strcmp(params[0],"ReadX")) {
135 nb_readx(ival(params[1]),
136 ival(params[2]), ival(params[3]), ival(params[4]),
138 } else if (!strcmp(params[0],"Flush")) {
139 nb_flush(ival(params[1]), status);
140 } else if (!strcmp(params[0],"Sleep")) {
141 nb_sleep(ival(params[1]), status);
143 printf("[%d] Unknown operation %s\n", nbench_line_count, params[0]);
148 if (nb_tick()) goto done;
157 if (torture_nprocs == 1) {
158 smbcli_deltree(cli->tree, "\\clients");
160 if (!torture_close_connection(cli)) {
168 /* run a test that simulates an approximate netbench client load */
169 BOOL torture_nbench(void)
172 extern int torture_nprocs;
173 struct smbcli_state *cli;
176 p = lp_parm_string(-1, "torture", "timelimit");
181 warmup = timelimit / 20;
183 loadfile = lp_parm_string(-1, "torture", "loadfile");
184 if (!loadfile || !*loadfile) {
185 loadfile = "client.txt";
188 if (torture_nprocs > 1) {
189 if (!torture_open_connection(&cli)) {
193 if (!torture_setup_dir(cli, "\\clients")) {
198 nbio_shmem(torture_nprocs, timelimit, warmup);
200 printf("Running for %d seconds with load '%s' and warmup %d secs\n",
201 timelimit, loadfile, warmup);
203 /* we need to reset SIGCHLD here as the name resolution
204 library may have changed it. We rely on correct signals
205 from childs in the main torture code which reaps
206 children. This is why smbtorture BENCH-NBENCH was sometimes
208 signal(SIGCHLD, SIG_DFL);
211 signal(SIGALRM, nb_alarm);
213 torture_create_procs(run_netbench, &correct);
216 if (torture_nprocs > 1) {
217 smbcli_deltree(cli->tree, "\\clients");
220 printf("\nThroughput %g MB/sec\n", nbio_result());