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 "libcli/libcli.h"
23 #include "torture/util.h"
24 #include "torture/torture.h"
25 #include "system/filesys.h"
28 #include "torture/nbench/proto.h"
30 int nbench_line_count = 0;
31 static int timelimit = 600;
33 static const char *loadfile;
35 #define ival(s) strtol(s, NULL, 0)
37 /* run a test that simulates an approximate netbench client load */
38 static BOOL run_netbench(struct smbcli_state *cli, int client)
40 extern int torture_nprocs;
48 if (torture_nprocs == 1) {
49 if (!torture_setup_dir(cli, "\\clients")) {
54 nb_setup(cli, client);
56 asprintf(&cname, "client%d", client+1);
58 f = fopen(loadfile, "r");
66 while (fgets(line, sizeof(line)-1, f)) {
71 line[strlen(line)-1] = 0;
73 all_string_sub(line,"client1", cname, sizeof(line));
75 params = str_list_make_shell(NULL, line, " ");
76 i = str_list_length(params);
78 if (i < 2 || params[0][0] == '#') continue;
80 if (!strncmp(params[0],"SMB", 3)) {
81 printf("ERROR: You are using a dbench 1 load file\n");
85 if (strncmp(params[i-1], "NT_STATUS_", 10) != 0) {
86 printf("Badly formed status at line %d\n", nbench_line_count);
91 status = nt_status_string_to_code(params[i-1]);
93 DEBUG(9,("run_netbench(%d): %s %s\n", client, params[0], params[1]));
95 if (!strcmp(params[0],"NTCreateX")) {
96 nb_createx(params[1], ival(params[2]), ival(params[3]),
97 ival(params[4]), status);
98 } else if (!strcmp(params[0],"Close")) {
99 nb_close(ival(params[1]), status);
100 } else if (!strcmp(params[0],"Rename")) {
101 nb_rename(params[1], params[2], status);
102 } else if (!strcmp(params[0],"Unlink")) {
103 nb_unlink(params[1], ival(params[2]), status);
104 } else if (!strcmp(params[0],"Deltree")) {
105 nb_deltree(params[1]);
106 } else if (!strcmp(params[0],"Rmdir")) {
107 nb_rmdir(params[1], status);
108 } else if (!strcmp(params[0],"Mkdir")) {
109 nb_mkdir(params[1], status);
110 } else if (!strcmp(params[0],"QUERY_PATH_INFORMATION")) {
111 nb_qpathinfo(params[1], ival(params[2]), status);
112 } else if (!strcmp(params[0],"QUERY_FILE_INFORMATION")) {
113 nb_qfileinfo(ival(params[1]), ival(params[2]), status);
114 } else if (!strcmp(params[0],"QUERY_FS_INFORMATION")) {
115 nb_qfsinfo(ival(params[1]), status);
116 } else if (!strcmp(params[0],"SET_FILE_INFORMATION")) {
117 nb_sfileinfo(ival(params[1]), ival(params[2]), status);
118 } else if (!strcmp(params[0],"FIND_FIRST")) {
119 nb_findfirst(params[1], ival(params[2]),
120 ival(params[3]), ival(params[4]), status);
121 } else if (!strcmp(params[0],"WriteX")) {
122 nb_writex(ival(params[1]),
123 ival(params[2]), ival(params[3]), ival(params[4]),
125 } else if (!strcmp(params[0],"Write")) {
126 nb_write(ival(params[1]),
127 ival(params[2]), ival(params[3]), ival(params[4]),
129 } else if (!strcmp(params[0],"LockX")) {
130 nb_lockx(ival(params[1]),
131 ival(params[2]), ival(params[3]), status);
132 } else if (!strcmp(params[0],"UnlockX")) {
133 nb_unlockx(ival(params[1]),
134 ival(params[2]), ival(params[3]), status);
135 } else if (!strcmp(params[0],"ReadX")) {
136 nb_readx(ival(params[1]),
137 ival(params[2]), ival(params[3]), ival(params[4]),
139 } else if (!strcmp(params[0],"Flush")) {
140 nb_flush(ival(params[1]), status);
141 } else if (!strcmp(params[0],"Sleep")) {
142 nb_sleep(ival(params[1]), status);
144 printf("[%d] Unknown operation %s\n", nbench_line_count, params[0]);
149 if (nb_tick()) goto done;
158 if (torture_nprocs == 1) {
159 smbcli_deltree(cli->tree, "\\clients");
161 if (!torture_close_connection(cli)) {
169 /* run a test that simulates an approximate netbench client load */
170 BOOL torture_nbench(struct torture_context *torture)
173 extern int torture_nprocs;
174 struct smbcli_state *cli;
177 p = lp_parm_string(-1, "torture", "timelimit");
182 warmup = timelimit / 20;
184 loadfile = lp_parm_string(-1, "torture", "loadfile");
185 if (!loadfile || !*loadfile) {
186 loadfile = "client.txt";
189 if (torture_nprocs > 1) {
190 if (!torture_open_connection(&cli, 0)) {
194 if (!torture_setup_dir(cli, "\\clients")) {
199 nbio_shmem(torture_nprocs, timelimit, warmup);
201 printf("Running for %d seconds with load '%s' and warmup %d secs\n",
202 timelimit, loadfile, warmup);
204 /* we need to reset SIGCHLD here as the name resolution
205 library may have changed it. We rely on correct signals
206 from childs in the main torture code which reaps
207 children. This is why smbtorture BENCH-NBENCH was sometimes
209 signal(SIGCHLD, SIG_DFL);
212 signal(SIGALRM, nb_alarm);
214 torture_create_procs(run_netbench, &correct);
217 if (torture_nprocs > 1) {
218 smbcli_deltree(cli->tree, "\\clients");
221 printf("\nThroughput %g MB/sec\n", nbio_result());
225 NTSTATUS torture_nbench_init(void)
227 register_torture_op("BENCH-NBENCH", torture_nbench);