s4:smbtorture: add BASE-BENCH-HOLDOPEN
authorStefan Metzmacher <metze@samba.org>
Tue, 26 Jan 2010 14:20:57 +0000 (15:20 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 26 Jan 2010 14:23:24 +0000 (15:23 +0100)
This is useful for manual performance testing with a large
number of share mode entries.

metze

source4/torture/basic/base.c
source4/torture/basic/misc.c

index 2c7225784580afc6512719dd16aa58e8369e3066..ed389fb9d54ae2edf16b1580aee16e50abd671d3 100644 (file)
@@ -1771,6 +1771,7 @@ NTSTATUS torture_base_init(void)
        torture_suite_add_1smb_test(suite, "MAXIMUM_ALLOWED", torture_maximum_allowed);
 
        torture_suite_add_simple_test(suite, "BENCH-HOLDCON", torture_holdcon);
+       torture_suite_add_1smb_test(suite, "BENCH-HOLDOPEN", torture_holdopen);
        torture_suite_add_simple_test(suite, "BENCH-READWRITE", run_benchrw);
        torture_suite_add_smb_multi_test(suite, "BENCH-TORTURE", run_torture);
        torture_suite_add_1smb_test(suite, "SCAN-PIPE_NUMBER", run_pipe_number);
index a8ea88fb7fb30f92fa6e8fbe7e461b68e6013b05..ab79d798fc52be4bad1d5d0d7b8f26b77594c639 100644 (file)
@@ -230,6 +230,69 @@ bool torture_holdcon(struct torture_context *tctx)
        return true;
 }
 
+/*
+  open a file N times on the server and just hold them open
+  used for testing performance when there are N file handles
+  alopenn
+ */
+bool torture_holdopen(struct torture_context *tctx,
+                     struct smbcli_state *cli)
+{
+       int i, fnum;
+       const char *fname = "\\holdopen.dat";
+       NTSTATUS status;
+
+       smbcli_unlink(cli->tree, fname);
+
+       fnum = smbcli_open(cli->tree, fname, O_RDWR|O_CREAT|O_EXCL, DENY_NONE);
+       if (fnum == -1) {
+               torture_comment(tctx, "open of %s failed (%s)\n", fname, smbcli_errstr(cli->tree));
+               return false;
+       }
+
+       smbcli_close(cli->tree, fnum);
+
+       for (i=0;i<torture_numops;i++) {
+               union smb_open op;
+
+               op.generic.level = RAW_OPEN_NTCREATEX;
+               op.ntcreatex.in.root_fid.fnum = 0;
+               op.ntcreatex.in.flags = 0;
+               op.ntcreatex.in.access_mask = SEC_FILE_WRITE_DATA;
+               op.ntcreatex.in.create_options = 0;
+               op.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+               op.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_MASK;
+               op.ntcreatex.in.alloc_size = 0;
+               op.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN;
+               op.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
+               op.ntcreatex.in.security_flags = 0;
+               op.ntcreatex.in.fname = fname;
+               status = smb_raw_open(cli->tree, tctx, &op);
+               if (!NT_STATUS_IS_OK(status)) {
+                       torture_warning(tctx, "open %d failed\n", i);
+                       continue;
+               }
+
+               if (torture_setting_bool(tctx, "progress", true)) {
+                       torture_comment(tctx, "opened %d file\r", i);
+                       fflush(stdout);
+               }
+       }
+
+       torture_comment(tctx, "\nStarting pings\n");
+
+       while (1) {
+               struct smb_echo ec;
+
+               status = smb_raw_echo(cli->transport, &ec);
+               torture_comment(tctx, ".");
+               fflush(stdout);
+               sleep(15);
+       }
+
+       return true;
+}
+
 /*
 test how many open files this server supports on the one socket
 */