s4:smbtorture: add BASE-BENCH-HOLDOPEN
[ira/wip.git] / source4 / torture / basic / misc.c
index 19eef87f6f4b34467dd22cda7e6816bec87dd46a..ab79d798fc52be4bad1d5d0d7b8f26b77594c639 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "includes.h"
 #include "libcli/raw/libcliraw.h"
+#include "libcli/raw/raw_proto.h"
 #include "system/time.h"
 #include "system/wait.h"
 #include "system/filesys.h"
@@ -27,9 +28,7 @@
 #include "libcli/libcli.h"
 #include "lib/events/events.h"
 #include "libcli/resolve/resolve.h"
-#include "auth/credentials/credentials.h"
-#include "librpc/gen_ndr/ndr_nbt.h"
-#include "torture/torture.h"
+#include "torture/smbtorture.h"
 #include "torture/util.h"
 #include "libcli/smb_composite/smb_composite.h"
 #include "libcli/composite/composite.h"
 
 extern struct cli_credentials *cmdline_credentials;
        
-static BOOL wait_lock(struct smbcli_state *c, int fnum, uint32_t offset, uint32_t len)
+static bool wait_lock(struct smbcli_state *c, int fnum, uint32_t offset, uint32_t len)
 {
        while (NT_STATUS_IS_ERR(smbcli_lock(c->tree, fnum, offset, len, -1, WRITE_LOCK))) {
-               if (!check_error(__location__, c, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return False;
+               if (!check_error(__location__, c, ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED)) return false;
        }
-       return True;
+       return true;
 }
 
 
-static BOOL rw_torture(struct torture_context *tctx, struct smbcli_state *c)
+static bool rw_torture(struct torture_context *tctx, struct smbcli_state *c)
 {
        const char *lockfname = "\\torture.lck";
        char *fname;
@@ -55,7 +54,7 @@ static BOOL rw_torture(struct torture_context *tctx, struct smbcli_state *c)
        pid_t pid2, pid = getpid();
        int i, j;
        uint8_t buf[1024];
-       BOOL correct = True;
+       bool correct = true;
 
        fnum2 = smbcli_open(c->tree, lockfname, O_RDWR | O_CREAT | O_EXCL, 
                         DENY_NONE);
@@ -63,7 +62,7 @@ static BOOL rw_torture(struct torture_context *tctx, struct smbcli_state *c)
                fnum2 = smbcli_open(c->tree, lockfname, O_RDWR, DENY_NONE);
        if (fnum2 == -1) {
                torture_comment(tctx, "open of %s failed (%s)\n", lockfname, smbcli_errstr(c->tree));
-               return False;
+               return false;
        }
 
        generate_random_buffer(buf, sizeof(buf));
@@ -79,19 +78,19 @@ static BOOL rw_torture(struct torture_context *tctx, struct smbcli_state *c)
                asprintf(&fname, "\\torture.%u", n);
 
                if (!wait_lock(c, fnum2, n*sizeof(int), sizeof(int))) {
-                       return False;
+                       return false;
                }
 
                fnum = smbcli_open(c->tree, fname, O_RDWR | O_CREAT | O_TRUNC, DENY_ALL);
                if (fnum == -1) {
                        torture_comment(tctx, "open failed (%s)\n", smbcli_errstr(c->tree));
-                       correct = False;
+                       correct = false;
                        break;
                }
 
                if (smbcli_write(c->tree, fnum, 0, &pid, 0, sizeof(pid)) != sizeof(pid)) {
                        torture_comment(tctx, "write failed (%s)\n", smbcli_errstr(c->tree));
-                       correct = False;
+                       correct = false;
                }
 
                for (j=0;j<50;j++) {
@@ -99,7 +98,7 @@ static BOOL rw_torture(struct torture_context *tctx, struct smbcli_state *c)
                                      sizeof(pid)+(j*sizeof(buf)), 
                                      sizeof(buf)) != sizeof(buf)) {
                                torture_comment(tctx, "write failed (%s)\n", smbcli_errstr(c->tree));
-                               correct = False;
+                               correct = false;
                        }
                }
 
@@ -107,27 +106,27 @@ static BOOL rw_torture(struct torture_context *tctx, struct smbcli_state *c)
 
                if (smbcli_read(c->tree, fnum, &pid2, 0, sizeof(pid)) != sizeof(pid)) {
                        torture_comment(tctx, "read failed (%s)\n", smbcli_errstr(c->tree));
-                       correct = False;
+                       correct = false;
                }
 
                if (pid2 != pid) {
                        torture_comment(tctx, "data corruption!\n");
-                       correct = False;
+                       correct = false;
                }
 
                if (NT_STATUS_IS_ERR(smbcli_close(c->tree, fnum))) {
                        torture_comment(tctx, "close failed (%s)\n", smbcli_errstr(c->tree));
-                       correct = False;
+                       correct = false;
                }
 
                if (NT_STATUS_IS_ERR(smbcli_unlink(c->tree, fname))) {
                        torture_comment(tctx, "unlink failed (%s)\n", smbcli_errstr(c->tree));
-                       correct = False;
+                       correct = false;
                }
 
                if (NT_STATUS_IS_ERR(smbcli_unlock(c->tree, fnum2, n*sizeof(int), sizeof(int)))) {
                        torture_comment(tctx, "unlock failed (%s)\n", smbcli_errstr(c->tree));
-                       correct = False;
+                       correct = false;
                }
                free(fname);
        }
@@ -140,7 +139,7 @@ static BOOL rw_torture(struct torture_context *tctx, struct smbcli_state *c)
        return correct;
 }
 
-BOOL run_torture(struct torture_context *tctx, struct smbcli_state *cli, int dummy)
+bool run_torture(struct torture_context *tctx, struct smbcli_state *cli, int dummy)
 {
        return rw_torture(tctx, cli);
 }
@@ -149,7 +148,7 @@ BOOL run_torture(struct torture_context *tctx, struct smbcli_state *cli, int dum
 /*
   see how many RPC pipes we can open at once
 */
-BOOL run_pipe_number(struct torture_context *tctx, 
+bool run_pipe_number(struct torture_context *tctx, 
                                         struct smbcli_state *cli1)
 {
        const char *pipe_name = "\\WKSSVC";
@@ -172,7 +171,7 @@ BOOL run_pipe_number(struct torture_context *tctx,
        }
 
        torture_comment(tctx, "pipe_number test - we can open %d %s pipes.\n", num_pipes, pipe_name );
-       return True;
+       return true;
 }
 
 
@@ -183,7 +182,7 @@ BOOL run_pipe_number(struct torture_context *tctx,
   used for testing performance when there are N idle users
   already connected
  */
-BOOL torture_holdcon(struct torture_context *tctx)
+bool torture_holdcon(struct torture_context *tctx)
 {
        int i;
        struct smbcli_state **cli;
@@ -194,8 +193,8 @@ BOOL torture_holdcon(struct torture_context *tctx)
        cli = malloc_array_p(struct smbcli_state *, torture_numops);
 
        for (i=0;i<torture_numops;i++) {
-               if (!torture_open_connection(&cli[i], i)) {
-                       return False;
+               if (!torture_open_connection(&cli[i], tctx, i)) {
+                       return false;
                }
                if (torture_setting_bool(tctx, "progress", true)) {
                        torture_comment(tctx, "opened %d connections\r", i);
@@ -228,34 +227,97 @@ BOOL torture_holdcon(struct torture_context *tctx)
                fflush(stdout);
        }
 
-       return True;
+       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
 */
-BOOL run_maxfidtest(struct torture_context *tctx, struct smbcli_state *cli, int dummy)
+bool run_maxfidtest(struct torture_context *tctx, struct smbcli_state *cli, int dummy)
 {
 #define MAXFID_TEMPLATE "\\maxfid\\fid%d\\maxfid.%d.%d"
        char *fname;
        int fnums[0x11000], i;
        int retries=4, maxfid;
-       BOOL correct = True;
+       bool correct = true;
 
        if (retries <= 0) {
                torture_comment(tctx, "failed to connect\n");
-               return False;
+               return false;
        }
 
        if (smbcli_deltree(cli->tree, "\\maxfid") == -1) {
                torture_comment(tctx, "Failed to deltree \\maxfid - %s\n",
                       smbcli_errstr(cli->tree));
-               return False;
+               return false;
        }
        if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, "\\maxfid"))) {
                torture_comment(tctx, "Failed to mkdir \\maxfid, error=%s\n", 
                       smbcli_errstr(cli->tree));
-               return False;
+               return false;
        }
 
        torture_comment(tctx, "Testing maximum number of open files\n");
@@ -266,7 +328,7 @@ BOOL run_maxfidtest(struct torture_context *tctx, struct smbcli_state *cli, int
                        if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, fname))) {
                                torture_comment(tctx, "Failed to mkdir %s, error=%s\n", 
                                       fname, smbcli_errstr(cli->tree));
-                               return False;
+                               return false;
                        }
                        free(fname);
                }
@@ -299,7 +361,7 @@ BOOL run_maxfidtest(struct torture_context *tctx, struct smbcli_state *cli, int
                if (NT_STATUS_IS_ERR(smbcli_unlink(cli->tree, fname))) {
                        torture_comment(tctx, "unlink of %s failed (%s)\n", 
                               fname, smbcli_errstr(cli->tree));
-                       correct = False;
+                       correct = false;
                }
                free(fname);
 
@@ -310,7 +372,7 @@ BOOL run_maxfidtest(struct torture_context *tctx, struct smbcli_state *cli, int
                if (NT_STATUS_IS_ERR(smbcli_unlink(cli->tree, fname))) {
                        torture_comment(tctx, "unlink of %s failed (%s)\n", 
                               fname, smbcli_errstr(cli->tree));
-                       correct = False;
+                       correct = false;
                }
                free(fname);
 
@@ -324,12 +386,12 @@ BOOL run_maxfidtest(struct torture_context *tctx, struct smbcli_state *cli, int
        if (smbcli_deltree(cli->tree, "\\maxfid") == -1) {
                torture_comment(tctx, "Failed to deltree \\maxfid - %s\n",
                       smbcli_errstr(cli->tree));
-               return False;
+               return false;
        }
 
        torture_comment(tctx, "maxfid test finished\n");
        if (!torture_close_connection(cli)) {
-               correct = False;
+               correct = false;
        }
        return correct;
 #undef MAXFID_TEMPLATE
@@ -340,7 +402,7 @@ BOOL run_maxfidtest(struct torture_context *tctx, struct smbcli_state *cli, int
 /*
   sees what IOCTLs are supported
  */
-BOOL torture_ioctl_test(struct torture_context *tctx, 
+bool torture_ioctl_test(struct torture_context *tctx, 
                                                struct smbcli_state *cli)
 {
        uint16_t device, function;
@@ -357,7 +419,7 @@ BOOL torture_ioctl_test(struct torture_context *tctx,
        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;
+               return false;
        }
 
        parms.ioctl.level = RAW_IOCTL_IOCTL;
@@ -379,7 +441,7 @@ BOOL torture_ioctl_test(struct torture_context *tctx,
                }
        }
 
-       return True;
+       return true;
 }
 
 static void benchrw_callback(struct smbcli_request *req);
@@ -442,12 +504,12 @@ static int init_benchrw_params(struct torture_context *tctx,
        lpar->writeratio = torture_setting_int(tctx, "writeratio",5);
        lpar->num_parallel_requests = torture_setting_int(
                tctx, "parallel_requests", 5);
-       lpar->workgroup = lp_workgroup(global_loadparm);
+       lpar->workgroup = lp_workgroup(tctx->lp_ctx);
        
        p = torture_setting_string(tctx, "unclist", NULL);
        if (p) {
                char *h, *s;
-               unc_list = file_lines_load(p, &num_unc_names, NULL);
+               unc_list = file_lines_load(p, &num_unc_names, 0, NULL);
                if (!unc_list || num_unc_names <= 0) {
                        torture_comment(tctx, "Failed to load unc names list "
                                        "from '%s'\n", p);
@@ -509,7 +571,7 @@ static NTSTATUS benchrw_close(struct torture_context *tctx,
        NT_STATUS_HAVE_NO_MEMORY(req);
        /*register the callback function!*/
        req->async.fn = benchrw_callback;
-       req->async.private = state;
+       req->async.private_data = state;
        
        return NT_STATUS_OK;
 }
@@ -520,7 +582,7 @@ static void benchrw_callback(struct smbcli_request *req);
 
 static void benchrw_rw_callback(struct smbcli_request *req)
 {
-       struct benchrw_state *state = req->async.private;
+       struct benchrw_state *state = req->async.private_data;
        struct torture_context *tctx = state->tctx;
 
        if (!NT_STATUS_IS_OK(req->status)) {
@@ -582,7 +644,7 @@ static NTSTATUS benchrw_readwrite(struct torture_context *tctx,
                rd.readx.in.maxcnt      = rd.readx.in.mincnt;
                rd.readx.in.remaining   = 0     ;
                rd.readx.out.data       = state->buffer;
-               rd.readx.in.read_for_execute = False;
+               rd.readx.in.read_for_execute = false;
                if(state->readcnt < state->lp_params->writeblocks){
                        state->readcnt++;       
                }else{
@@ -595,7 +657,7 @@ static NTSTATUS benchrw_readwrite(struct torture_context *tctx,
        NT_STATUS_HAVE_NO_MEMORY(req);
        /*register the callback function!*/
        req->async.fn = benchrw_rw_callback;
-       req->async.private = state;
+       req->async.private_data = state;
        
        return NT_STATUS_OK;
 }
@@ -643,7 +705,7 @@ static NTSTATUS benchrw_open(struct torture_context *tctx,
        
        /*register the callback function!*/
        req->async.fn = benchrw_callback;
-       req->async.private = state;
+       req->async.private_data = state;
        return NT_STATUS_OK;
 } 
 
@@ -690,7 +752,7 @@ static NTSTATUS benchrw_mkdir(struct torture_context *tctx,
        
        /*register the callback function!*/
        req->async.fn = benchrw_callback;
-       req->async.private = state;
+       req->async.private_data = state;
                
        return NT_STATUS_OK;
 }
@@ -700,7 +762,7 @@ static NTSTATUS benchrw_mkdir(struct torture_context *tctx,
 */
 static void benchrw_callback(struct smbcli_request *req)
 {
-       struct benchrw_state *state = req->async.private;
+       struct benchrw_state *state = req->async.private_data;
        struct torture_context *tctx = state->tctx;
        
        /*dont send new requests when torture_numops is reached*/
@@ -807,7 +869,7 @@ static struct composite_context *torture_connect_async(
                                struct torture_context *tctx,
                                struct smb_composite_connect *smb,
                                TALLOC_CTX *mem_ctx,
-                               struct event_context *ev,
+                               struct tevent_context *ev,
                                const char *host,
                                const char *share,
                                const char *workgroup)
@@ -815,29 +877,35 @@ static struct composite_context *torture_connect_async(
        torture_comment(tctx, "Open Connection to %s/%s\n",host,share);
        smb->in.dest_host=talloc_strdup(mem_ctx,host);
        smb->in.service=talloc_strdup(mem_ctx,share);
-       smb->in.port=0;
+       smb->in.dest_ports=lp_smb_ports(tctx->lp_ctx);
+       smb->in.socket_options = lp_socket_options(tctx->lp_ctx);
        smb->in.called_name = strupper_talloc(mem_ctx, host);
        smb->in.service_type=NULL;
        smb->in.credentials=cmdline_credentials;
-       smb->in.fallback_to_anonymous=False;
+       smb->in.fallback_to_anonymous=false;
+       smb->in.iconv_convenience = lp_iconv_convenience(tctx->lp_ctx);
+       smb->in.gensec_settings = lp_gensec_settings(mem_ctx, tctx->lp_ctx);
        smb->in.workgroup=workgroup;
+       lp_smbcli_options(tctx->lp_ctx, &smb->in.options);
+       lp_smbcli_session_options(tctx->lp_ctx, &smb->in.session_options);
        
-       return smb_composite_connect_send(smb,mem_ctx,ev);
+       return smb_composite_connect_send(smb,mem_ctx,
+                                         lp_resolve_context(tctx->lp_ctx),ev);
 }
 
-BOOL run_benchrw(struct torture_context *tctx)
+bool run_benchrw(struct torture_context *tctx)
 {
        struct smb_composite_connect *smb_con;
        const char *fname = "\\rwtest.dat";
        struct smbcli_request *req;
        struct benchrw_state **state;
        int i , num_unc_names;
-       struct event_context    *ev     ;       
+       struct tevent_context   *ev     ;       
        struct composite_context *req1;
        struct params lpparams;
        union smb_mkdir parms;
        int finished = 0;
-       BOOL success=True;
+       bool success=true;
        int torture_nprocs = torture_setting_int(tctx, "nprocs", 4);
        
        torture_comment(tctx, "Start BENCH-READWRITE num_ops=%d "
@@ -906,12 +974,12 @@ BOOL run_benchrw(struct torture_context *tctx)
                                req = smb_raw_mkdir_send(state[i]->cli,&parms);
                                /* register callback fn + private data */
                                req->async.fn = benchrw_callback;
-                               req->async.private=state[i];
+                               req->async.private_data=state[i];
                                break;
                        /* error occured , finish */
                        case ERROR:
                                finished++;
-                               success=False;
+                               success=false;
                                break;
                        /* cleanup , close connection */
                        case CLEANUP: