net: splitting contmng and netbench libraries, simplyfing dependencies
[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 <netbench/netbench.h>
29
30 #define MOUNT_DIR   "/nfs"
31
32 // reads the file over nfs
33 static int cat(char *path)
34 {
35     size_t size;
36     vfs_handle_t vh;
37     errval_t err;
38     uint64_t filesize = 0;
39
40     err = vfs_open(path, &vh);
41     if (err_is_fail(err)) {
42         printf("%s: file not found\n", path);
43         return 0;
44     }
45
46     struct vfs_fileinfo info;
47     err = vfs_stat(vh, &info);
48     if(err_is_fail(err)){
49         printf("Could not stat file %s\n", path);
50     }
51     printf("Reading %d bytes from %s.\n", (int)info.size, path);
52     void *buf = malloc(info.size);
53     assert(buf);
54
55     uint64_t start = rdtsc();
56     lwip_benchmark_control(1, BMS_START_REQUEST, 0, 0);
57
58         err = vfs_read(vh, buf, info.size, &size);
59         if (err_is_fail(err)) {
60                 // XXX: Close any files that might be open
61                 DEBUG_ERR(err, "error reading file");
62                 return 0;
63         }
64         assert(info.size == size);
65         filesize += size;
66
67     // record stop time
68     uint64_t stop = rdtsc();
69     printf("Everything done\n");
70     lwip_print_interesting_stats();
71     double speed = ((filesize/in_seconds(stop - start))/(1024 * 1024));
72     if (speed < 50) {
73         printf("Warning: NFS throughput too low!! [%f]\n", speed);
74     }
75     printf("## Data size = %f MB,  Processing time [%"PU"], speed [%f] MB/s\n",
76            filesize/(double)(1024 * 1024), in_seconds(stop - start),
77            speed);
78
79     err = vfs_close(vh);
80     if (err_is_fail(err)) {
81             DEBUG_ERR(err, "in vfs_close");
82     }
83     free(buf);
84     return filesize;
85 }
86
87 int main(int argc, char**argv)
88 {
89     vfs_init();
90
91     if(argc < 3) {
92         printf("Usage: %s mount-URL filepath\n", argv[0]);
93         printf("Example: %s nfs://10.110.4.41/shared  /nfs/pravin/601.avi\n",
94                 argv[0]);
95         exit(EXIT_FAILURE);
96     }
97
98     errval_t err = vfs_mkdir(MOUNT_DIR);
99     if(err_is_fail(err)) {
100         DEBUG_ERR(err, "vfs_mount");
101     }
102
103     err = vfs_mount(MOUNT_DIR, argv[1]);
104     if(err_is_fail(err)) {
105         DEBUG_ERR(err, "vfs_mount");
106     }
107     assert(err_is_ok(err));
108     printf("mount done\n");
109
110     printf("reading file 1. time [%s]\n", argv[2]);
111     cat(argv[2]);
112     printf("receive 1 done.\n");
113
114     /*
115     printf("reading file 2. time [%s]\n", argv[2]);
116         cat(argv[2]);
117         printf("receive 2 done.\n"); */
118         printf("All done.\n");
119
120     struct waitset *ws = get_default_waitset();
121     while (1) {
122         err = event_dispatch(ws);
123         if (err_is_fail(err)) {
124             DEBUG_ERR(err, "in event_dispatch");
125             break;
126         }
127     }
128
129 }