Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
0bcdde574af11bd12bd993093c4ee47c6c673ac3
[simgrid.git] / examples / amok / bandwidth / bandwidth.c
1 /* bandwidth - bandwidth test demo of GRAS features                         */
2
3 /* Copyright (c) 2005, 2006, 2007, 2008, 2009, 2010. The SimGrid Team.
4  * All rights reserved.                                                     */
5
6 /* This program is free software; you can redistribute it and/or modify it
7  * under the terms of the license (GNU LGPL) which comes with this package. */
8
9
10 #include "gras.h"
11 #include "amok/bandwidth.h"
12 #include "amok/peermanagement.h"
13
14 XBT_LOG_NEW_DEFAULT_CATEGORY(Bandwidth,
15                              "Messages specific to this example");
16
17 /* **********************************************************************
18  * Sensor code
19  * **********************************************************************/
20
21 /* Function prototypes */
22 int sensor(int argc, char *argv[]);
23
24 int sensor(int argc, char *argv[])
25 {
26   gras_socket_t mysock;
27   gras_socket_t master = NULL;
28   int connection_try = 10;
29   xbt_ex_t e;
30
31   gras_init(&argc, argv);
32   amok_bw_init();
33   amok_pm_init();
34
35   mysock = gras_socket_server_range(3000, 9999, 0, 0);
36   XBT_INFO("Sensor starting (on port %d)", gras_os_myport());
37   while (connection_try > 0 && master == NULL) {
38     int connected = 0;
39     TRY {
40       master = gras_socket_client_from_string(argv[1]);
41       connected = 1;
42     } CATCH(e) {
43       xbt_ex_free(e);
44     }
45     if (!connected) {
46       connection_try--;
47       gras_os_sleep(0.5);       /* let the master get ready */
48     }
49   }
50
51   amok_pm_group_join(master, "bandwidth");
52   amok_pm_mainloop(60);
53
54   gras_socket_close(mysock);
55   gras_socket_close(master);
56   gras_exit();
57   return 0;
58 }
59
60 /* **********************************************************************
61  * Maestro code
62  * **********************************************************************/
63
64 /* Function prototypes */
65 int maestro(int argc, char *argv[]);
66
67 int maestro(int argc, char *argv[])
68 {
69   double sec, bw;
70   int buf_size = 32 * 1024;
71   int msg_size = 512 * 1024;
72   int msg_amount = 1;
73   double min_duration = 1;
74
75   gras_socket_t peer;
76   gras_socket_t mysock;
77   xbt_peer_t h1, h2, h_temp;
78   xbt_dynar_t group;
79
80   gras_init(&argc, argv);
81   amok_bw_init();
82   amok_pm_init();
83
84   XBT_INFO("Maestro starting");
85   if (argc != 2) {
86     XBT_ERROR("Usage: maestro port\n");
87     return 1;
88   }
89   mysock = gras_socket_server(atoi(argv[1]));
90   group = amok_pm_group_new("bandwidth");
91   XBT_INFO("Wait for peers for 5 sec");
92   gras_msg_handleall(5);        /* friends, we're ready. Come and play */
93
94   if (xbt_dynar_length(group) < 2) {
95     char *msg = bprintf("Not enough peers arrived. Expected 2 got %ld",
96                         xbt_dynar_length(group));
97     amok_pm_group_shutdown("bandwidth");
98     xbt_die(msg);
99   }
100   h1 = *(xbt_peer_t *) xbt_dynar_get_ptr(group, 0);
101   h2 = *(xbt_peer_t *) xbt_dynar_get_ptr(group, 1);
102   /* sort peers in right order to keep output right */
103   if (strcmp(h1->name, h2->name) < 0 || h1->port > h2->port) {
104     h_temp = h1;
105     h1 = h2;
106     h2 = h_temp;
107   }
108
109   XBT_INFO("Contact %s:%d", h1->name, h1->port);
110   peer = gras_socket_client(h1->name, h1->port);
111
112   XBT_INFO("Test the BW between me and one of the sensors");
113   amok_bw_test(peer, buf_size, msg_size, msg_amount, min_duration, &sec,
114                &bw);
115   XBT_INFO
116       ("Experience between me and %s:%d (initially %d msgs of %d bytes, maybe modified to fill the pipe at least %.1fs) took %f sec, achieving %f kb/s",
117        h1->name, h1->port, msg_amount, msg_size, min_duration, sec,
118        ((double) bw) / 1024.0);
119
120   XBT_INFO("Test the BW between %s:%d and %s:%d", h1->name, h1->port,
121         h2->name, h2->port);
122   amok_bw_request(h1->name, h1->port, h2->name, h2->port, buf_size,
123                   msg_size, msg_amount, min_duration, &sec, &bw);
124   XBT_INFO
125       ("Experience between %s:%d and %s:%d took took %f sec, achieving %f kb/s",
126        h1->name, h1->port, h2->name, h2->port, sec,
127        ((double) bw) / 1024.0);
128
129   /* Game is over, friends */
130   amok_pm_group_shutdown("bandwidth");
131
132   gras_socket_close(mysock);
133   gras_exit();
134   return 0;
135 }