gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [gnunet] branch master updated: more work on peer and paths


From: gnunet
Subject: [GNUnet-SVN] [gnunet] branch master updated: more work on peer and paths structures
Date: Mon, 16 Jan 2017 12:06:19 +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 1cd8dfd4a more work on peer and paths structures
1cd8dfd4a is described below

commit 1cd8dfd4aa8312fae7602a0951f291e89ee68c16
Author: Christian Grothoff <address@hidden>
AuthorDate: Mon Jan 16 12:06:17 2017 +0100

    more work on peer and paths structures
---
 src/cadet/gnunet-service-cadet-new.h       |  12 ++++
 src/cadet/gnunet-service-cadet-new_dht.h   |   4 +-
 src/cadet/gnunet-service-cadet-new_paths.c | 110 ++++++++++++++++++++++++++---
 src/cadet/gnunet-service-cadet-new_paths.h |   6 +-
 src/cadet/gnunet-service-cadet-new_peer.c  |  64 ++++++++++++++---
 5 files changed, 172 insertions(+), 24 deletions(-)

diff --git a/src/cadet/gnunet-service-cadet-new.h 
b/src/cadet/gnunet-service-cadet-new.h
index 694a5f7fd..2b68862b7 100644
--- a/src/cadet/gnunet-service-cadet-new.h
+++ b/src/cadet/gnunet-service-cadet-new.h
@@ -28,6 +28,8 @@
 #ifndef GNUNET_SERVICE_CADET_H
 #define GNUNET_SERVICE_CADET_H
 
+#include "gnunet_util_lib.h"
+
 /**
  * A client to the CADET service.
  */
@@ -77,6 +79,16 @@ struct CadetPeerPathEntry
    * Path this entry belongs to.
    */
   struct CadetPeerPath *path;
+
+  /**
+   * Path's historic score up to this point.  Basically, how often did
+   * we succeed or fail to use the path up to this entry in a
+   * connection.  Positive values indicate good experiences, negative
+   * values bad experiences.  Code updating the score must guard
+   * against overflows.
+   */
+  int score;
+
 };
 
 
diff --git a/src/cadet/gnunet-service-cadet-new_dht.h 
b/src/cadet/gnunet-service-cadet-new_dht.h
index 70f834de5..ff3923790 100644
--- a/src/cadet/gnunet-service-cadet-new_dht.h
+++ b/src/cadet/gnunet-service-cadet-new_dht.h
@@ -51,11 +51,11 @@ struct GCD_search_handle;
  *
  * @param cls Closure.
  * @param path An unchecked, unoptimized path to the target node.
- *             After callback will no longer be valid!
+ *             After callback will no longer be valid, unless #GCPP_acquire() 
is called!
  */
 typedef void
 (*GCD_search_callback) (void *cls,
-                        const struct CadetPeerPath *path);
+                        struct CadetPeerPath *path);
 
 
 /**
diff --git a/src/cadet/gnunet-service-cadet-new_paths.c 
b/src/cadet/gnunet-service-cadet-new_paths.c
index baffb20d2..663ce317f 100644
--- a/src/cadet/gnunet-service-cadet-new_paths.c
+++ b/src/cadet/gnunet-service-cadet-new_paths.c
@@ -26,9 +26,49 @@
  * @author Christian Grothoff
  */
 #include "platform.h"
+#include "gnunet-service-cadet-new_peer.h"
 #include "gnunet-service-cadet-new_paths.h"
 
 
+/**
+ * Information regarding a possible path to reach a peer.
+ */
+struct CadetPeerPath
+{
+
+  /**
+   * Array of all the peers on the path.  If @e hn is non-NULL, the
+   * last one is our owner.
+   */
+  struct CadetPeerPathEntry *entries;
+
+  /**
+   * Node of this path in the owner's heap.  Used to update our position
+   * in the heap whenever our @e desirability changes.
+   */
+  struct GNUNET_CONTAINER_HeapNode *hn;
+
+  /**
+   * Connections using this path, by destination peer
+   * (each hop of the path could correspond to an
+   * active connection).
+   */
+  struct GNUNET_CONTAINER_MultiPeerMap *connections;
+
+  /**
+   * Desirability of the path. How unique is it for the various peers
+   * on it?
+   */
+  GNUNET_CONTAINER_HeapCostType desirability;
+
+  /**
+   * Length of the @e entries array.
+   */
+  unsigned int entries_length;
+
+};
+
+
 
 /**
  * Return how much we like keeping the path.  This is an aggregate
@@ -44,7 +84,7 @@
  * @return desirability of the path, larger is more desirable
  */
 GNUNET_CONTAINER_HeapCostType
-GCPP_get_desirability (struct CadetPeerPath *path)
+GCPP_get_desirability (const struct CadetPeerPath *path)
 {
   GNUNET_assert (0);
   return 0;
@@ -72,23 +112,58 @@ GCPP_acquire (struct CadetPeerPath *path,
 
 
 /**
- * The given peer @a cp used to own this @a path.  However, it is no
- * longer interested in maintaining it, so the path should be
- * discarded or shortened (in case a previous peer on the path finds
- * the path desirable).
+ * The owning peer of this path is no longer interested in maintaining
+ * it, so the path should be discarded or shortened (in case a
+ * previous peer on the path finds the path desirable).
  *
  * @param path the path that is being released
- * @param cp original final destination of @a path
  */
 void
-GCPP_release (struct CadetPeerPath *path,
-              struct CadetPeer *cp)
+GCPP_release (struct CadetPeerPath *path)
 {
   GNUNET_assert (0);
 }
 
 
 /**
+ * Updates the score for an entry on the path based
+ * on our experiences with using @a path.
+ *
+ * @param path the path to update
+ * @param off offset of the entry to update
+ * @param delta change in the score to apply
+ */
+void
+GCPP_update_score (struct CadetPeerPath *path,
+                   unsigned int off,
+                   int delta)
+{
+  struct CadetPeerPathEntry *entry;
+
+  GNUNET_assert (off < path->entries_length);
+  entry = &path->entries[off];
+
+  /* Add delta, with checks for overflows */
+  if (delta >= 0)
+  {
+    if (delta + entry->score < entry->score)
+      entry->score = INT_MAX;
+    else
+      entry->score += delta;
+  }
+  else
+  {
+    if (delta + entry->score > entry->score)
+      entry->score = INT_MIN;
+    else
+      entry->score += delta;
+  }
+
+  /* FIXME: update path desirability! */
+}
+
+
+/**
  * Create a peer path based on the result of a DHT lookup.
  *
  * @param get_path path of the get request
@@ -103,6 +178,25 @@ GCPP_path_from_dht (const struct GNUNET_PeerIdentity 
*get_path,
                     const struct GNUNET_PeerIdentity *put_path,
                     unsigned int put_path_length)
 {
+  struct CadetPeerPath *path;
+
+  path = GNUNET_new (struct CadetPeerPath);
+  path->entries_length = get_path_length + put_path_length;
+  path->entries = GNUNET_new_array (path->entries_length,
+                                    struct CadetPeerPathEntry);
+  for (unsigned int i=0;i<get_path_length + put_path_length;i++)
+  {
+    struct CadetPeerPathEntry *entry = &path->entries[i];
+    const struct GNUNET_PeerIdentity *pid;
+
+    pid = (i < get_path_length) ? &get_path[get_path_length - i] : 
&put_path[path->entries_length - i];
+    entry->peer = GCP_get (pid,
+                           GNUNET_YES);
+    entry->path = path;
+    GCP_path_entry_add (entry->peer,
+                        entry,
+                        i);
+  }
   GNUNET_break (0);
   return NULL;
 }
diff --git a/src/cadet/gnunet-service-cadet-new_paths.h 
b/src/cadet/gnunet-service-cadet-new_paths.h
index 55e521bbf..e00b05a3d 100644
--- a/src/cadet/gnunet-service-cadet-new_paths.h
+++ b/src/cadet/gnunet-service-cadet-new_paths.h
@@ -81,7 +81,7 @@ GCPP_get_length (struct CadetPeerPath *path);
  * @return desirability of the path, larger is more desirable
  */
 GNUNET_CONTAINER_HeapCostType
-GCPP_get_desirability (struct CadetPeerPath *path);
+GCPP_get_desirability (const struct CadetPeerPath *path);
 
 
 /**
@@ -108,11 +108,9 @@ GCPP_acquire (struct CadetPeerPath *path,
  * the path desirable).
  *
  * @param path the path that is being released
- * @param cp original final destination of @a path
  */
 void
-GCPP_release (struct CadetPeerPath *path,
-              struct CadetPeer *cp);
+GCPP_release (struct CadetPeerPath *path);
 
 
 /**
diff --git a/src/cadet/gnunet-service-cadet-new_peer.c 
b/src/cadet/gnunet-service-cadet-new_peer.c
index 43e375c75..0ef65b7b6 100644
--- a/src/cadet/gnunet-service-cadet-new_peer.c
+++ b/src/cadet/gnunet-service-cadet-new_peer.c
@@ -37,6 +37,7 @@
 #include "gnunet-service-cadet-new.h"
 #include "gnunet-service-cadet-new_dht.h"
 #include "gnunet-service-cadet-new_peer.h"
+#include "gnunet-service-cadet-new_paths.h"
 #include "gnunet-service-cadet-new_tunnels.h"
 
 /**
@@ -45,6 +46,12 @@
 #define IDLE_PEER_TIMEOUT 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 5)
 
 /**
+ * How long do we keep paths around if we no longer care about the peer?
+ */
+#define IDLE_PATH_TIMEOUT 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MINUTES, 2)
+
+
+/**
  * Struct containing all information regarding a given peer
  */
 struct CadetPeer
@@ -72,7 +79,8 @@ struct CadetPeer
   struct CadetPeerPathEntry **path_tails;
 
   /**
-   * MIN-heap of paths ending at this peer.  Ordered by desirability.
+   * MIN-heap of paths owned by this peer (they also end at this
+   * peer).  Ordered by desirability.
    */
   struct GNUNET_CONTAINER_Heap *path_heap;
 
@@ -186,8 +194,6 @@ destroy_peer (void *cls)
   }
   /* FIXME: clean up search_delayedXXX! */
 
-  GNUNET_CONTAINER_multihashmap_destroy (cp->connections);
-  GNUNET_free_non_null (cp->hello);
   if (NULL != cp->hello_offer)
   {
     GNUNET_TRANSPORT_offer_hello_cancel (cp->hello_offer);
@@ -198,6 +204,9 @@ destroy_peer (void *cls)
     GNUNET_ATS_connectivity_suggest_cancel (cp->connectivity_suggestion);
     cp->connectivity_suggestion = NULL;
   }
+  GNUNET_CONTAINER_multihashmap_destroy (cp->connections);
+  GNUNET_CONTAINER_heap_destroy (cp->path_heap);
+  GNUNET_free_non_null (cp->hello);
   GNUNET_free (cp);
 }
 
@@ -247,6 +256,34 @@ GCP_destroy_all_peers ()
  * @param cp peer to clean up
  */
 static void
+consider_peer_destroy (struct CadetPeer *cp);
+
+
+/**
+ * We really no longere care about a peer, stop hogging memory with paths to 
it.
+ * Afterwards, see if there is more to be cleaned up about this peer.
+ *
+ * @param cls a `struct CadetPeer`.
+ */
+static void
+drop_paths (void *cls)
+{
+  struct CadetPeer *cp = cls;
+  struct CadetPeerPath *path;
+
+  cp->destroy_task = NULL;
+  while (NULL != (path = GNUNET_CONTAINER_heap_remove_root (cp->path_heap)))
+    GCPP_release (path);
+  consider_peer_destroy (cp);
+}
+
+
+/**
+ * This peer may no longer be needed, consider cleaning it up.
+ *
+ * @param cp peer to clean up
+ */
+static void
 consider_peer_destroy (struct CadetPeer *cp)
 {
   struct GNUNET_TIME_Relative exp;
@@ -260,17 +297,24 @@ consider_peer_destroy (struct CadetPeer *cp)
     return; /* still relevant! */
   if (NULL != cp->core_mq)
     return; /* still relevant! */
-  if (0 != cp->path_dll_length)
-    return; /* still relevant! */
   if (0 != GNUNET_CONTAINER_multihashmap_size (cp->connections))
     return; /* still relevant! */
+  if (0 < GNUNET_CONTAINER_heap_get_size (cp->path_heap))
+  {
+    cp->destroy_task = GNUNET_SCHEDULER_add_delayed (IDLE_PATH_TIMEOUT,
+                                                     &drop_paths,
+                                                     cp);
+    return;
+  }
+  if (0 < cp->path_dll_length)
+    return; /* still relevant! */
   if (NULL != cp->hello)
   {
     /* relevant only until HELLO expires */
     exp = GNUNET_TIME_absolute_get_remaining (GNUNET_HELLO_get_last_expiration 
(cp->hello));
     cp->destroy_task = GNUNET_SCHEDULER_add_delayed (exp,
-                                                       &destroy_peer,
-                                                       cp);
+                                                     &destroy_peer,
+                                                     cp);
     return;
   }
   cp->destroy_task = GNUNET_SCHEDULER_add_delayed (IDLE_PEER_TIMEOUT,
@@ -337,7 +381,7 @@ GCP_path_entry_remove (struct CadetPeer *cp,
  */
 static void
 dht_result_cb (void *cls,
-               const struct CadetPeerPath *path)
+               struct CadetPeerPath *path)
 {
   struct CadetPeer *cp = cls;
   GNUNET_CONTAINER_HeapCostType desirability;
@@ -368,8 +412,7 @@ dht_result_cb (void *cls,
   {
     /* Now we have way too many, drop least desirable */
     root = GNUNET_CONTAINER_heap_remove_root (cp->path_heap);
-    GCPP_release (path,
-                  cp);
+    GCPP_release (path);
   }
 }
 
@@ -464,6 +507,7 @@ GCP_get (const struct GNUNET_PeerIdentity *peer_id,
   cp->pid = *peer_id;
   cp->connections = GNUNET_CONTAINER_multihashmap_create (32,
                                                           GNUNET_YES);
+  cp->path_heap = GNUNET_CONTAINER_heap_create 
(GNUNET_CONTAINER_HEAP_ORDER_MIN);
   cp->search_h = NULL; // FIXME: start search immediately!?
   cp->connectivity_suggestion = NULL; // FIXME: request with ATS!?
 

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

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