gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r37675 - gnunet/src/dht


From: gnunet
Subject: [GNUnet-SVN] r37675 - gnunet/src/dht
Date: Mon, 8 Aug 2016 15:17:24 +0200

Author: grothoff
Date: 2016-08-08 15:17:24 +0200 (Mon, 08 Aug 2016)
New Revision: 37675

Modified:
   gnunet/src/dht/gnunet-service-dht_neighbours.c
Log:
eliminate constantly hashing PIDs by storing and caching the result

Modified: gnunet/src/dht/gnunet-service-dht_neighbours.c
===================================================================
--- gnunet/src/dht/gnunet-service-dht_neighbours.c      2016-08-07 20:42:32 UTC 
(rev 37674)
+++ gnunet/src/dht/gnunet-service-dht_neighbours.c      2016-08-08 13:17:24 UTC 
(rev 37675)
@@ -281,6 +281,16 @@
    */
   const struct GNUNET_PeerIdentity *id;
 
+  /**
+   * Hash of @e id.
+   */
+  struct GNUNET_HashCode phash;
+
+  /**
+   * Which bucket is this peer in?
+   */
+  int peer_bucket;
+
 };
 
 
@@ -630,8 +640,10 @@
                             &mh);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Adding known peer (%s) to bloomfilter for FIND PEER with 
mutation %u\n",
-              GNUNET_i2s (key), ctx->bf_mutator);
-  GNUNET_CONTAINER_bloomfilter_add (ctx->bloom, &mh);
+              GNUNET_i2s (key),
+              ctx->bf_mutator);
+  GNUNET_CONTAINER_bloomfilter_add (ctx->bloom,
+                                    &mh);
   return GNUNET_YES;
 }
 
@@ -713,9 +725,7 @@
                      const struct GNUNET_PeerIdentity *peer,
                     struct GNUNET_MQ_Handle *mq)
 {
-  struct PeerInfo *ret;
-  struct GNUNET_HashCode phash;
-  int peer_bucket;
+  struct PeerInfo *pi;
 
   /* Check for connect to self message */
   if (0 == memcmp (&my_identity,
@@ -732,27 +742,28 @@
                             gettext_noop ("# peers connected"),
                             1,
                             GNUNET_NO);
+  pi = GNUNET_new (struct PeerInfo);
+  pi->id = peer;
+  pi->mq = mq;
   GNUNET_CRYPTO_hash (peer,
                      sizeof (struct GNUNET_PeerIdentity),
-                     &phash);
-  peer_bucket = find_bucket (&phash);
-  GNUNET_assert ((peer_bucket >= 0) && (peer_bucket < MAX_BUCKETS));
-  ret = GNUNET_new (struct PeerInfo);
-  ret->id = peer;
-  ret->mq = mq;
-  GNUNET_CONTAINER_DLL_insert_tail (k_buckets[peer_bucket].head,
-                                    k_buckets[peer_bucket].tail,
-                                    ret);
-  k_buckets[peer_bucket].peers_size++;
+                     &pi->phash);
+  pi->peer_bucket = find_bucket (&pi->phash);
+  GNUNET_assert ( (pi->peer_bucket >= 0) &&
+                  (pi->peer_bucket < MAX_BUCKETS) );
+  GNUNET_CONTAINER_DLL_insert_tail (k_buckets[pi->peer_bucket].head,
+                                    k_buckets[pi->peer_bucket].tail,
+                                    pi);
+  k_buckets[pi->peer_bucket].peers_size++;
   closest_bucket = GNUNET_MAX (closest_bucket,
-                               peer_bucket);
+                               pi->peer_bucket);
   GNUNET_assert (GNUNET_OK ==
                  GNUNET_CONTAINER_multipeermap_put (all_connected_peers,
-                                                    ret->id,
-                                                    ret,
+                                                    pi->id,
+                                                    pi,
                                                     
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY));
-  if ( (peer_bucket > 0) &&
-       (k_buckets[peer_bucket].peers_size <= bucket_size))
+  if ( (pi->peer_bucket > 0) &&
+       (k_buckets[pi->peer_bucket].peers_size <= bucket_size))
   {
     update_connect_preferences ();
     newly_found_peers++;
@@ -765,7 +776,7 @@
     find_peer_task = GNUNET_SCHEDULER_add_now (&send_find_peer_message,
                                                NULL);
   }
-  return ret;
+  return pi;
 }
 
 
@@ -782,8 +793,6 @@
                        void *internal_cls)
 {
   struct PeerInfo *to_remove = internal_cls;
-  int current_bucket;
-  struct GNUNET_HashCode phash;
 
   /* Check for disconnect from self message */
   if (NULL == to_remove)
@@ -805,20 +814,16 @@
     GNUNET_SCHEDULER_cancel (find_peer_task);
     find_peer_task = NULL;
   }
-  GNUNET_CRYPTO_hash (peer,
-                     sizeof (struct GNUNET_PeerIdentity),
-                     &phash);
-  current_bucket = find_bucket (&phash);
-  GNUNET_assert (current_bucket >= 0);
-  GNUNET_CONTAINER_DLL_remove (k_buckets[current_bucket].head,
-                               k_buckets[current_bucket].tail,
+  GNUNET_assert (to_remove->peer_bucket >= 0);
+  GNUNET_CONTAINER_DLL_remove (k_buckets[to_remove->peer_bucket].head,
+                               k_buckets[to_remove->peer_bucket].tail,
                                to_remove);
-  GNUNET_assert (k_buckets[current_bucket].peers_size > 0);
-  k_buckets[current_bucket].peers_size--;
+  GNUNET_assert (k_buckets[to_remove->peer_bucket].peers_size > 0);
+  k_buckets[to_remove->peer_bucket].peers_size--;
   while ( (closest_bucket > 0) &&
-          (0 == k_buckets[closest_bucket].peers_size) )
+          (0 == k_buckets[to_remove->peer_bucket].peers_size) )
     closest_bucket--;
-  if (k_buckets[current_bucket].peers_size < bucket_size)
+  if (k_buckets[to_remove->peer_bucket].peers_size < bucket_size)
     update_connect_preferences ();
   GNUNET_free (to_remove);
 }
@@ -907,7 +912,8 @@
 
   /* first, calculate the most significant 9 bits of our
    * result, aka the number of LSBs */
-  bucket = GNUNET_CRYPTO_hash_matching_bits (target, have);
+  bucket = GNUNET_CRYPTO_hash_matching_bits (target,
+                                             have);
   /* bucket is now a value between 0 and 512 */
   if (bucket == 512)
     return 0;                   /* perfect match */
@@ -953,28 +959,27 @@
   int bucket_num;
   int count;
   struct PeerInfo *pos;
-  struct GNUNET_HashCode phash;
 
   if (0 == memcmp (&my_identity_hash, key, sizeof (struct GNUNET_HashCode)))
     return GNUNET_YES;
   bucket_num = find_bucket (key);
   GNUNET_assert (bucket_num >= 0);
-  bits = GNUNET_CRYPTO_hash_matching_bits (&my_identity_hash, key);
+  bits = GNUNET_CRYPTO_hash_matching_bits (&my_identity_hash,
+                                           key);
   pos = k_buckets[bucket_num].head;
   count = 0;
   while ((NULL != pos) && (count < bucket_size))
   {
-    GNUNET_CRYPTO_hash (pos->id,
-                       sizeof (struct GNUNET_PeerIdentity),
-                       &phash);
     if ((NULL != bloom) &&
         (GNUNET_YES ==
-         GNUNET_CONTAINER_bloomfilter_test (bloom, &phash)))
+         GNUNET_CONTAINER_bloomfilter_test (bloom,
+                                            &pos->phash)))
     {
       pos = pos->next;
       continue;                 /* Skip already checked entries */
     }
-    other_bits = GNUNET_CRYPTO_hash_matching_bits (&phash, key);
+    other_bits = GNUNET_CRYPTO_hash_matching_bits (&pos->phash,
+                                                   key);
     if (other_bits > bits)
       return GNUNET_NO;
     if (other_bits == bits)     /* We match the same number of bits */
@@ -1015,7 +1020,6 @@
   unsigned int dist;
   unsigned int smallest_distance;
   struct PeerInfo *chosen;
-  struct GNUNET_HashCode phash;
 
   if (hops >= GDS_NSE_get ())
   {
@@ -1028,14 +1032,13 @@
       count = 0;
       while ((pos != NULL) && (count < bucket_size))
       {
-       GNUNET_CRYPTO_hash (pos->id,
-                           sizeof (struct GNUNET_PeerIdentity),
-                           &phash);
         if ((bloom == NULL) ||
             (GNUNET_NO ==
-             GNUNET_CONTAINER_bloomfilter_test (bloom, &phash)))
+             GNUNET_CONTAINER_bloomfilter_test (bloom,
+                                                &pos->phash)))
         {
-          dist = get_distance (key, &phash);
+          dist = get_distance (key,
+                               &pos->phash);
           if (dist < smallest_distance)
           {
             chosen = pos;
@@ -1049,10 +1052,11 @@
                       GNUNET_i2s (pos->id),
                      GNUNET_h2s (key));
           GNUNET_STATISTICS_update (GDS_stats,
-                                    gettext_noop
-                                    ("# Peers excluded from routing due to 
Bloomfilter"),
-                                    1, GNUNET_NO);
-          dist = get_distance (key, &phash);
+                                    gettext_noop ("# Peers excluded from 
routing due to Bloomfilter"),
+                                    1,
+                                    GNUNET_NO);
+          dist = get_distance (key,
+                               &pos->phash);
           if (dist < smallest_distance)
           {
             chosen = NULL;
@@ -1078,12 +1082,10 @@
     pos = k_buckets[bc].head;
     while ((pos != NULL) && (count < bucket_size))
     {
-      GNUNET_CRYPTO_hash (pos->id,
-                         sizeof (struct GNUNET_PeerIdentity),
-                         &phash);
       if ((bloom != NULL) &&
           (GNUNET_YES ==
-           GNUNET_CONTAINER_bloomfilter_test (bloom, &phash)))
+           GNUNET_CONTAINER_bloomfilter_test (bloom,
+                                              &pos->phash)))
       {
         GNUNET_STATISTICS_update (GDS_stats,
                                   gettext_noop
@@ -1108,18 +1110,17 @@
     return NULL;
   }
   /* Now actually choose a peer */
-  selected = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, count);
+  selected = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                       count);
   count = 0;
   for (bc = 0; bc <= closest_bucket; bc++)
   {
     for (pos = k_buckets[bc].head; ((pos != NULL) && (count < bucket_size)); 
pos = pos->next)
     {
-      GNUNET_CRYPTO_hash (pos->id,
-                         sizeof (struct GNUNET_PeerIdentity),
-                         &phash);
       if ((bloom != NULL) &&
           (GNUNET_YES ==
-           GNUNET_CONTAINER_bloomfilter_test (bloom, &phash)))
+           GNUNET_CONTAINER_bloomfilter_test (bloom,
+                                              &pos->phash)))
       {
         continue;               /* Ignore bloomfiltered peers */
       }
@@ -1156,7 +1157,6 @@
   unsigned int off;
   struct PeerInfo **rtargets;
   struct PeerInfo *nxt;
-  struct GNUNET_HashCode nhash;
 
   GNUNET_assert (NULL != bloom);
   ret = get_forward_count (hop_count,
@@ -1174,13 +1174,11 @@
     if (NULL == nxt)
       break;
     rtargets[off] = nxt;
-    GNUNET_CRYPTO_hash (nxt->id,
-                       sizeof (struct GNUNET_PeerIdentity),
-                       &nhash);
     GNUNET_break (GNUNET_NO ==
                   GNUNET_CONTAINER_bloomfilter_test (bloom,
-                                                     &nhash));
-    GNUNET_CONTAINER_bloomfilter_add (bloom, &nhash);
+                                                     &nxt->phash));
+    GNUNET_CONTAINER_bloomfilter_add (bloom,
+                                      &nxt->phash);
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Selected %u/%u peers at hop %u for %s (target was %u)\n",
@@ -1246,7 +1244,6 @@
   struct GNUNET_MQ_Envelope *env;
   struct PeerPutMessage *ppm;
   struct GNUNET_PeerIdentity *pp;
-  struct GNUNET_HashCode thash;
   unsigned int skip_count;
 
   GNUNET_assert (NULL != bf);
@@ -1320,12 +1317,9 @@
     ppm->desired_replication_level = htonl (desired_replication_level);
     ppm->put_path_length = htonl (put_path_length);
     ppm->expiration_time = GNUNET_TIME_absolute_hton (expiration_time);
-    GNUNET_CRYPTO_hash (target->id,
-                       sizeof (struct GNUNET_PeerIdentity),
-                       &thash);
     GNUNET_break (GNUNET_YES ==
                   GNUNET_CONTAINER_bloomfilter_test (bf,
-                                                     &thash));
+                                                     &target->phash));
     GNUNET_assert (GNUNET_OK ==
                    GNUNET_CONTAINER_bloomfilter_get_raw_data (bf,
                                                               ppm->bloomfilter,
@@ -1383,7 +1377,6 @@
   struct PeerGetMessage *pgm;
   char *xq;
   size_t reply_bf_size;
-  struct GNUNET_HashCode thash;
   unsigned int skip_count;
 
   GNUNET_assert (NULL != peer_bf);
@@ -1451,12 +1444,9 @@
     pgm->desired_replication_level = htonl (desired_replication_level);
     pgm->xquery_size = htonl (xquery_size);
     pgm->bf_mutator = reply_bf_mutator;
-    GNUNET_CRYPTO_hash (target->id,
-                       sizeof (struct GNUNET_PeerIdentity),
-                       &thash);
     GNUNET_break (GNUNET_YES ==
                   GNUNET_CONTAINER_bloomfilter_test (peer_bf,
-                                                     &thash));
+                                                     &target->phash));
     GNUNET_assert (GNUNET_OK ==
                    GNUNET_CONTAINER_bloomfilter_get_raw_data (peer_bf,
                                                               pgm->bloomfilter,
@@ -1649,7 +1639,6 @@
   enum GNUNET_DHT_RouteOption options;
   struct GNUNET_CONTAINER_BloomFilter *bf;
   struct GNUNET_HashCode test_key;
-  struct GNUNET_HashCode phash;
   int forwarded;
 
   msize = ntohs (put->header.size);
@@ -1672,9 +1661,6 @@
              "PUT for `%s' from %s\n",
               GNUNET_h2s (&put->key),
              GNUNET_i2s (peer->id));
-  GNUNET_CRYPTO_hash (peer->id,
-                     sizeof (struct GNUNET_PeerIdentity),
-                     &phash);
   if (GNUNET_YES == log_route_details_stderr)
   {
     char *tmp;
@@ -1686,7 +1672,7 @@
                  GNUNET_i2s (peer->id),
                  tmp,
                  ntohl(put->hop_count),
-                 GNUNET_CRYPTO_hash_matching_bits (&phash,
+                 GNUNET_CRYPTO_hash_matching_bits (&peer->phash,
                                                    &put->key),
                  GNUNET_CRYPTO_hash_matching_bits (&my_identity_hash,
                                                    &put->key)
@@ -1754,7 +1740,7 @@
                                           GNUNET_CONSTANTS_BLOOMFILTER_K);
   GNUNET_break_op (GNUNET_YES ==
                    GNUNET_CONTAINER_bloomfilter_test (bf,
-                                                     &phash));
+                                                     &peer->phash));
   {
     struct GNUNET_PeerIdentity pp[putlen + 1];
 
@@ -1835,7 +1821,6 @@
   struct PeerBucket *bucket;
   struct PeerInfo *peer;
   unsigned int choice;
-  struct GNUNET_HashCode phash;
   struct GNUNET_HashCode mhash;
   const struct GNUNET_HELLO_Message *hello;
 
@@ -1906,10 +1891,7 @@
       return;                   /* no non-masked peer available */
     if (NULL == peer)
       peer = bucket->head;
-    GNUNET_CRYPTO_hash (peer->id,
-                        sizeof (struct GNUNET_PeerIdentity),
-                        &phash);
-    GNUNET_BLOCK_mingle_hash (&phash,
+    GNUNET_BLOCK_mingle_hash (&peer->phash,
                               bf_mutator,
                               &mhash);
     hello = GDS_HELLO_get (peer->id);
@@ -1976,7 +1958,6 @@
   struct GNUNET_CONTAINER_BloomFilter *reply_bf;
   struct GNUNET_CONTAINER_BloomFilter *peer_bf;
   const char *xquery;
-  struct GNUNET_HashCode phash;
   int forwarded;
 
   if (NULL == peer)
@@ -2000,9 +1981,6 @@
                             gettext_noop ("# P2P GET bytes received"),
                            msize,
                             GNUNET_NO);
-  GNUNET_CRYPTO_hash (peer->id,
-                      sizeof (struct GNUNET_PeerIdentity),
-                      &phash);
   if (GNUNET_YES == log_route_details_stderr)
   {
     char *tmp;
@@ -2014,7 +1992,7 @@
                 GNUNET_i2s (peer->id),
                 tmp,
                  ntohl(get->hop_count),
-                 GNUNET_CRYPTO_hash_matching_bits (&phash,
+                 GNUNET_CRYPTO_hash_matching_bits (&peer->phash,
                                                   &get->key),
                  GNUNET_CRYPTO_hash_matching_bits (&my_identity_hash,
                                                   &get->key),
@@ -2052,7 +2030,7 @@
                                               GNUNET_CONSTANTS_BLOOMFILTER_K);
   GNUNET_break_op (GNUNET_YES ==
                    GNUNET_CONTAINER_bloomfilter_test (peer_bf,
-                                                      &phash));
+                                                      &peer->phash));
   /* remember request for routing replies */
   GDS_ROUTING_add (peer->id,
                   type,
@@ -2164,8 +2142,8 @@
   }
   return GNUNET_OK;
 }
-  
 
+
 /**
  * Core handler for p2p result messages.
  *




reply via email to

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