gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [gnunet] 03/03: initialize new path fully before trying to


From: gnunet
Subject: [GNUnet-SVN] [gnunet] 03/03: initialize new path fully before trying to attach it
Date: Sun, 22 Jan 2017 17:28:51 +0100

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

grothoff pushed a commit to branch master
in repository gnunet.

commit 984f1197d28560346e5cf4951ac9d6bbef08053e
Author: Christian Grothoff <address@hidden>
AuthorDate: Sun Jan 22 17:28:45 2017 +0100

    initialize new path fully before trying to attach it
---
 src/cadet/gnunet-service-cadet-new_paths.c | 90 ++++++++++++++++++++----------
 1 file changed, 59 insertions(+), 31 deletions(-)

diff --git a/src/cadet/gnunet-service-cadet-new_paths.c 
b/src/cadet/gnunet-service-cadet-new_paths.c
index 39658d4e8..c9fdbcb3a 100644
--- a/src/cadet/gnunet-service-cadet-new_paths.c
+++ b/src/cadet/gnunet-service-cadet-new_paths.c
@@ -25,7 +25,6 @@
  *
  * TODO:
  * - path desirability score calculations are not done
- *   (and will be tricky to have during path changes)
  */
 #include "platform.h"
 #include "gnunet-service-cadet-new_connection.h"
@@ -359,11 +358,30 @@ extend_path (struct CadetPeerPath *path,
   struct GNUNET_CONTAINER_HeapNode *hn;
   int i;
 
+  /* Expand path */
+  GNUNET_array_grow (path->entries,
+                     path->entries_length,
+                     old_len + num_peers);
+  for (i=num_peers-1;i >= 0;i--)
+  {
+    struct CadetPeerPathEntry *entry = GNUNET_new (struct CadetPeerPathEntry);
+
+    path->entries[old_len + i] = entry;
+    entry->peer = peers[i];
+    entry->path = path;
+    GCP_path_entry_add (entry->peer,
+                        entry,
+                        old_len + i);
+  }
+
   /* If we extend an existing path, detach it from the
      old owner and re-attach to the new one */
   hn = NULL;
   for (i=num_peers-1;i>=0;i--)
   {
+    struct CadetPeerPathEntry *entry = path->entries[old_len + i];
+
+    path->entries_length = old_len + i + 1;
     /* FIXME: note that path->desirability is used, but not yet updated here! 
*/
     hn = GCP_attach_path (peers[i],
                           path,
@@ -371,27 +389,25 @@ extend_path (struct CadetPeerPath *path,
                           GNUNET_YES);
     if (NULL != hn)
       break;
+    GCP_path_entry_remove (entry->peer,
+                           entry,
+                           old_len + i);
+    GNUNET_free (entry);
+    path->entries[old_len + i] = NULL;
   }
   if (NULL == hn)
-    return; /* none of the peers is interested in this path */
+  {
+    /* none of the peers is interested in this path;
+       shrink path back */
+    GNUNET_array_grow (path->entries,
+                       path->entries_length,
+                       old_len);
+    return;
+  }
   GCP_detach_path (path->entries[old_len-1]->peer,
                    path,
                    path->hn);
   path->hn = hn;
-  GNUNET_array_grow (path->entries,
-                     path->entries_length,
-                     old_len + i);
-  for (;i >= 0;i--)
-  {
-    struct CadetPeerPathEntry *entry = GNUNET_new (struct CadetPeerPathEntry);
-
-    path->entries[old_len + i] = entry;
-    entry->peer = peers[i];
-    entry->path = path;
-    GCP_path_entry_add (entry->peer,
-                        entry,
-                        old_len + i);
-  }
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Extended path %s\n",
        GCPP_2s (path));
@@ -471,11 +487,27 @@ GCPP_try_path_from_dht (const struct GNUNET_PeerIdentity 
*get_path,
 
   /* No match at all, create completely new 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 (i=path->entries_length-1;i>=0;i--)
+  {
+    struct CadetPeerPathEntry *entry = GNUNET_new (struct CadetPeerPathEntry);
+
+    path->entries[i] = entry;
+    entry->peer = cpath[i];
+    entry->path = path;
+    GCP_path_entry_add (entry->peer,
+                        entry,
+                        i);
+  }
 
-  /* First, try to attach it */
+  /* Finally, try to attach it */
   hn = NULL;
   for (i=get_path_length + put_path_length-1;i>=0;i--)
   {
+    struct CadetPeerPathEntry *entry = path->entries[i];
+
     path->entries_length = i + 1;
     /* FIXME: note that path->desirability is used, but not yet initialized 
here! */
     hn = GCP_attach_path (cpath[i],
@@ -484,30 +516,26 @@ GCPP_try_path_from_dht (const struct GNUNET_PeerIdentity 
*get_path,
                           GNUNET_NO);
     if (NULL != hn)
       break;
+    GCP_path_entry_remove (entry->peer,
+                           entry,
+                           i);
+    GNUNET_free (entry);
+    path->entries[i] = NULL;
   }
   if (NULL == hn)
   {
     /* None of the peers on the path care about it. */
     LOG (GNUNET_ERROR_TYPE_DEBUG,
          "Path discovered from DHT is not interesting to us\n");
+    GNUNET_free (path->entries);
     GNUNET_free (path);
     return;
   }
   path->hn = hn;
-  path->entries_length = i + 1;
-  path->entries = GNUNET_new_array (path->entries_length,
-                                    struct CadetPeerPathEntry *);
-  for (;i>=0;i--)
-  {
-    struct CadetPeerPathEntry *entry = GNUNET_new (struct CadetPeerPathEntry);
-
-    path->entries[i] = entry;
-    entry->peer = cpath[i];
-    entry->path = path;
-    GCP_path_entry_add (entry->peer,
-                        entry,
-                        i);
-  }
+  /* Shrink path to actual useful length */
+  GNUNET_array_grow (path->entries,
+                     path->entries_length,
+                     i);
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Created new path %s based on information from DHT\n",
        GCPP_2s (path));

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



reply via email to

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