[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r27130 - gnunet/src/testbed
From: |
gnunet |
Subject: |
[GNUnet-SVN] r27130 - gnunet/src/testbed |
Date: |
Tue, 14 May 2013 17:34:49 +0200 |
Author: harsha
Date: 2013-05-14 17:34:49 +0200 (Tue, 14 May 2013)
New Revision: 27130
Modified:
gnunet/src/testbed/testbed_api_testbed.c
Log:
- supermuc specific island handling code
Modified: gnunet/src/testbed/testbed_api_testbed.c
===================================================================
--- gnunet/src/testbed/testbed_api_testbed.c 2013-05-14 15:34:12 UTC (rev
27129)
+++ gnunet/src/testbed/testbed_api_testbed.c 2013-05-14 15:34:49 UTC (rev
27130)
@@ -87,7 +87,14 @@
*/
RC_INIT = 0,
+#if ENABLE_LL
/**
+ * Island level controllers are started and linked
+ */
+ RC_ISLANDS_LINKED,
+#endif
+
+ /**
* Controllers on given hosts started and linked
*/
RC_LINKED,
@@ -142,7 +149,24 @@
unsigned int index;
};
+#if ENABLE_LL
+/**
+ * Structure to represent an island of SuperMUC's nodes
+ */
+struct Island
+{
+ /**
+ * Array of nodes in this island
+ */
+ struct GNUNET_TESTBED_Host **hosts;
+ /**
+ * Number of nodes in the above array
+ */
+ unsigned int nhosts;
+};
+#endif
+
/**
* Testbed Run Handle
*/
@@ -205,7 +229,14 @@
*/
struct GNUNET_TESTBED_Host **hosts;
+#if ENABLE_LL
/**
+ * Array of SuperMUC islands
+ */
+ struct Island **islands;
+#endif
+
+ /**
* Array of compatibility check contexts
*/
struct CompatibilityCheckContext *hclist;
@@ -222,7 +253,8 @@
struct GNUNET_TESTBED_Operation *topology_operation;
/**
- * The file containing topology data. Only used if the topology is set to
'FROM_FILE'
+ * The file containing topology data. Only used if the topology is set to
+ * 'FROM_FILE'
*/
char *topo_file;
@@ -318,6 +350,12 @@
*/
unsigned int links_failed;
+#if ENABLE_LL
+ /**
+ * Number of SuperMUC islands we are running on
+ */
+ unsigned int nislands;
+#endif
};
@@ -436,6 +474,25 @@
rcop));
}
+#if ENABLE_LL
+static void
+cleanup_islands (struct RunContext *rc)
+{
+ struct Island *island;
+ unsigned int cnt;
+
+ GNUNET_assert (NULL != rc->islands);
+ for (cnt = 0; cnt < rc->nislands; cnt++)
+ {
+ island = rc->islands[cnt];
+ GNUNET_free (island->hosts);
+ GNUNET_free (island);
+ }
+ GNUNET_free (rc->islands);
+ rc->islands = NULL;
+}
+#endif
+
/**
* Assuming all peers have been destroyed cleanup run handle
*
@@ -446,7 +503,7 @@
cleanup_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
struct RunContext *rc = cls;
- unsigned int hid;
+ unsigned int cnt;
GNUNET_assert (GNUNET_SCHEDULER_NO_TASK == rc->register_hosts_task);
GNUNET_assert (NULL == rc->reg_handle);
@@ -461,8 +518,12 @@
GNUNET_TESTBED_controller_stop (rc->cproc);
if (NULL != rc->h)
GNUNET_TESTBED_host_destroy (rc->h);
- for (hid = 0; hid < rc->num_hosts; hid++)
- GNUNET_TESTBED_host_destroy (rc->hosts[hid]);
+#if ENABLE_LL
+ if (NULL != rc->islands)
+ cleanup_islands (rc);
+#endif
+ for (cnt = 0; cnt < rc->num_hosts; cnt++)
+ GNUNET_TESTBED_host_destroy (rc->hosts[cnt]);
GNUNET_free_non_null (rc->hosts);
if (NULL != rc->cfg)
GNUNET_CONFIGURATION_destroy (rc->cfg);
@@ -808,11 +869,41 @@
remove_rcop (rc, rcop);
GNUNET_TESTBED_operation_done (rcop->op);
GNUNET_free (rcop);
- if (rc->reg_hosts == rc->num_hosts)
+#if !ENABLE_LL
+ if (rc->reg_hosts != rc->num_hosts)
+ return;
+ rc->state = RC_LINKED;
+ create_peers (rc);
+#else
+ if (rc->reg_hosts != rc->nislands)
+ return;
+ struct Island *island;
+ struct GNUNET_TESTBED_Host *host;
+ unsigned int cnt;
+ unsigned int cnt2;
+ rc->state = RC_ISLANDS_LINKED;
+ rc->reg_hosts = 0;
+ for (cnt = 0; cnt < rc->nislands; cnt++)
{
- rc->state = RC_LINKED;
- create_peers (rc);
+ island = rc->islands[cnt];
+ for (cnt2 = 1; cnt2 < island->nhosts; cnt2++)
+ {
+ host = island->hosts[cnt2];
+ rcop = GNUNET_malloc (sizeof (struct RunContextOperation));
+ rcop->rc = rc;
+ rcop->op =
+ GNUNET_TESTBED_controller_link (rcop, rc->c, host,
+ island->hosts[0], GNUNET_YES);
+ GNUNET_assert (NULL != rcop->op);
+ insert_rcop (rc, rcop);
+ rc->reg_hosts++;
+ }
}
+ if (0 != rc->reg_hosts)
+ return;
+ rc->state = RC_LINKED;
+ create_peers (rc);
+#endif
return;
default:
GNUNET_break (0);
@@ -820,6 +911,36 @@
return;
}
}
+#if ENABLE_LL
+ if (RC_ISLANDS_LINKED == rc->state)
+ {
+ switch (event->type)
+ {
+ case GNUNET_TESTBED_ET_OPERATION_FINISHED:
+ rcop = event->op_cls;
+ if (NULL != event->details.operation_finished.emsg)
+ {
+ LOG (GNUNET_ERROR_TYPE_ERROR,
+ "Linking 2nd level controllers failed. Exiting");
+ shutdown_now (rc);
+ }
+ else
+ rc->reg_hosts--;
+ GNUNET_assert (event->op == rcop->op);
+ remove_rcop (rc, rcop);
+ GNUNET_TESTBED_operation_done (rcop->op);
+ GNUNET_free (rcop);
+ if (0 != rc->reg_hosts)
+ return;
+ rc->state = RC_LINKED;
+ create_peers (rc);
+ default:
+ GNUNET_break (0);
+ shutdown_now (rc);
+ return;
+ }
+ }
+#endif
if (GNUNET_TESTBED_ET_OPERATION_FINISHED != event->type)
goto call_cc;
if (NULL == (rcop = search_rcop (rc, event->op)))
@@ -960,23 +1081,39 @@
{
struct RunContext *rc = cls;
struct RunContextOperation *rcop;
- unsigned int slave;
+ unsigned int cnt;
rc->register_hosts_task = GNUNET_SCHEDULER_NO_TASK;
if (rc->reg_hosts == rc->num_hosts)
{
DEBUG ("All hosts successfully registered\n");
- /* Start slaves */
- for (slave = 0; slave < rc->num_hosts; slave++)
+ /* Start cnts */
+#if !ENABLE_LL
+ for (cnt = 0; cnt < rc->num_hosts; cnt++)
{
rcop = GNUNET_malloc (sizeof (struct RunContextOperation));
rcop->rc = rc;
rcop->op =
- GNUNET_TESTBED_controller_link (rcop, rc->c, rc->hosts[slave],
+ GNUNET_TESTBED_controller_link (rcop, rc->c, rc->hosts[cnt],
rc->h, GNUNET_YES);
GNUNET_assert (NULL != rcop->op);
insert_rcop (rc, rcop);
}
+#else
+ struct Island *island;
+ for (cnt = 0; cnt < rc->nislands; cnt++)
+ {
+ island = rc->islands[cnt];
+ GNUNET_assert (0 < island->nhosts);
+ rcop = GNUNET_malloc (sizeof (struct RunContextOperation));
+ rcop->rc = rc;
+ rcop->op =
+ GNUNET_TESTBED_controller_link (rcop, rc->c, island->hosts[0],
+ rc->h, GNUNET_YES);
+ GNUNET_assert (NULL != rcop->op);
+ insert_rcop (rc, rcop);
+ }
+#endif
rc->reg_hosts = 0;
return;
}
@@ -1173,6 +1310,43 @@
}
+#if ENABLE_LL
+static void
+parse_islands (struct RunContext *rc)
+{
+#define ISLANDNAME_SIZE 4
+ char island_id[ISLANDNAME_SIZE];
+ struct GNUNET_TESTBED_Host *host;
+ struct Island *island;
+ const char *hostname;
+ unsigned int nhost;
+
+ memset (island_id, 0, ISLANDNAME_SIZE);
+ island = NULL;
+ for (nhost = 0; nhost < rc->num_hosts; nhost++)
+ {
+ host = rc->hosts[nhost];
+ hostname = GNUNET_TESTBED_host_get_hostname (host);
+ GNUNET_assert (NULL != hostname);
+ if (NULL == island)
+ {
+ strncpy (island_id, hostname, ISLANDNAME_SIZE - 1);
+ island = GNUNET_malloc (sizeof (struct Island));
+ }
+ if (0 == strncmp (island_id, hostname, ISLANDNAME_SIZE - 1))
+ {
+ GNUNET_array_append (island->hosts, island->nhosts, host);
+ continue;
+ }
+ DEBUG ("Adding island `%s' with %u hosts\n", island_id, island->nhosts);
+ GNUNET_array_append (rc->islands, rc->nislands, island);
+ island = NULL;
+ }
+ if (NULL != island)
+ GNUNET_array_append (rc->islands, rc->nislands, island);
+}
+#endif
+
/**
* Convenience method for running a testbed with
* a single call. Underlay and overlay topology
@@ -1228,6 +1402,7 @@
_("No hosts loaded from LoadLeveler. Need at least one host\n"));
goto error_cleanup;
}
+ parse_islands (rc);
#else
if (NULL != host_filename)
{
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r27130 - gnunet/src/testbed,
gnunet <=