gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r11941 - in gnunet: . src/fs src/include src/util


From: gnunet
Subject: [GNUnet-SVN] r11941 - in gnunet: . src/fs src/include src/util
Date: Fri, 25 Jun 2010 00:44:22 +0200

Author: grothoff
Date: 2010-06-25 00:44:22 +0200 (Fri, 25 Jun 2010)
New Revision: 11941

Modified:
   gnunet/TODO
   gnunet/src/fs/fs.h
   gnunet/src/fs/gnunet-service-fs.c
   gnunet/src/include/gnunet_crypto_lib.h
   gnunet/src/util/crypto_hash.c
Log:
hacking on fs features

Modified: gnunet/TODO
===================================================================
--- gnunet/TODO 2010-06-24 22:34:05 UTC (rev 11940)
+++ gnunet/TODO 2010-06-24 22:44:22 UTC (rev 11941)
@@ -1,15 +1,19 @@
 0.9.0pre1:
-* FS: [CG]
-  - TTL/priority calculations
-  - hot-path routing
 * TRANSPORT:
+  - PING Signing [CG]
   - HTTP backend [MW]
-* DV: [Nate]
-  - implement performance tests (needs tbench)
+* ARM:
+  - make listen socket forwarding to child processes on supported platforms
+    optional for debugging [CG/Nate]
+* CORE:
+  - derived key generation [Nils]
 * UTIL:
   - only connect() sockets that are ready (select()) [Nils]
     [On W32, we need to select after calling socket before doing connect etc.]
-* GNUNET-GTK:
+* DATASTORE [CG]:
+  - check for duplicates on insertion (currently, same content is frequently
+    stored again [seen with KBLOCKS and SBLOCKS]!)
+* GNUNET-GTK: [CG]
   - directory support:
     + download start: recursive/directory (!) & from-URI only
     + handle download lost-parent (move to 'from-URI only' tab)
@@ -26,22 +30,31 @@
     why is it so slow? Fix! (see core_api_reliability test)
   - implement API to get notifications about bandwidth assignments to 
individual peers
   - implement API to get notifications about updates to liveness of individual 
peers (before disconnect)
+* STATISTICS:
+  - implement notification-based statistics API
+* PEERINFO [CG]
+  - better API for trust management
 * TOPOLOGY:
   - needs more testing (especially F2F topology) & transport blacklisting
 * TBENCH: [MW]
   - good to have for transport/DV evaluation! 
+* DV: [Nate]
+  - implement performance tests (needs tbench)
 * DHT: [Nate]
   - implement DHT service 
   - implement testcases
   - implement performance tests
-* ARM: [Safey]
+* MONKEY: [Safey]
   - better crash management (attach debugging support, capture and analyze
     debug output, detect random vs. deterministic crashes)
+* ARM: [CG]
+  - handle gnunet-arm -k in combination with auto-start magic (what is the 
right thing here?)
   - discover dependencies between services
-  - handle gnunet-arm -k in combination with auto-start magic (what is the 
right thing here?)
-  - add listen socket forwarding to child processes on supported platforms
 * FS: [CG]
+  - trust & peerinfo integration
   - load considerations (migration, routing)
+  - bound our priorities based on priorities used by other peers
+  - artificial delays
   - active reply route caching design & implementation of service; gap 
extension!
   - datastore reservation (publishing)
   - location URIs (publish, search, download)
@@ -61,9 +74,7 @@
     + download
     + search
     + unindex
-* STATISTICS:
-  - implement notification-based statistics API
-* GNUNET-GTK:
+* GNUNET-GTK: [CG]
   - implement publish dialog details:
     + open (import directory structure)
     + normalize keywords (edit subdialog)
@@ -121,11 +132,11 @@
 * MYSQL database backends: [CG]
   - datacache
   - datastore
-* FS:
+* FS: [CG]
   - reconstruct IBLOCKS from DBLOCKS if possible (during download; see FIXME 
in fs_download)
   - add support for pushing "already seen" search results to FS service for 
bloomfilter (can wait)
   - use different 'priority' for probe downloads vs. normal downloads
-* ARM:
+* ARM: [CG/Safey]
   - better tracking of which config changes actually need to cause process 
restarts by ARM.
 * SETUP:
   - design & implement new setup tool
@@ -186,9 +197,6 @@
 * TRANSPORT:
   - need to periodically probe latency/transport cost changes & possibly 
switch transport
   - should use hash map to look up Neighbours (service AND plugins!)
-* DATASTORE (?):
-  - check for duplicates on insertion (currently, same content is frequently
-    stored again [seen with KBLOCKS and SBLOCKS]!)
 * PEERINFO:
   - merge multiple HELLOs of the same peer in the transmission queue
     (theoretically reduces overhead; bounds message queue size)

Modified: gnunet/src/fs/fs.h
===================================================================
--- gnunet/src/fs/fs.h  2010-06-24 22:34:05 UTC (rev 11940)
+++ gnunet/src/fs/fs.h  2010-06-24 22:44:22 UTC (rev 11941)
@@ -157,7 +157,7 @@
 /**
  * Bandwidth value of an (effectively) 0-priority query.
  */
-#define QUERY_BANDWIDTH_VALUE 0.001
+#define QUERY_BANDWIDTH_VALUE 1
 
 /**
  * Bandwidth value of a 0-priority content (must be
@@ -166,7 +166,7 @@
  * since it can take many queries to get one piece of
  * content).
  */
-#define CONTENT_BANDWIDTH_VALUE 0.8
+#define CONTENT_BANDWIDTH_VALUE 800
 
 /**
  * By which amount do we decrement the TTL for simple forwarding /

Modified: gnunet/src/fs/gnunet-service-fs.c
===================================================================
--- gnunet/src/fs/gnunet-service-fs.c   2010-06-24 22:34:05 UTC (rev 11940)
+++ gnunet/src/fs/gnunet-service-fs.c   2010-06-24 22:44:22 UTC (rev 11941)
@@ -23,13 +23,16 @@
  * @brief gnunet anonymity protocol implementation
  * @author Christian Grothoff
  *
- * FIXME:
- * - TTL/priority calculations are absent!
  * TODO:
- * - have non-zero preference / priority for requests we initiate!
- * - implement hot-path routing decision procedure
- * - implement: bound_priority, test_load_too_high
- * - statistics
+ * - trust not properly received and pushed back to peerinfo!
+ * - bound_priority by priorities used by other peers
+ * - have a way to drop queries based on load
+ * - introduce random latency in processing
+ * - consider more precise latency estimation (per-peer & request)
+ * - better algorithm for priority selection for requests we initiate?
+ * - tell other peers to stop migration if our PUTs fail (or if
+ *   we don't support migration per configuration?)
+ * - more statistics
  */
 #include "platform.h"
 #include <float.h>
@@ -48,7 +51,6 @@
 
 /**
  * Maximum number of outgoing messages we queue per peer.
- * FIXME: make configurable?
  */
 #define MAX_QUEUE_PER_PEER 16
 
@@ -204,11 +206,16 @@
 
   /**
    * Increase in traffic preference still to be submitted
-   * to the core service for this peer. FIXME: double or 'uint64_t'?
+   * to the core service for this peer.
    */
-  double inc_preference;
+  uint64_t inc_preference;
 
   /**
+   * Trust delta to still commit to the system.
+   */
+  uint32_t trust_delta;
+
+  /**
    * The peer's identity.
    */
   GNUNET_PEER_Id pid;  
@@ -480,7 +487,6 @@
   struct GNUNET_DATASTORE_QueueEntry *qe;
 
   /**
-
    * Size of the 'bf' (in bytes).
    */
   size_t bf_size;
@@ -1247,7 +1253,11 @@
                                             &consider_migration,
                                             pos);
     }
-
+  if (cp->trust_delta > 0)
+    {
+      /* FIXME: push trust back to peerinfo! 
+        (need better peerinfo API!) */
+    }
   GNUNET_PEER_change_rc (cp->pid, -1);
   GNUNET_PEER_decrement_rcs (cp->last_p2p_replies, P2P_SUCCESS_LIST_SIZE);
   if (NULL != cp->cth)
@@ -1856,11 +1866,6 @@
       return;
     }
   no_route = GNUNET_NO;
-  /* FIXME: check against DBLOCK_SIZE and possibly return
-     amount to reserve; however, this also needs to work
-     with testcases which currently start out with a far
-     too low per-peer bw limit, so they would never send
-     anything.  Big issue. */
   if (amount == 0)
     {
       if (pr->cp == NULL)
@@ -1997,7 +2002,13 @@
 
   /* 1) check that this peer is not the initiator */
   if (cp == pr->cp)
-    return GNUNET_YES; /* skip */         
+    {
+#if DEBUG_FS
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                 "Skipping initiator in forwarding selection\n");
+#endif
+      return GNUNET_YES; /* skip */       
+    }
 
   /* 2) check if we have already (recently) forwarded to this peer */
   pc = 0;
@@ -2022,13 +2033,47 @@
                "Re-trying query that was previously transmitted %u times to 
this peer\n",
                (unsigned int) pc);
 #endif
-  // 3) calculate how much we'd like to forward to this peer
-  score = 42; // FIXME!
-  // FIXME: also need API to gather data on responsiveness
-  // of this peer (we have fields for that in 'cp', but
-  // they are never set!)
-  
+  /* 3) calculate how much we'd like to forward to this peer,
+     starting with a random value that is strong enough
+     to at least give any peer a chance sometimes 
+     (compared to the other factors that come later) */
+  /* 3a) count successful (recent) routes from cp for same source */
+  if (pr->cp != NULL)
+    {
+      score = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                       P2P_SUCCESS_LIST_SIZE);
+      for (i=0;i<P2P_SUCCESS_LIST_SIZE;i++)
+       if (cp->last_p2p_replies[i] == pr->cp->pid)
+         score += 1; /* likely successful based on hot path */
+    }
+  else
+    {
+      score = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                       CS2P_SUCCESS_LIST_SIZE);
+      for (i=0;i<CS2P_SUCCESS_LIST_SIZE;i++)
+       if (cp->last_client_replies[i] == 
pr->client_request_list->client_list->client)
+         score += 1; /* likely successful based on hot path */
+    }
+  /* 3b) include latency */
+  if (cp->avg_delay.value < 4 * TTL_DECREMENT)
+    score += 1; /* likely fast based on latency */
+  /* 3c) include priorities */
+  if (cp->avg_priority <= pr->remaining_priority / 2.0)
+    score += 1; /* likely successful based on priorities */
+  /* 3d) penalize for queue size */  
+  score -= (2.0 * cp->pending_requests / (double) MAX_QUEUE_PER_PEER); 
+  /* 3e) include peer proximity */
+  score -= (2.0 * (GNUNET_CRYPTO_hash_distance_u32 (key,
+                                                   &pr->query)) / (double) 
UINT32_MAX);
   /* store best-fit in closure */
+#if DEBUG_FS
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+             "Peer `%s' gets score %f for forwarding query, max is %f\n",
+             GNUNET_h2s (key),
+             score,
+             psc->target_score);
+#endif  
+  score++; /* avoid zero */
   if (score > psc->target_score)
     {
       psc->target_score = score;
@@ -2066,7 +2111,7 @@
 
 
 /**
- * We're processing a GET request from another peer and have decided
+ * We're processing a GET request and have decided
  * to forward it to other peers.  This function is called periodically
  * and should forward the request to other peers until we have all
  * possible replies.  If we have transmitted the *only* reply to
@@ -2100,11 +2145,11 @@
     return; /* configured to not do P2P search */
   /* (1) select target */
   psc.pr = pr;
-  psc.target_score = DBL_MIN;
+  psc.target_score = -DBL_MAX;
   GNUNET_CONTAINER_multihashmap_iterate (connected_peers,
                                         &target_peer_select_cb,
                                         &psc);  
-  if (psc.target_score == DBL_MIN)
+  if (psc.target_score == -DBL_MAX)
     {
       delay = get_processing_delay ();
 #if DEBUG_FS 
@@ -2120,7 +2165,6 @@
       return; /* nobody selected */
     }
   /* (3) update TTL/priority */
-  
   if (pr->client_request_list != NULL)
     {
       /* FIXME: use better algorithm!? */
@@ -2139,10 +2183,6 @@
                  pr->ttl);
 #endif
     }
-  else
-    {
-      /* FIXME: should we do something here as well!? */
-    }
 
   /* (3) reserve reply bandwidth */
   cp = GNUNET_CONTAINER_multihashmap_get (connected_peers,
@@ -2153,10 +2193,10 @@
                                                
GNUNET_CONSTANTS_SERVICE_TIMEOUT, 
                                                GNUNET_BANDWIDTH_value_init 
(UINT32_MAX),
                                                DBLOCK_SIZE * 2, 
-                                               (uint64_t) cp->inc_preference,
+                                               cp->inc_preference,
                                                &target_reservation_cb,
                                                pr);
-  cp->inc_preference = 0.0;
+  cp->inc_preference = 0;
 }
 
 
@@ -2574,6 +2614,7 @@
   GNUNET_HashCode query;
   struct ProcessReplyClosure prq;
   const struct SBlock *sb;
+  struct ConnectedPeer *cps;
 
   msize = ntohs (message->size);
   if (msize < sizeof (struct PutMessage))
@@ -2629,6 +2670,10 @@
                                              &query,
                                              &process_reply,
                                              &prq);
+  cps = GNUNET_CONTAINER_multihashmap_get (connected_peers,
+                                          &other->hashPubKey);
+  cps->inc_preference += CONTENT_BANDWIDTH_VALUE + 1000 * prq.priority;
+  cps->trust_delta += prq.priority;
   if (GNUNET_YES == active_migration)
     {
 #if DEBUG_FS
@@ -2907,7 +2952,13 @@
 bound_priority (uint32_t prio_in,
                struct ConnectedPeer *cp)
 {
-  return 0; // FIXME!
+  if (cp->trust_delta > prio_in)
+    {
+      cp->trust_delta -= prio_in;
+      return prio_in;
+    }
+  // FIXME: get out trust in the target peer from peerinfo!
+  return 0; 
 }
 
 
@@ -2973,7 +3024,6 @@
   size_t bfsize;
   uint32_t ttl_decrement;
   enum GNUNET_BLOCK_Type type;
-  double preference;
   int have_ns;
 
   msize = ntohs(message->size);
@@ -3195,11 +3245,7 @@
                            GNUNET_NO);
 
   /* calculate change in traffic preference */
-  preference = (double) pr->priority;
-  if (preference < QUERY_BANDWIDTH_VALUE)
-    preference = QUERY_BANDWIDTH_VALUE;
-  cps->inc_preference += preference;
-
+  cps->inc_preference += pr->priority * 1000 + QUERY_BANDWIDTH_VALUE;
   /* process locally */
   if (type == GNUNET_BLOCK_TYPE_DBLOCK)
     type = GNUNET_BLOCK_TYPE_ANY; /* to get on-demand as well */

Modified: gnunet/src/include/gnunet_crypto_lib.h
===================================================================
--- gnunet/src/include/gnunet_crypto_lib.h      2010-06-24 22:34:05 UTC (rev 
11940)
+++ gnunet/src/include/gnunet_crypto_lib.h      2010-06-24 22:44:22 UTC (rev 
11941)
@@ -335,7 +335,7 @@
  *
  * @param a some hash code
  * @param b some hash code
- * @return number between 0 and 65536
+ * @return number between 0 and UINT32_MAX
  */
 uint32_t GNUNET_CRYPTO_hash_distance_u32 (const GNUNET_HashCode * a,
                                          const GNUNET_HashCode * b);

Modified: gnunet/src/util/crypto_hash.c
===================================================================
--- gnunet/src/util/crypto_hash.c       2010-06-24 22:34:05 UTC (rev 11940)
+++ gnunet/src/util/crypto_hash.c       2010-06-24 22:44:22 UTC (rev 11941)
@@ -668,8 +668,10 @@
  * fast, not involve bits[0] or bits[4] (they're used elsewhere), and be
  * somewhat consistent. And of course, the result should be a positive
  * number.
- *
- * @returns a positive number which is a measure for
+ * 
+ * @param a some hash code
+ * @param b some hash code
+ * @return a positive number which is a measure for
  *  hashcode proximity.
  */
 unsigned int




reply via email to

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