Small modifications to improve the information displayed after running the
[barrelfish] / usr / tests / net_tests / nfs_throughput / nfs_cat.c
1 /**
2  * \file
3  * \brief throughput testing program
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2009, 2010, 2011 ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <assert.h>
18 #include <string.h>
19 #include <unistd.h>
20 #include <errno.h>
21
22 // Specific for barrelfish
23 #include <barrelfish/barrelfish.h>
24 #include <vfs/vfs.h>
25 #include <lwip/init.h>
26 #include <barrelfish/nameservice_client.h>
27 #include <barrelfish/waitset.h>
28 #include <contmng/netbench.h>
29
30 #define MOUNT_DIR   "/nfs"
31
32 //uint8_t buf[1024 * 1024];
33 uint8_t buf[1024 * 128];
34
35 // reads the file over nfs
36 static int cat(char *path)
37 {
38     size_t size;
39     vfs_handle_t vh;
40     errval_t err;
41     uint64_t filesize = 0;
42
43     err = vfs_open(path, &vh);
44     if (err_is_fail(err)) {
45         printf("%s: file not found\n", path);
46         return 0;
47     }
48
49     uint64_t start = rdtsc();
50     lwip_benchmark_control(1, BMS_START_REQUEST, 0, 0);
51     do {
52         err = vfs_read(vh, buf, sizeof(buf), &size);
53         if (err_is_fail(err)) {
54             // XXX: Close any files that might be open
55             DEBUG_ERR(err, "error reading file");
56             return 0;
57         }
58
59         filesize += size;
60 //      fwrite(buf, 1, size, stdout);
61     } while(size > 0);
62
63     // record stop time
64     uint64_t stop = rdtsc();
65     printf("Everythin done\n");
66     lwip_print_interesting_stats();
67     double speed = ((filesize/in_seconds(stop - start))/(1024 * 1024));
68     if (speed < 50) {
69         printf("Warning: NFS throughput too low!! [%f]\n", speed);
70     }
71     printf("## Data size = %f MB,  Processing time [%"PU"], speed [%f] MB/s\n",
72            filesize/(double)(1024 * 1024), in_seconds(stop - start),
73            speed);
74
75     err = vfs_close(vh);
76     if (err_is_fail(err)) {
77             DEBUG_ERR(err, "in vfs_close");
78     }
79
80     return filesize;
81 }
82
83 int main(int argc, char**argv)
84 {
85
86     if(argc < 3) {
87         printf("Usage: %s mount-URL filepath\n", argv[0]);
88         printf("Example: %s nfs://10.110.4.41/shared  /nfs/pravin/601.avi\n",
89                 argv[0]);
90         exit(EXIT_FAILURE);
91     }
92
93     errval_t err = vfs_mkdir(MOUNT_DIR);
94     if(err_is_fail(err)) {
95         DEBUG_ERR(err, "vfs_mount");
96     }
97
98     err = vfs_mount(MOUNT_DIR, argv[1]);
99     if(err_is_fail(err)) {
100         DEBUG_ERR(err, "vfs_mount");
101     }
102     assert(err_is_ok(err));
103     printf("mount done\n");
104
105     printf("reading file [%s]\n", argv[2]);
106     cat(argv[2]);
107     printf("Benchmark done.\n");
108
109     struct waitset *ws = get_default_waitset();
110     while (1) {
111         err = event_dispatch(ws);
112         if (err_is_fail(err)) {
113             DEBUG_ERR(err, "in event_dispatch");
114             break;
115         }
116     }
117
118 }