Stop all DHT get requests before disconnecting
authorBart Polot <bart@net.in.tum.de>
Thu, 6 Oct 2011 17:38:50 +0000 (17:38 +0000)
committerBart Polot <bart@net.in.tum.de>
Thu, 6 Oct 2011 17:38:50 +0000 (17:38 +0000)
src/mesh/gnunet-service-mesh.c
src/mesh/test_mesh_small.conf
src/mesh/test_mesh_small_unicast.c

index f30661abe7f3ceaaf9cc6df8a7d1459807d9b6d1..ba0244881c9b16963cf98ac5191bd9b6bb545f01 100644 (file)
@@ -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);
index 98def94c0272ad40e1dfa5160b9b71857f40bfa5..580a36f88b5f8fd62175698ee85d2709d2807eec 100644 (file)
@@ -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
index 92e5d078b750be3c41aded18be0934e58108d0e8..f53b837deac011898bb3e350d76517c623ca6172 100644 (file)
@@ -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 =