summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/torture/basic/misc.c74
1 files changed, 57 insertions, 17 deletions
diff --git a/source4/torture/basic/misc.c b/source4/torture/basic/misc.c
index 8f6fa66ca4..13dcf5da93 100644
--- a/source4/torture/basic/misc.c
+++ b/source4/torture/basic/misc.c
@@ -395,6 +395,7 @@ struct benchrw_state {
int writecnt;
int readcnt;
int completed;
+ int num_parallel_requests;
void *req_params;
enum benchrw_stage mode;
struct params{
@@ -407,6 +408,7 @@ struct benchrw_state {
unsigned int writeblocks;
unsigned int blocksize;
unsigned int writeratio;
+ int num_parallel_requests;
} *lp_params;
};
@@ -424,6 +426,8 @@ static int init_benchrw_params(struct torture_context *tctx,
lpar->blocksize = torture_setting_int(tctx, "blocksize",65535);
lpar->writeblocks = torture_setting_int(tctx, "writeblocks",15);
lpar->writeratio = torture_setting_int(tctx, "writeratio",5);
+ lpar->num_parallel_requests = torture_setting_int(
+ tctx, "parallel_requests", 5);
lpar->workgroup = lp_workgroup();
p = torture_setting_string(tctx, "unclist", NULL);
@@ -496,22 +500,50 @@ static NTSTATUS benchrw_close(struct torture_context *tctx,
return NT_STATUS_OK;
}
+static NTSTATUS benchrw_readwrite(struct torture_context *tctx,
+ struct benchrw_state *state);
+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 torture_context *tctx = state->tctx;
+
+ if (!NT_STATUS_IS_OK(req->status)) {
+ state->mode = ERROR;
+ return;
+ }
+
+ state->completed++;
+ state->num_parallel_requests--;
+
+ if ((state->completed >= torture_numops)
+ && (state->num_parallel_requests == 0)) {
+ benchrw_callback(req);
+ talloc_free(req);
+ return;
+ }
+
+ talloc_free(req);
+
+ if (state->completed + state->num_parallel_requests
+ < torture_numops) {
+ benchrw_readwrite(tctx, state);
+ }
+}
+
/*
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)
{
+ struct smbcli_request *req;
union smb_read rd;
union smb_write wr;
- NT_STATUS_NOT_OK_RETURN(req->status);
- talloc_free(req);
-
- state->completed++;
- /*rotate between writes and reads*/
- if( state->completed % state->lp_params->writeratio == 0){
+ /* randomize between writes and reads*/
+ if ( random() % state->lp_params->writeratio == 0) {
torture_comment(tctx, "Callback WRITE file:%d (%d/%d)\n",
state->nr,state->completed,torture_numops);
wr.generic.level = RAW_WRITE_WRITEX ;
@@ -523,7 +555,8 @@ static NTSTATUS benchrw_readwrite(struct torture_context *tctx,
wr.writex.in.data = state->buffer;
state->readcnt=0;
req = smb_raw_write_send(state->cli,&wr);
- }else{
+ }
+ else {
torture_comment(tctx,
"Callback READ file:%d (%d/%d) Offset:%d\n",
state->nr,state->completed,torture_numops,
@@ -543,9 +576,10 @@ static NTSTATUS benchrw_readwrite(struct torture_context *tctx,
}
req = smb_raw_read_send(state->cli,&rd);
}
+ state->num_parallel_requests += 1;
NT_STATUS_HAVE_NO_MEMORY(req);
/*register the callback function!*/
- req->async.fn = benchrw_callback;
+ req->async.fn = benchrw_rw_callback;
req->async.private = state;
return NT_STATUS_OK;
@@ -655,8 +689,8 @@ static void benchrw_callback(struct smbcli_request *req)
struct torture_context *tctx = state->tctx;
/*dont send new requests when torture_numops is reached*/
- if(state->completed >= torture_numops){
- state->completed=0;
+ if ((state->mode == READ_WRITE_DATA)
+ && (state->completed >= torture_numops)) {
state->mode=MAX_OPS_REACHED;
}
@@ -682,12 +716,17 @@ static void benchrw_callback(struct smbcli_request *req)
}
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));
- state->mode=ERROR;
- return;
+ while (state->num_parallel_requests
+ < state->lp_params->num_parallel_requests) {
+ NTSTATUS status;
+ status = benchrw_readwrite(tctx,state);
+ if (!NT_STATUS_IS_OK(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:
@@ -801,6 +840,7 @@ BOOL run_benchrw(struct torture_context *tctx)
state[i]=talloc(tctx,struct benchrw_state);
state[i]->tctx = tctx;
state[i]->completed=0;
+ state[i]->num_parallel_requests=0;
state[i]->lp_params=&lpparams;
state[i]->nr=i;
state[i]->dname=talloc_asprintf(tctx,"benchrw%d",i);