gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] branch master updated: -more DHT code cleanup (no substantial c


From: gnunet
Subject: [gnunet] branch master updated: -more DHT code cleanup (no substantial changes)
Date: Mon, 03 Jan 2022 15:36:03 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new 44efce831 -more DHT code cleanup (no substantial changes)
44efce831 is described below

commit 44efce8316b644f15b5e87852f5b7df7d58cfa97
Author: Christian Grothoff <grothoff@gnunet.org>
AuthorDate: Mon Jan 3 15:35:49 2022 +0100

    -more DHT code cleanup (no substantial changes)
---
 src/dht/gnunet-service-dht_clients.c    |   4 +-
 src/dht/gnunet-service-dht_datacache.c  |   2 +-
 src/dht/gnunet-service-dht_neighbours.c | 306 ++++++++++++++++----------------
 src/dht/gnunet-service-dht_neighbours.h |  16 +-
 src/dht/gnunet-service-dht_routing.c    |  29 ++-
 5 files changed, 188 insertions(+), 169 deletions(-)

diff --git a/src/dht/gnunet-service-dht_clients.c 
b/src/dht/gnunet-service-dht_clients.c
index 28be0e9be..245130dbc 100644
--- a/src/dht/gnunet-service-dht_clients.c
+++ b/src/dht/gnunet-service-dht_clients.c
@@ -837,8 +837,8 @@ handle_dht_local_get_stop (
   struct RemoveByUniqueIdContext ctx;
 
   GNUNET_STATISTICS_update (GDS_stats,
-                            gettext_noop
-                              ("# GET STOP requests received from clients"), 1,
+                            "# GET STOP requests received from clients",
+                            1,
                             GNUNET_NO);
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Received GET STOP request for %s from local client %p\n",
diff --git a/src/dht/gnunet-service-dht_datacache.c 
b/src/dht/gnunet-service-dht_datacache.c
index 131cad8aa..214c4a3f4 100644
--- a/src/dht/gnunet-service-dht_datacache.c
+++ b/src/dht/gnunet-service-dht_datacache.c
@@ -237,7 +237,7 @@ GDS_DATACACHE_handle_get (const struct GNUNET_HashCode *key,
   if (NULL == datacache)
     return GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
   GNUNET_STATISTICS_update (GDS_stats,
-                            gettext_noop ("# GET requests given to datacache"),
+                            "# GET requests given to datacache",
                             1,
                             GNUNET_NO);
   ctx.eval = GNUNET_BLOCK_EVALUATION_REQUEST_VALID;
diff --git a/src/dht/gnunet-service-dht_neighbours.c 
b/src/dht/gnunet-service-dht_neighbours.c
index 01a68b0b7..35502e0f5 100644
--- a/src/dht/gnunet-service-dht_neighbours.c
+++ b/src/dht/gnunet-service-dht_neighbours.c
@@ -1253,8 +1253,6 @@ get_target_peers (const struct GNUNET_HashCode *key,
 }
 
 
-// FIXME-CG: REVIEW from here...
-
 enum GNUNET_GenericReturnValue
 GDS_NEIGHBOURS_handle_put (const struct GDS_DATACACHE_BlockData *bd,
                            enum GNUNET_DHT_RouteOption options,
@@ -1263,13 +1261,8 @@ GDS_NEIGHBOURS_handle_put (const struct 
GDS_DATACACHE_BlockData *bd,
                            struct GNUNET_CONTAINER_BloomFilter *bf)
 {
   unsigned int target_count;
-  unsigned int i;
   struct PeerInfo **targets;
-  struct PeerInfo *target;
   size_t msize;
-  struct GNUNET_MQ_Envelope *env;
-  struct PeerPutMessage *ppm;
-  struct GNUNET_PeerIdentity *pp;
   unsigned int skip_count;
   unsigned int put_path_length = bd->put_path_length;
 
@@ -1314,14 +1307,14 @@ GDS_NEIGHBOURS_handle_put (const struct 
GDS_DATACACHE_BlockData *bd,
     GNUNET_free (targets);
     return GNUNET_NO;
   }
-  GNUNET_STATISTICS_update (GDS_stats,
-                            "# PUT messages queued for transmission",
-                            target_count,
-                            GNUNET_NO);
   skip_count = 0;
-  for (i = 0; i < target_count; i++)
+  for (unsigned int i = 0; i < target_count; i++)
   {
-    target = targets[i];
+    struct PeerInfo *target = targets[i];
+    struct GNUNET_MQ_Envelope *env;
+    struct PeerPutMessage *ppm;
+    struct GNUNET_PeerIdentity *pp;
+
     if (GNUNET_MQ_get_length (target->mq) >= MAXIMUM_PENDING_PER_PEER)
     {
       /* skip */
@@ -1365,6 +1358,10 @@ GDS_NEIGHBOURS_handle_put (const struct 
GDS_DATACACHE_BlockData *bd,
                     env);
   }
   GNUNET_free (targets);
+  GNUNET_STATISTICS_update (GDS_stats,
+                            "# PUT messages queued for transmission",
+                            target_count - skip_count,
+                            GNUNET_NO);
   return (skip_count < target_count) ? GNUNET_OK : GNUNET_NO;
 }
 
@@ -1382,11 +1379,7 @@ GDS_NEIGHBOURS_handle_get (enum GNUNET_BLOCK_Type type,
 {
   unsigned int target_count;
   struct PeerInfo **targets;
-  struct PeerInfo *target;
-  struct GNUNET_MQ_Envelope *env;
   size_t msize;
-  struct PeerGetMessage *pgm;
-  char *xq;
   size_t reply_bf_size;
   void *reply_bf;
   unsigned int skip_count;
@@ -1436,21 +1429,22 @@ GDS_NEIGHBOURS_handle_get (enum GNUNET_BLOCK_Type type,
     GNUNET_free (targets);
     return GNUNET_NO;
   }
-  GNUNET_STATISTICS_update (GDS_stats,
-                            "# GET messages queued for transmission",
-                            target_count,
-                            GNUNET_NO);
   /* forward request */
   skip_count = 0;
   for (unsigned int i = 0; i < target_count; i++)
   {
-    target = targets[i];
+    struct PeerInfo *target = targets[i];
+    struct GNUNET_MQ_Envelope *env;
+    struct PeerGetMessage *pgm;
+    char *xq;
+    
     if (GNUNET_MQ_get_length (target->mq) >= MAXIMUM_PENDING_PER_PEER)
     {
       /* skip */
       GNUNET_STATISTICS_update (GDS_stats,
                                 "# P2P messages dropped due to full queue",
-                                1, GNUNET_NO);
+                                1,
+                                GNUNET_NO);
       skip_count++;
       continue;
     }
@@ -1486,20 +1480,31 @@ GDS_NEIGHBOURS_handle_get (enum GNUNET_BLOCK_Type type,
     GNUNET_MQ_send (target->mq,
                     env);
   }
+  GNUNET_STATISTICS_update (GDS_stats,
+                            "# GET messages queued for transmission",
+                            target_count - skip_count,
+                            GNUNET_NO);
   GNUNET_free (targets);
   GNUNET_free (reply_bf);
   return (skip_count < target_count) ? GNUNET_OK : GNUNET_NO;
 }
 
 
+struct PeerInfo *
+GDS_NEIGHBOURS_lookup_peer (const struct GNUNET_PeerIdentity *target)
+{
+  return GNUNET_CONTAINER_multipeermap_get (all_connected_peers,
+                                            target);
+}
+
+
 void
-GDS_NEIGHBOURS_handle_reply (const struct GNUNET_PeerIdentity *target,
+GDS_NEIGHBOURS_handle_reply (struct PeerInfo *pi,
                              const struct GDS_DATACACHE_BlockData *bd,
                              const struct GNUNET_HashCode *query_hash,
                              unsigned int get_path_length,
                              const struct GNUNET_PeerIdentity *get_path)
 {
-  struct PeerInfo *pi;
   struct GNUNET_MQ_Envelope *env;
   struct PeerResultMessage *prm;
   struct GNUNET_PeerIdentity *paths;
@@ -1517,16 +1522,6 @@ GDS_NEIGHBOURS_handle_reply (const struct 
GNUNET_PeerIdentity *target,
     GNUNET_break (0);
     return;
   }
-  pi = GNUNET_CONTAINER_multipeermap_get (all_connected_peers,
-                                          target);
-  if (NULL == pi)
-  {
-    /* peer disconnected in the meantime, drop reply */
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "No matching peer for reply for key %s\n",
-                GNUNET_h2s (query_hash));
-    return;
-  }
   if (GNUNET_MQ_get_length (pi->mq) >= MAXIMUM_PENDING_PER_PEER)
   {
     /* skip */
@@ -1543,7 +1538,7 @@ GDS_NEIGHBOURS_handle_reply (const struct 
GNUNET_PeerIdentity *target,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Forwarding reply for key %s to peer %s\n",
               GNUNET_h2s (query_hash),
-              GNUNET_i2s (target));
+              GNUNET_i2s (pi->id));
   GNUNET_STATISTICS_update (GDS_stats,
                             "# RESULT messages queued for transmission",
                             1,
@@ -1572,7 +1567,7 @@ GDS_NEIGHBOURS_handle_reply (const struct 
GNUNET_PeerIdentity *target,
 
 
 /**
- * To be called on core init/fail.
+ * To be called on core init.
  *
  * @param cls service closure
  * @param identity the public identity of this peer
@@ -1587,7 +1582,7 @@ core_init (void *cls,
               GNUNET_i2s (identity));
   my_identity = *identity;
   GNUNET_CRYPTO_hash (identity,
-                      sizeof(struct GNUNET_PeerIdentity),
+                       sizeof(struct GNUNET_PeerIdentity),
                       &my_identity_hash);
   GNUNET_SERVICE_resume (GDS_service);
 }
@@ -1604,17 +1599,15 @@ static enum GNUNET_GenericReturnValue
 check_dht_p2p_put (void *cls,
                    const struct PeerPutMessage *put)
 {
-  uint32_t putlen;
-  uint16_t msize;
+  uint16_t msize = ntohs (put->header.size);
+  uint32_t putlen = ntohl (put->put_path_length);
 
   (void) cls;
-  msize = ntohs (put->header.size);
-  putlen = ntohl (put->put_path_length);
-  if ((msize <
-       sizeof(struct PeerPutMessage)
-       + putlen * sizeof(struct GNUNET_PeerIdentity)) ||
-      (putlen >
-       GNUNET_MAX_MESSAGE_SIZE / sizeof(struct GNUNET_PeerIdentity)))
+  if ( (msize <
+        sizeof(struct PeerPutMessage)
+        + putlen * sizeof(struct GNUNET_PeerIdentity)) ||
+       (putlen >
+        GNUNET_MAX_MESSAGE_SIZE / sizeof(struct GNUNET_PeerIdentity)) )
   {
     GNUNET_break_op (0);
     return GNUNET_SYSERR;
@@ -1784,9 +1777,9 @@ handle_dht_p2p_put (void *cls,
                               0, NULL /* get path */);
 
     /* store locally */
-    if ((0 != (options & GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE)) ||
-        (GDS_am_closest_peer (&put->key,
-                              bf)))
+    if ( (0 != (options & GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE)) ||
+         (GDS_am_closest_peer (&put->key,
+                               bf)) )
       GDS_DATACACHE_handle_put (&bd);
     {
       enum GNUNET_GenericReturnValue forwarded;
@@ -1816,12 +1809,12 @@ handle_dht_p2p_put (void *cls,
  * We have received a FIND PEER request.  Send matching
  * HELLOs back.
  *
- * @param sender sender of the FIND PEER request
+ * @param pi sender of the FIND PEER request
  * @param key peers close to this key are desired
  * @param bg group for filtering peers
  */
 static void
-handle_find_peer (const struct GNUNET_PeerIdentity *sender,
+handle_find_peer (struct PeerInfo *pi,
                   const struct GNUNET_HashCode *query_hash,
                   struct GNUNET_BLOCK_Group *bg)
 {
@@ -1852,7 +1845,7 @@ handle_find_peer (const struct GNUNET_PeerIdentity 
*sender,
                                   bd.data,
                                   bd.data_size))
     {
-      GDS_NEIGHBOURS_handle_reply (sender,
+      GDS_NEIGHBOURS_handle_reply (pi,
                                    &bd,
                                    query_hash,
                                    0, NULL /* get path */);
@@ -1925,7 +1918,7 @@ handle_find_peer (const struct GNUNET_PeerIdentity 
*sender,
     bd.key = peer->phash;
     bd.data = hello;
     bd.data_size = hello_size;
-    GDS_NEIGHBOURS_handle_reply (sender,
+    GDS_NEIGHBOURS_handle_reply (pi,
                                  &bd,
                                  query_hash,
                                  0, NULL /* get path */);
@@ -1956,7 +1949,7 @@ handle_local_result (void *cls,
                 pp);
     GNUNET_free (pp);
   }
-  GDS_NEIGHBOURS_handle_reply (peer->id,
+  GDS_NEIGHBOURS_handle_reply (peer,
                                bd,
                                &bd->key,
                                0, NULL /* get path */);
@@ -1974,13 +1967,11 @@ static enum GNUNET_GenericReturnValue
 check_dht_p2p_get (void *cls,
                    const struct PeerGetMessage *get)
 {
-  uint32_t xquery_size;
-  uint16_t msize;
+  uint16_t msize = ntohs (get->header.size);
+  uint32_t xquery_size = ntohl (get->xquery_size);
 
   (void) cls;
-  msize = ntohs (get->header.size);
-  xquery_size = ntohl (get->xquery_size);
-  if (msize < sizeof(struct PeerGetMessage) + xquery_size)
+  if (msize < sizeof(*get) + xquery_size)
   {
     GNUNET_break_op (0);
     return GNUNET_SYSERR;
@@ -2000,24 +1991,16 @@ handle_dht_p2p_get (void *cls,
                     const struct PeerGetMessage *get)
 {
   struct PeerInfo *peer = cls;
-  uint32_t xquery_size;
-  size_t reply_bf_size;
-  uint16_t msize;
-  enum GNUNET_BLOCK_Type type;
-  enum GNUNET_DHT_RouteOption options;
+  uint16_t msize = ntohs (get->header.size);
+  uint32_t xquery_size = ntohl (get->xquery_size);
+  uint32_t hop_count = ntohl (get->hop_count);
+  size_t reply_bf_size = msize - (sizeof(*get) + xquery_size);
+  enum GNUNET_BLOCK_Type type = (enum GNUNET_BLOCK_Type) ntohl (get->type);
+  enum GNUNET_DHT_RouteOption options = (enum GNUNET_DHT_RouteOption)  ntohl 
(get->options);
   enum GNUNET_BLOCK_ReplyEvaluationResult eval = GNUNET_BLOCK_REPLY_OK_MORE;
-  struct GNUNET_BLOCK_Group *bg;
-  struct GNUNET_CONTAINER_BloomFilter *peer_bf;
-  const void *xquery;
-  enum GNUNET_GenericReturnValue forwarded;
+  const void *xquery = (const void *) &get[1];
 
   /* parse and validate message */
-  msize = ntohs (get->header.size);
-  xquery_size = ntohl (get->xquery_size);
-  reply_bf_size = msize - (sizeof(struct PeerGetMessage) + xquery_size);
-  type = ntohl (get->type);
-  options = ntohl (get->options);
-  xquery = (const void *) &get[1];
   GNUNET_STATISTICS_update (GDS_stats,
                             "# P2P GET requests received",
                             1,
@@ -2044,7 +2027,7 @@ handle_dht_p2p_get (void *cls,
                  GNUNET_h2s (&get->key),
                  GNUNET_i2s (peer->id),
                  tmp,
-                 ntohl (get->hop_count),
+                 hop_count,
                  GNUNET_CRYPTO_hash_count_leading_zeros (&pxor),
                  GNUNET_CRYPTO_hash_count_leading_zeros (&mxor),
                  ntohl (get->xquery_size),
@@ -2062,93 +2045,104 @@ handle_dht_p2p_get (void *cls,
     GNUNET_break_op (0);
     return;
   }
-  peer_bf = GNUNET_CONTAINER_bloomfilter_init (get->bloomfilter,
-                                               DHT_BLOOM_SIZE,
-                                               GNUNET_CONSTANTS_BLOOMFILTER_K);
-  GNUNET_break_op (GNUNET_YES ==
-                   GNUNET_CONTAINER_bloomfilter_test (peer_bf,
-                                                      &peer->phash));
-  bg = GNUNET_BLOCK_group_create (GDS_block_context,
-                                  type,
-                                  get->bf_mutator,
-                                  xquery + xquery_size,
-                                  reply_bf_size,
-                                  "filter-size",
-                                  reply_bf_size,
-                                  NULL);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "GET for %s at %s after %u hops\n",
-              GNUNET_h2s (&get->key),
-              GNUNET_i2s (&my_identity),
-              (unsigned int) ntohl (get->hop_count));
-  /* local lookup (this may update the reply_bf) */
-  if ( (0 != (options & GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE)) ||
-       (GDS_am_closest_peer (&get->key,
-                             peer_bf)) )
+
   {
-    if ((0 != (options & GNUNET_DHT_RO_FIND_PEER)))
+    struct GNUNET_BLOCK_Group *bg;
+    struct GNUNET_CONTAINER_BloomFilter *peer_bf;
+
+    peer_bf = GNUNET_CONTAINER_bloomfilter_init (get->bloomfilter,
+                                                 DHT_BLOOM_SIZE,
+                                                 
GNUNET_CONSTANTS_BLOOMFILTER_K);
+    GNUNET_break_op (GNUNET_YES ==
+                     GNUNET_CONTAINER_bloomfilter_test (peer_bf,
+                                                        &peer->phash));
+    bg = GNUNET_BLOCK_group_create (GDS_block_context,
+                                    type,
+                                    get->bf_mutator,
+                                    xquery + xquery_size,
+                                    reply_bf_size,
+                                    "filter-size",
+                                    reply_bf_size,
+                                    NULL);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "GET for %s at %s after %u hops\n",
+                GNUNET_h2s (&get->key),
+                GNUNET_i2s (&my_identity),
+                (unsigned int) hop_count);
+    /* local lookup (this may update the reply_bf) */
+    if ( (0 != (options & GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE)) ||
+         (GDS_am_closest_peer (&get->key,
+                               peer_bf)) )
     {
-      GNUNET_STATISTICS_update (GDS_stats,
-                                "# P2P FIND PEER requests processed",
-                                1,
-                                GNUNET_NO);
-      handle_find_peer (peer->id,
-                        &get->key,
-                        bg);
+      if ((0 != (options & GNUNET_DHT_RO_FIND_PEER)))
+      {
+        GNUNET_STATISTICS_update (GDS_stats,
+                                  "# P2P FIND PEER requests processed",
+                                  1,
+                                  GNUNET_NO);
+        handle_find_peer (peer,
+                          &get->key,
+                          bg);
+      }
+      else
+      {
+        eval = GDS_DATACACHE_handle_get (&get->key,
+                                         type,
+                                         xquery,
+                                         xquery_size,
+                                         bg,
+                                         &handle_local_result,
+                                         peer);
+      }
     }
     else
+      {
+        GNUNET_STATISTICS_update (GDS_stats,
+                                  "# P2P GET requests ONLY routed",
+                                  1,
+                                  GNUNET_NO);
+      }
+    
+    /* remember request for routing replies */
+    GDS_ROUTING_add (peer->id,
+                     type,
+                     bg,      /* bg now owned by routing, but valid at least 
until end of this function! */
+                     options,
+                     &get->key,
+                     xquery,
+                     xquery_size);
+
+    /* P2P forwarding */
     {
-      eval = GDS_DATACACHE_handle_get (&get->key,
-                                       type,
-                                       xquery,
-                                       xquery_size,
-                                       bg,
-                                       &handle_local_result,
-                                       peer);
+      bool forwarded = false;
+      uint32_t desired_replication_level = ntohl 
(get->desired_replication_level);
+
+      if (eval != GNUNET_BLOCK_REPLY_OK_LAST)
+        forwarded = (GNUNET_OK ==
+                     GDS_NEIGHBOURS_handle_get (type,
+                                                options,
+                                                desired_replication_level,
+                                                hop_count,
+                                                &get->key,
+                                                xquery,
+                                                xquery_size,
+                                                bg,
+                                                peer_bf));
+      GDS_CLIENTS_process_get (
+        options |
+        (forwarded
+         ? 0
+         : GNUNET_DHT_RO_LAST_HOP),
+        type,
+        hop_count,
+        desired_replication_level,
+        0,
+        NULL,
+        &get->key);
     }
+    /* clean up; note that 'bg' is owned by routing now! */
+    GNUNET_CONTAINER_bloomfilter_free (peer_bf);
   }
-  else
-  {
-    GNUNET_STATISTICS_update (GDS_stats,
-                              "# P2P GET requests ONLY routed",
-                              1,
-                              GNUNET_NO);
-  }
-
-  /* remember request for routing replies */
-  GDS_ROUTING_add (peer->id,
-                   type,
-                   bg,      /* bg now owned by routing, but valid at least 
until end of this function! */
-                   options,
-                   &get->key,
-                   xquery,
-                   xquery_size);
-
-  /* P2P forwarding */
-  forwarded = GNUNET_NO;
-  if (eval != GNUNET_BLOCK_REPLY_OK_LAST)
-    forwarded = GDS_NEIGHBOURS_handle_get (type,
-                                           options,
-                                           ntohl (
-                                             get->desired_replication_level),
-                                           ntohl (get->hop_count),
-                                           &get->key,
-                                           xquery,
-                                           xquery_size,
-                                           bg,
-                                           peer_bf);
-  GDS_CLIENTS_process_get (options
-                           | ((GNUNET_OK == forwarded)
-                           ? GNUNET_DHT_RO_LAST_HOP : 0),
-                           type,
-                           ntohl (get->hop_count),
-                           ntohl (get->desired_replication_level),
-                           0,
-                           NULL,
-                           &get->key);
-
-  /* clean up; note that 'bg' is owned by routing now! */
-  GNUNET_CONTAINER_bloomfilter_free (peer_bf);
 }
 
 
diff --git a/src/dht/gnunet-service-dht_neighbours.h 
b/src/dht/gnunet-service-dht_neighbours.h
index ba7cc6055..28468c740 100644
--- a/src/dht/gnunet-service-dht_neighbours.h
+++ b/src/dht/gnunet-service-dht_neighbours.h
@@ -38,6 +38,18 @@
 extern struct GNUNET_HashCode my_identity_hash;
 
 
+struct PeerInfo;
+
+/**
+ * Lookup peer by peer's identity.
+ * 
+ * @param target peer to look up
+ * @return NULL if we are not connected to @a target
+ */
+struct PeerInfo *
+GDS_NEIGHBOURS_lookup_peer (const struct GNUNET_PeerIdentity *target);
+
+
 /**
  * Perform a PUT operation.  Forwards the given request to other
  * peers.   Does not store the data locally.  Does not give the
@@ -94,7 +106,7 @@ GDS_NEIGHBOURS_handle_get (enum GNUNET_BLOCK_Type type,
  * other peers waiting for it.  Does not do local caching or
  * forwarding to local clients.
  *
- * @param target neighbour that should receive the block (if still connected)
+ * @param pi neighbour that should receive the block
  * @param type type of the block
  * @param bd details about the reply
  * @param query_hash query that was used for the request
@@ -102,7 +114,7 @@ GDS_NEIGHBOURS_handle_get (enum GNUNET_BLOCK_Type type,
  * @param get_path peers this reply has traversed so far (if tracked)
  */
 void
-GDS_NEIGHBOURS_handle_reply (const struct GNUNET_PeerIdentity *target,
+GDS_NEIGHBOURS_handle_reply (struct PeerInfo *pi,
                              const struct GDS_DATACACHE_BlockData *bd,
                              const struct GNUNET_HashCode *query_hash,
                              unsigned int get_path_length,
diff --git a/src/dht/gnunet-service-dht_routing.c 
b/src/dht/gnunet-service-dht_routing.c
index 8ba0c70ad..ec36eae75 100644
--- a/src/dht/gnunet-service-dht_routing.c
+++ b/src/dht/gnunet-service-dht_routing.c
@@ -179,14 +179,27 @@ process (void *cls,
   case GNUNET_BLOCK_REPLY_OK_MORE:
   case GNUNET_BLOCK_REPLY_OK_LAST:
   case GNUNET_BLOCK_REPLY_TYPE_NOT_SUPPORTED:
-    GNUNET_STATISTICS_update (GDS_stats,
-                              "# Good REPLIES matched against routing table",
-                              1,
-                              GNUNET_NO);
-    GDS_NEIGHBOURS_handle_reply (&rr->peer,
-                                 &bdx,
-                                 query_hash,
-                                 get_path_length, pc->get_path);
+    {
+      struct PeerInfo *pi;
+      
+      GNUNET_STATISTICS_update (GDS_stats,
+                                "# Good REPLIES matched against routing table",
+                                1,
+                                GNUNET_NO);
+      pi = GDS_NEIGHBOURS_lookup_peer (&rr->peer);
+      if (NULL == pi)
+      {
+        /* peer disconnected in the meantime, drop reply */
+        GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                    "No matching peer for reply for key %s\n",
+                    GNUNET_h2s (query_hash));
+        return GNUNET_OK;
+      }
+      GDS_NEIGHBOURS_handle_reply (pi,
+                                   &bdx,
+                                   query_hash,
+                                   get_path_length, pc->get_path);
+    }
     break;
   case GNUNET_BLOCK_REPLY_OK_DUPLICATE:
     GNUNET_STATISTICS_update (GDS_stats,

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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