Merge with barrelfish.net tree
[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     vfs_init();
86
87     if(argc < 3) {
88         printf("Usage: %s mount-URL filepath\n", argv[0]);
89         printf("Example: %s nfs://10.110.4.41/shared  /nfs/pravin/601.avi\n",
90                 argv[0]);
91         exit(EXIT_FAILURE);
92     }
93
94     errval_t err = vfs_mkdir(MOUNT_DIR);
95     if(err_is_fail(err)) {
96         DEBUG_ERR(err, "vfs_mount");
97     }
98
99     err = vfs_mount(MOUNT_DIR, argv[1]);
100     if(err_is_fail(err)) {
101         DEBUG_ERR(err, "vfs_mount");
102     }
103     assert(err_is_ok(err));
104     printf("mount done\n");
105
106     printf("reading file [%s]\n", argv[2]);
107     cat(argv[2]);
108     printf("Benchmark done.\n");
109
110     struct waitset *ws = get_default_waitset();
111     while (1) {
112         err = event_dispatch(ws);
113         if (err_is_fail(err)) {
114             DEBUG_ERR(err, "in event_dispatch");
115             break;
116         }
117     }
118
119 }