diff options
Diffstat (limited to 'source4/torture/basic')
-rw-r--r-- | source4/torture/basic/misc.c | 206 |
1 files changed, 117 insertions, 89 deletions
diff --git a/source4/torture/basic/misc.c b/source4/torture/basic/misc.c index 3e88e05550..8f6fa66ca4 100644 --- a/source4/torture/basic/misc.c +++ b/source4/torture/basic/misc.c @@ -36,47 +36,6 @@ #include "libcli/composite/composite.h" extern struct cli_credentials *cmdline_credentials; -static void benchrw_callback(struct smbcli_request *req); -enum benchrw_stage { - START, - OPEN_CONNECTION, - CLEANUP_TESTDIR, - MK_TESTDIR, - OPEN_FILE, - INITIAL_WRITE, - READ_WRITE_DATA, - MAX_OPS_REACHED, - ERROR, - CLOSE_FILE, - CLEANUP, - FINISHED -}; - -struct benchrw_state{ - struct torture_context *tctx; - char *dname; - char *fname; - uint16_t fnum; - int nr; - struct smbcli_tree *cli; - uint8_t *buffer; - int writecnt; - int readcnt; - int completed; - void *req_params; - enum benchrw_stage mode; - struct params{ - struct unclist{ - const char *host; - const char *share; - } **unc; - const char *workgroup; - int retry; - unsigned int writeblocks; - unsigned int blocksize; - unsigned int writeratio; - } *lp_params; - }; static BOOL wait_lock(struct smbcli_state *c, int fnum, uint32_t offset, uint32_t len) { @@ -409,11 +368,54 @@ BOOL torture_ioctl_test(struct torture_context *tctx, return True; } +static void benchrw_callback(struct smbcli_request *req); +enum benchrw_stage { + START, + OPEN_CONNECTION, + CLEANUP_TESTDIR, + MK_TESTDIR, + OPEN_FILE, + INITIAL_WRITE, + READ_WRITE_DATA, + MAX_OPS_REACHED, + ERROR, + CLOSE_FILE, + CLEANUP, + FINISHED +}; + +struct benchrw_state { + struct torture_context *tctx; + char *dname; + char *fname; + uint16_t fnum; + int nr; + struct smbcli_tree *cli; + uint8_t *buffer; + int writecnt; + int readcnt; + int completed; + void *req_params; + enum benchrw_stage mode; + struct params{ + struct unclist{ + const char *host; + const char *share; + } **unc; + const char *workgroup; + int retry; + unsigned int writeblocks; + unsigned int blocksize; + unsigned int writeratio; + } *lp_params; +}; + /* init params using lp_parm_xxx return number of unclist entries */ -static int init_benchrw_params(struct torture_context *tctx, struct params *lpar) +static int init_benchrw_params(struct torture_context *tctx, + struct params *lpar) { char **unc_list = NULL; int num_unc_names = 0, conn_index=0, empty_lines=0; @@ -429,33 +431,41 @@ static int init_benchrw_params(struct torture_context *tctx, struct params *lpar char *h, *s; unc_list = file_lines_load(p, &num_unc_names, NULL); if (!unc_list || num_unc_names <= 0) { - torture_comment(tctx, "Failed to load unc names list from '%s'\n", p); + torture_comment(tctx, "Failed to load unc names list " + "from '%s'\n", p); exit(1); } - lpar->unc = talloc_array(tctx, struct unclist *, (num_unc_names-empty_lines)); + lpar->unc = talloc_array(tctx, struct unclist *, + (num_unc_names-empty_lines)); for(conn_index = 0; conn_index < num_unc_names; conn_index++) { /* ignore empty lines */ if(strlen(unc_list[conn_index % num_unc_names])==0){ empty_lines++; continue; } - if (!smbcli_parse_unc(unc_list[conn_index % num_unc_names], - NULL, &h, &s)) { - torture_comment(tctx, "Failed to parse UNC name %s\n", - unc_list[conn_index % num_unc_names]); + if (!smbcli_parse_unc( + unc_list[conn_index % num_unc_names], + NULL, &h, &s)) { + torture_comment( + tctx, "Failed to parse UNC " + "name %s\n", + unc_list[conn_index % num_unc_names]); exit(1); } - lpar->unc[conn_index-empty_lines] = talloc(tctx,struct unclist); - lpar->unc[conn_index-empty_lines]->host = h; - lpar->unc[conn_index-empty_lines]->share = s; + lpar->unc[conn_index-empty_lines] = + talloc(tctx, struct unclist); + lpar->unc[conn_index-empty_lines]->host = h; + lpar->unc[conn_index-empty_lines]->share = s; } return num_unc_names-empty_lines; }else{ lpar->unc = talloc_array(tctx, struct unclist *, 1); lpar->unc[0] = talloc(tctx,struct unclist); - lpar->unc[0]->host = torture_setting_string(tctx, "host", NULL); - lpar->unc[0]->share = torture_setting_string(tctx, "share", NULL); + lpar->unc[0]->host = torture_setting_string(tctx, "host", + NULL); + lpar->unc[0]->share = torture_setting_string(tctx, "share", + NULL); return 1; } } @@ -463,8 +473,9 @@ static int init_benchrw_params(struct torture_context *tctx, struct params *lpar /* Called when the reads & writes are finished. closes the file. */ -static NTSTATUS benchrw_close(struct torture_context *tctx,struct smbcli_request *req, - struct benchrw_state *state) +static NTSTATUS benchrw_close(struct torture_context *tctx, + struct smbcli_request *req, + struct benchrw_state *state) { union smb_close close_parms; @@ -488,8 +499,9 @@ static NTSTATUS benchrw_close(struct torture_context *tctx,struct smbcli_request /* Called when the initial write is completed is done. write or read a file. */ -static NTSTATUS benchrw_readwrite(struct torture_context *tctx,struct smbcli_request *req, - struct benchrw_state *state) +static NTSTATUS benchrw_readwrite(struct torture_context *tctx, + struct smbcli_request *req, + struct benchrw_state *state) { union smb_read rd; union smb_write wr; @@ -512,7 +524,8 @@ static NTSTATUS benchrw_readwrite(struct torture_context *tctx,struct smbcli_req state->readcnt=0; req = smb_raw_write_send(state->cli,&wr); }else{ - torture_comment(tctx, "Callback READ file:%d (%d/%d) Offset:%d\n", + torture_comment(tctx, + "Callback READ file:%d (%d/%d) Offset:%d\n", state->nr,state->completed,torture_numops, (state->readcnt*state->lp_params->blocksize)); rd.generic.level = RAW_READ_READ ; @@ -541,8 +554,9 @@ static NTSTATUS benchrw_readwrite(struct torture_context *tctx,struct smbcli_req /* Called when the open is done. writes to the file. */ -static NTSTATUS benchrw_open(struct torture_context *tctx,struct smbcli_request *req, - struct benchrw_state *state) +static NTSTATUS benchrw_open(struct torture_context *tctx, + struct smbcli_request *req, + struct benchrw_state *state) { union smb_write wr; if(state->mode == OPEN_FILE){ @@ -587,8 +601,9 @@ static NTSTATUS benchrw_open(struct torture_context *tctx,struct smbcli_request /* Called when the mkdir is done. Opens a file. */ -static NTSTATUS benchrw_mkdir(struct torture_context *tctx,struct smbcli_request *req, - struct benchrw_state *state) +static NTSTATUS benchrw_mkdir(struct torture_context *tctx, + struct smbcli_request *req, + struct benchrw_state *state) { union smb_open *open_parms; uint8_t *writedata; @@ -597,7 +612,7 @@ static NTSTATUS benchrw_mkdir(struct torture_context *tctx,struct smbcli_request /* open/create the files */ torture_comment(tctx, "Open File %d/%d\n",state->nr+1, - lp_parm_int(-1, "torture", "nprocs", 4)); + lp_parm_int(-1, "torture", "nprocs", 4)); open_parms=talloc_zero(tctx, union smb_open); NT_STATUS_HAVE_NO_MEMORY(open_parms); open_parms->openx.level = RAW_OPEN_OPENX; @@ -648,9 +663,10 @@ static void benchrw_callback(struct smbcli_request *req) switch (state->mode) { case MK_TESTDIR: - if (!NT_STATUS_IS_OK(benchrw_mkdir(tctx, req,state))) { - torture_comment(tctx, "Failed to create the test directory - %s\n", - nt_errstr(req->status)); + if (!NT_STATUS_IS_OK(benchrw_mkdir(tctx, req,state))) { + torture_comment(tctx, "Failed to create the test " + "directory - %s\n", + nt_errstr(req->status)); state->mode=ERROR; return; } @@ -658,24 +674,27 @@ static void benchrw_callback(struct smbcli_request *req) case OPEN_FILE: case INITIAL_WRITE: if (!NT_STATUS_IS_OK(benchrw_open(tctx, req,state))){ - torture_comment(tctx, "Failed to open/write the file - %s\n", - nt_errstr(req->status)); + torture_comment(tctx, "Failed to open/write the " + "file - %s\n", + nt_errstr(req->status)); state->mode=ERROR; return; } break; case READ_WRITE_DATA: if (!NT_STATUS_IS_OK(benchrw_readwrite(tctx,req,state))){ - torture_comment(tctx, "Failed to read/write the file - %s\n", - nt_errstr(req->status)); + torture_comment(tctx, "Failed to read/write the " + "file - %s\n", + nt_errstr(req->status)); state->mode=ERROR; return; } break; case MAX_OPS_REACHED: if (!NT_STATUS_IS_OK(benchrw_close(tctx,req,state))){ - torture_comment(tctx, "Failed to read/write/close the file - %s\n", - nt_errstr(req->status)); + torture_comment(tctx, "Failed to read/write/close " + "the file - %s\n", + nt_errstr(req->status)); state->mode=ERROR; return; } @@ -683,8 +702,9 @@ static void benchrw_callback(struct smbcli_request *req) case CLOSE_FILE: torture_comment(tctx, "File %d closed\n",state->nr); if (!NT_STATUS_IS_OK(req->status)) { - torture_comment(tctx, "Failed to close the file - %s\n", - nt_errstr(req->status)); + torture_comment(tctx, "Failed to close the " + "file - %s\n", + nt_errstr(req->status)); state->mode=ERROR; return; } @@ -709,13 +729,15 @@ static void async_open_callback(struct composite_context *con) state->mode=CLEANUP_TESTDIR; }else{ if(state->writecnt < retry){ - torture_comment(tctx, "Failed to open connection:%d, Retry (%d/%d)\n", + torture_comment(tctx, "Failed to open connection: " + "%d, Retry (%d/%d)\n", state->nr,state->writecnt,retry); state->writecnt++; state->mode=START; usleep(1000); }else{ - torture_comment(tctx, "Failed to open connection (%d) - %s\n", + torture_comment(tctx, "Failed to open connection " + "(%d) - %s\n", state->nr, nt_errstr(con->status)); state->mode=ERROR; } @@ -763,8 +785,9 @@ BOOL run_benchrw(struct torture_context *tctx) BOOL success=True; int torture_nprocs = lp_parm_int(-1, "torture", "nprocs", 4); - torture_comment(tctx, "Start BENCH-READWRITE num_ops=%d num_nprocs=%d\n", - torture_numops, torture_nprocs); + torture_comment(tctx, "Start BENCH-READWRITE num_ops=%d " + "num_nprocs=%d\n", + torture_numops, torture_nprocs); /*init talloc context*/ ev = event_context_init(tctx); @@ -782,7 +805,7 @@ BOOL run_benchrw(struct torture_context *tctx) state[i]->nr=i; state[i]->dname=talloc_asprintf(tctx,"benchrw%d",i); state[i]->fname=talloc_asprintf(tctx,"%s%s", - state[i]->dname,fname); + state[i]->dname,fname); state[i]->mode=START; state[i]->writecnt=0; } @@ -794,14 +817,15 @@ BOOL run_benchrw(struct torture_context *tctx) switch (state[i]->mode){ /*open multiple connections with the same userid */ case START: - smb_con = talloc(tctx,struct smb_composite_connect) ; + smb_con = talloc( + tctx,struct smb_composite_connect) ; state[i]->req_params=smb_con; state[i]->mode=OPEN_CONNECTION; - req1 = torture_connect_async(tctx, smb_con, - tctx,ev, - lpparams.unc[i % num_unc_names]->host, - lpparams.unc[i % num_unc_names]->share, - lpparams.workgroup); + req1 = torture_connect_async( + tctx, smb_con, tctx,ev, + lpparams.unc[i % num_unc_names]->host, + lpparams.unc[i % num_unc_names]->share, + lpparams.workgroup); /* register callback fn + private data */ req1->async.fn = async_open_callback; req1->async.private_data=state[i]; @@ -812,7 +836,9 @@ BOOL run_benchrw(struct torture_context *tctx) smb_raw_exit(state[i]->cli->session); if (smbcli_deltree(state[i]->cli, state[i]->dname) == -1) { - torture_comment(tctx, "Unable to delete %s - %s\n", + torture_comment( + tctx, + "Unable to delete %s - %s\n", state[i]->dname, smbcli_errstr(state[i]->cli)); state[i]->mode=ERROR; @@ -833,12 +859,14 @@ BOOL run_benchrw(struct torture_context *tctx) break; /* cleanup , close connection */ case CLEANUP: - torture_comment(tctx, "Deleting test dir %s %d/%d\n",state[i]->dname, + torture_comment(tctx, "Deleting test dir %s " + "%d/%d\n",state[i]->dname, i+1,torture_nprocs); smbcli_deltree(state[i]->cli,state[i]->dname); if (NT_STATUS_IS_ERR(smb_tree_disconnect( - state[i]->cli))) { - torture_comment(tctx, "ERROR: Tree disconnect failed"); + state[i]->cli))) { + torture_comment(tctx, "ERROR: Tree " + "disconnect failed"); state[i]->mode=ERROR; break; } |