From 7639188c0a248382968c1f1015687eb7b37b59b8 Mon Sep 17 00:00:00 2001 From: Bart Polot Date: Thu, 6 Oct 2011 17:38:50 +0000 Subject: [PATCH] Stop all DHT get requests before disconnecting --- src/mesh/gnunet-service-mesh.c | 22 ++++++++ src/mesh/test_mesh_small.conf | 4 ++ src/mesh/test_mesh_small_unicast.c | 90 ++++++++++++++++++++++++++---- 3 files changed, 104 insertions(+), 12 deletions(-) diff --git a/src/mesh/gnunet-service-mesh.c b/src/mesh/gnunet-service-mesh.c index f30661abe..ba0244881 100644 --- a/src/mesh/gnunet-service-mesh.c +++ b/src/mesh/gnunet-service-mesh.c @@ -1187,6 +1187,9 @@ tunnel_destroy (struct MeshTunnel *t) /* TODO cancel core transmit ready in case it was active */ } tree_destroy(t->tree); + if (NULL != t->dht_get_type) + GNUNET_DHT_get_stop(t->dht_get_type); + t->dht_get_type = NULL; GNUNET_free (t); return r; } @@ -3239,6 +3242,24 @@ core_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer) /************************ MAIN FUNCTIONS ****************************/ /******************************************************************************/ +/** + * Iterator over hash map entries. + * + * @param cls closure + * @param key current key code + * @param value value in the hash map + * @return GNUNET_YES if we should continue to + * iterate, + * GNUNET_NO if not. + */ +int +shutdown_tunnel (void *cls, const GNUNET_HashCode * key, void *value) +{ + struct MeshTunnel *t = value; + tunnel_destroy(t); + return GNUNET_YES; +} + /** * Task run during shutdown. * @@ -3255,6 +3276,7 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_CORE_disconnect (core_handle); core_handle = NULL; } + GNUNET_CONTAINER_multihashmap_iterate(tunnels, &shutdown_tunnel, NULL); if (dht_handle != NULL) { GNUNET_DHT_disconnect (dht_handle); diff --git a/src/mesh/test_mesh_small.conf b/src/mesh/test_mesh_small.conf index 98def94c0..580a36f88 100644 --- a/src/mesh/test_mesh_small.conf +++ b/src/mesh/test_mesh_small.conf @@ -49,6 +49,10 @@ PORT = 10004 [mesh] PORT = 10005 DEBUG=YES +ACCEPT_FROM = 127.0.0.1; +HOSTNAME = localhost +# PREFIX = valgrind --leak-check=full +# PREFIX = xterm -geometry 100x85 -T peer1 -e gdb --args [testing] NUM_PEERS = 16 diff --git a/src/mesh/test_mesh_small_unicast.c b/src/mesh/test_mesh_small_unicast.c index 92e5d078b..f53b837de 100644 --- a/src/mesh/test_mesh_small_unicast.c +++ b/src/mesh/test_mesh_small_unicast.c @@ -122,15 +122,17 @@ static char *topology_file; static char *data_filename; -struct GNUNET_TESTING_Daemon *d1; +static struct GNUNET_TESTING_Daemon *d1; -struct GNUNET_TESTING_Daemon *d2; +static struct GNUNET_TESTING_Daemon *d2; -struct GNUNET_MESH_Handle *h1; +static struct GNUNET_MESH_Handle *h1; -struct GNUNET_MESH_Handle *h2; +static struct GNUNET_MESH_Handle *h2; -struct GNUNET_MESH_Tunnel *t; +static struct GNUNET_MESH_Tunnel *t; + +static uint16_t mesh_peers[16]; /** * Check whether peers successfully shut down. @@ -288,6 +290,53 @@ do_test (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) } +/** + * Prototype of a callback function indicating that two peers + * are currently connected. + * + * @param cls closure + * @param first peer id for first daemon + * @param second peer id for the second daemon + * @param distance distance between the connected peers + * @param emsg error message (NULL on success) + */ +void +topo_cb (void *cls, + const struct GNUNET_PeerIdentity* first, + const struct GNUNET_PeerIdentity* second, + const char *emsg) +{ + GNUNET_PEER_Id p1; + GNUNET_PEER_Id p2; + struct GNUNET_PeerIdentity id; + + GNUNET_PEER_resolve(1, &id); + p1 = GNUNET_PEER_search(first); + if (p1 == 1) + { + p2 = GNUNET_PEER_search(second); + GNUNET_assert(p2 < num_peers); + if (0 == p2) return; + mesh_peers[p2]++; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "test: %s IS a neighbor\n", + GNUNET_i2s(second)); + return; + } + p1 = GNUNET_PEER_search(second); + if (p1 == 1) + { + p2 = GNUNET_PEER_search(first); + GNUNET_assert(p2 < num_peers); + if (0 == p2) return; + mesh_peers[p2]++; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "test: %s IS a neighbor\n", + GNUNET_i2s(first)); + return; + } +} + /** * connect_mesh_service: connect to the mesh service of one of the peers * @@ -296,20 +345,26 @@ static void connect_mesh_service (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { GNUNET_MESH_ApplicationType app; + unsigned int i; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: connect_mesh_service\n"); - d1 = GNUNET_TESTING_daemon_get (pg, 1); - d2 = GNUNET_TESTING_daemon_get (pg, 3); + for (i = 1; i < num_peers; i++) + if (mesh_peers[i] == 0) + break; + GNUNET_assert (i < num_peers); + d2 = GNUNET_TESTING_daemon_get (pg, i); app = (GNUNET_MESH_ApplicationType) 0; #if VERBOSE GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: connecting to mesh service of peer %s\n", - GNUNET_i2s (&d1->id)); + "test: connecting to mesh service of peer %s (%u)\n", + GNUNET_i2s (&d1->id), + mesh_peers[0]); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "test: connecting to mesh service of peer %s\n", - GNUNET_i2s (&d2->id)); + "test: connecting to mesh service of peer %s (%u)\n", + GNUNET_i2s (&d2->id), + i); #endif h1 = GNUNET_MESH_connect (d1->cfg, 10, @@ -352,6 +407,7 @@ peergroup_ready (void *cls, const char *emsg) { char *buf; int buf_len; + unsigned int i; if (emsg != NULL) { @@ -382,10 +438,20 @@ peergroup_ready (void *cls, const char *emsg) GNUNET_free (buf); } peers_running = GNUNET_TESTING_daemons_running (pg); + for (i = 0; i < num_peers; i++) + { + d1 = GNUNET_TESTING_daemon_get (pg, i); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "test: %u: %s\n", + GNUNET_PEER_intern(&d1->id), + GNUNET_i2s (&d1->id)); + mesh_peers[i] = 0; + } + GNUNET_TESTING_get_topology(pg, &topo_cb, NULL); GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply( GNUNET_TIME_UNIT_SECONDS, - 2), + 4), &connect_mesh_service, NULL); disconnect_task = -- 2.25.1