r23533: added --option torture:targetrate=rate to target a particular
authorAndrew Tridgell <tridge@samba.org>
Sun, 17 Jun 2007 20:03:31 +0000 (20:03 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:53:25 +0000 (14:53 -0500)
throughput in MBytes/sec

source/torture/nbench/nbench.c
source/torture/nbench/nbio.c

index eb67e15fbb3896665bc508eb0df4ef671fcbaff4..f14da8cd15ccc70d874b82270f1f8aa9377544d5 100644 (file)
@@ -46,6 +46,11 @@ static BOOL run_netbench(struct torture_context *tctx, struct smbcli_state *cli,
        char *cname;
        FILE *f;
        BOOL correct = True;
+       double target_rate = lp_parm_double(-1, "torture", "targetrate", 0);    
+
+       if (target_rate != 0) {
+               printf("Targetting %.4f MByte/sec\n", target_rate);
+       }
 
        if (torture_nprocs == 1) {
                if (!read_only && !torture_setup_dir(cli, "\\clients")) {
@@ -86,6 +91,8 @@ again:
                        nbio_time_delay(targett);
                        params++;
                        i--;
+               } else if (target_rate != 0) {
+                       nbio_target_rate(target_rate);
                }
 
                if (i < 2 || params[0][0] == '#') continue;
index a382c92ceb9ed2da5cb7caa0ccc01be3edceb554..f093ad82b041ee26d18e162cd14100533c43088b 100644 (file)
@@ -57,6 +57,29 @@ static struct {
        struct timeval starttime;
 } *children;
 
+void nbio_target_rate(double rate)
+{
+       static double last_bytes;
+       static struct timeval last_time;
+       double tdelay;
+
+       if (last_bytes == 0) {
+               last_bytes = children[nbio_id].bytes;
+               last_time = timeval_current();
+               return;
+       }
+
+       tdelay = (children[nbio_id].bytes - last_bytes)/(1.0e6*rate) - timeval_elapsed(&last_time);
+       if (tdelay > 0) {
+               msleep(tdelay*1000);
+       } else {
+               children[nbio_id].max_latency = MAX(children[nbio_id].max_latency, -tdelay);
+       }
+
+       last_time = timeval_current();
+       last_bytes = children[nbio_id].bytes;
+}
+
 void nbio_time_reset(void)
 {
        children[nbio_id].starttime = timeval_current();        
@@ -68,7 +91,7 @@ void nbio_time_delay(double targett)
        if (targett > elapsed) {
                msleep(1000*(targett - elapsed));
        } else if (elapsed - targett > children[nbio_id].max_latency) {
-               children[nbio_id].max_latency = elapsed - targett;
+               children[nbio_id].max_latency = MAX(elapsed - targett, children[nbio_id].max_latency);
        }
 }