gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r34546 - gnunet/src/hostlist


From: gnunet
Subject: [GNUnet-SVN] r34546 - gnunet/src/hostlist
Date: Sat, 13 Dec 2014 21:19:26 +0100

Author: grothoff
Date: 2014-12-13 21:19:26 +0100 (Sat, 13 Dec 2014)
New Revision: 34546

Modified:
   gnunet/src/hostlist/gnunet-daemon-hostlist_server.c
Log:
properly clean up pending advertisement message requests with CORE on peer 
disconnect

Modified: gnunet/src/hostlist/gnunet-daemon-hostlist_server.c
===================================================================
--- gnunet/src/hostlist/gnunet-daemon-hostlist_server.c 2014-12-13 20:08:11 UTC 
(rev 34545)
+++ gnunet/src/hostlist/gnunet-daemon-hostlist_server.c 2014-12-13 20:19:26 UTC 
(rev 34546)
@@ -101,17 +101,33 @@
  */
 static char *hostlist_uri;
 
+/**
+ * Map of peer identities to `struct GNUNET_CORE_TransmitHandle *` for
+ * pending hostlist server advertisements.
+ */
+static struct GNUNET_CONTAINER_MultiPeerMap *advertisements;
 
+
 /**
- * Context for host processor.
+ * Context for #host_processor().
  */
 struct HostSet
 {
-  unsigned int size;
+  /**
+   * Iterator used to build @e data (NULL when done).
+   */
+  struct GNUNET_PEERINFO_IteratorContext *pitr;
 
+  /**
+   * Place where we accumulate all of the HELLO messages.
+   */
   char *data;
 
-  struct GNUNET_PEERINFO_IteratorContext *pitr;
+  /**
+   * Number of bytes in @e data.
+   */
+  unsigned int size;
+
 };
 
 
@@ -257,21 +273,26 @@
               (unsigned int) s,
               "HELLO",
               GNUNET_i2s (peer));
-  if ((old + s >= GNUNET_MAX_MALLOC_CHECKED) ||
-      (old + s >= MAX_BYTES_PER_HOSTLISTS))
+  if ( (old + s >= GNUNET_MAX_MALLOC_CHECKED) ||
+       (old + s >= MAX_BYTES_PER_HOSTLISTS) )
   {
+    /* too large, skip! */
     GNUNET_STATISTICS_update (stats,
                               gettext_noop
                               ("bytes not included in hostlist (size limit)"),
                               s, GNUNET_NO);
-    return;                     /* too large, skip! */
+    return;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               "Adding peer `%s' to hostlist (%u bytes)\n",
               GNUNET_i2s (peer),
               (unsigned int) s);
-  GNUNET_array_grow (builder->data, builder->size, old + s);
-  memcpy (&builder->data[old], hello, s);
+  GNUNET_array_grow (builder->data,
+                     builder->size,
+                     old + s);
+  memcpy (&builder->data[old],
+          hello,
+          s);
 }
 
 
@@ -436,14 +457,19 @@
   header.type = htons (GNUNET_MESSAGE_TYPE_HOSTLIST_ADVERTISEMENT);
   header.size = htons (transmission_size);
   GNUNET_assert (size >= transmission_size);
-  memcpy (buf, &header, sizeof (struct GNUNET_MessageHeader));
+  memcpy (buf,
+          &header,
+          sizeof (struct GNUNET_MessageHeader));
   cbuf = buf;
-  memcpy (&cbuf[sizeof (struct GNUNET_MessageHeader)], hostlist_uri, uri_size);
+  memcpy (&cbuf[sizeof (struct GNUNET_MessageHeader)],
+          hostlist_uri,
+          uri_size);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Sent advertisement message: Copied %u bytes into buffer!\n",
               (unsigned int) transmission_size);
   hostlist_adv_count++;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, " # Sent advertisement message: %u\n",
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              " # Sent advertisement message: %u\n",
               hostlist_adv_count);
   GNUNET_STATISTICS_update (stats,
                             gettext_noop ("# hostlist advertisements send"), 1,
@@ -463,8 +489,9 @@
                  const struct GNUNET_PeerIdentity *peer)
 {
   size_t size;
+  struct GNUNET_CORE_TransmitHandle *th;
 
-  if (!advertising)
+  if (! advertising)
     return;
   if (NULL == hostlist_uri)
     return;
@@ -486,16 +513,21 @@
               size,
               GNUNET_i2s (peer));
   if (NULL ==
-      GNUNET_CORE_notify_transmit_ready (core, GNUNET_YES,
-                                         GNUNET_CORE_PRIO_BEST_EFFORT,
-                                         GNUNET_ADV_TIMEOUT,
-                                         peer,
-                                         size,
-                                         &adv_transmit_ready, NULL))
+      (th = GNUNET_CORE_notify_transmit_ready (core, GNUNET_YES,
+                                               GNUNET_CORE_PRIO_BEST_EFFORT,
+                                               GNUNET_ADV_TIMEOUT,
+                                               peer,
+                                               size,
+                                               &adv_transmit_ready, NULL)) )
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                 _("Advertisement message could not be queued by core\n"));
   }
+  GNUNET_assert (GNUNET_YES ==
+                 GNUNET_CONTAINER_multipeermap_put (advertisements,
+                                                    peer,
+                                                    th,
+                                                    
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
 }
 
 
@@ -509,9 +541,19 @@
 disconnect_handler (void *cls,
                     const struct GNUNET_PeerIdentity *peer)
 {
-  /* nothing to do */
-  /* FIXME: this is wrong, need to CANCEL active
-     NTR! */
+  struct GNUNET_CORE_TransmitHandle *th;
+
+  if (! advertising)
+    return;
+  th = GNUNET_CONTAINER_multipeermap_get (advertisements,
+                                          peer);
+  if (NULL == th)
+    return;
+  GNUNET_assert (GNUNET_YES ==
+                 GNUNET_CONTAINER_multipeermap_remove (advertisements,
+                                                       peer,
+                                                       th));
+  GNUNET_CORE_notify_transmit_ready_cancel (th);
 }
 
 
@@ -553,8 +595,10 @@
     builder = GNUNET_new (struct HostSet);
   }
   GNUNET_assert (NULL != peerinfo);
-  builder->pitr =
-      GNUNET_PEERINFO_iterate (peerinfo, GNUNET_NO, NULL, 
GNUNET_TIME_UNIT_MINUTES,
+  builder->pitr
+    = GNUNET_PEERINFO_iterate (peerinfo,
+                               GNUNET_NO, NULL,
+                               GNUNET_TIME_UNIT_MINUTES,
                                &host_processor, NULL);
 }
 
@@ -672,11 +716,17 @@
 
   advertising = advertise;
   if (! advertising)
+  {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Advertising not enabled on this hostlist server\n");
+  }
   else
+  {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "Advertising enabled on this hostlist server\n");
+    advertisements = GNUNET_CONTAINER_multipeermap_create (8,
+                                                           GNUNET_NO);
+  }
   cfg = c;
   stats = st;
   peerinfo = GNUNET_PEERINFO_connect (cfg);
@@ -731,11 +781,11 @@
   if (GNUNET_CONFIGURATION_have_value (cfg, "HOSTLIST", "BINDTOIPV4"))
   {
     if (GNUNET_OK !=
-                  GNUNET_CONFIGURATION_get_value_string (cfg, "HOSTLIST",
-                                                         "BINDTOIP", &ipv4))
+        GNUNET_CONFIGURATION_get_value_string (cfg, "HOSTLIST",
+                                               "BINDTOIP", &ipv4))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-        _("BINDTOIP does not a valid IPv4 address! Ignoring BINDTOIPV4.\n"));
+                  _("BINDTOIP does not a valid IPv4 address! Ignoring 
BINDTOIPV4.\n"));
     }
 
   }
@@ -744,9 +794,9 @@
   if (GNUNET_CONFIGURATION_have_value (cfg, "HOSTLIST", "BINDTOIPV6"))
   {
     if (GNUNET_OK !=
-                  GNUNET_CONFIGURATION_get_value_string (cfg, "HOSTLIST",
-                                                         "BINDTOIP", &ipv6))
-    {
+        GNUNET_CONFIGURATION_get_value_string (cfg, "HOSTLIST",
+                                               "BINDTOIP", &ipv6))
+      {
       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
           _("BINDTOIP does not a valid IPv4 address! Ignoring BINDTOIPV6.\n"));
     }
@@ -841,7 +891,8 @@
     hostlist_task_v4 = prepare_daemon (daemon_handle_v4);
   if (NULL != daemon_handle_v6)
     hostlist_task_v6 = prepare_daemon (daemon_handle_v6);
-  notify = GNUNET_PEERINFO_notify (cfg, GNUNET_NO,
+  notify = GNUNET_PEERINFO_notify (cfg,
+                                   GNUNET_NO,
                                    &process_notify, NULL);
   return GNUNET_OK;
 }
@@ -853,7 +904,8 @@
 void
 GNUNET_HOSTLIST_server_stop ()
 {
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Hostlist server shutdown\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Hostlist server shutdown\n");
   if (GNUNET_SCHEDULER_NO_TASK != hostlist_task_v6)
   {
     GNUNET_SCHEDULER_cancel (hostlist_task_v6);
@@ -899,6 +951,13 @@
     GNUNET_PEERINFO_disconnect (peerinfo);
     peerinfo = NULL;
   }
+  if (NULL != advertisements)
+  {
+    GNUNET_break (0 ==
+                  GNUNET_CONTAINER_multipeermap_size (advertisements));
+    GNUNET_CONTAINER_multipeermap_destroy (advertisements);
+    advertisements = NULL;
+  }
   cfg = NULL;
   stats = NULL;
   core = NULL;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]