gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r11039 - gnunet/src/testing


From: gnunet
Subject: [GNUnet-SVN] r11039 - gnunet/src/testing
Date: Thu, 22 Apr 2010 16:56:18 +0200

Author: nevans
Date: 2010-04-22 16:56:18 +0200 (Thu, 22 Apr 2010)
New Revision: 11039

Modified:
   gnunet/src/testing/Makefile.am
   gnunet/src/testing/test_testing_connect.c
   gnunet/src/testing/test_testing_data_topology_clique.conf
   gnunet/src/testing/test_testing_topology.c
   gnunet/src/testing/testing.c
   gnunet/src/testing/testing_group.c
Log:
testing changes, which hopefully make testing code more robust, though problems 
are inevitable

Modified: gnunet/src/testing/Makefile.am
===================================================================
--- gnunet/src/testing/Makefile.am      2010-04-22 13:37:22 UTC (rev 11038)
+++ gnunet/src/testing/Makefile.am      2010-04-22 14:56:18 UTC (rev 11039)
@@ -25,7 +25,8 @@
  test_testing \
  test_testing_connect \
  test_testing_group \
- test_testing_topology_clique
+ test_testing_topology_clique 
+# test_testing_group_remote 
 # test_testing_topology_ring \
 # test_testing_topology_2d_torus \
 # test_testing_topology_small_world_ring \
@@ -38,6 +39,7 @@
  test_testing_connect \
  test_testing_group \
  test_testing_topology_clique 
+# test_testing_group_remote  
 # test_testing_topology_ring \
 # test_testing_topology_2d_torus \
 # test_testing_topology_small_world_ring \
@@ -70,6 +72,12 @@
  $(top_builddir)/src/testing/libgnunettesting.la \
  $(top_builddir)/src/util/libgnunetutil.la  
 
+#test_testing_group_remote_SOURCES = \
+# test_testing_group_remote.c
+#test_testing_group_remote_LDADD = \
+# $(top_builddir)/src/testing/libgnunettesting.la \
+# $(top_builddir)/src/util/libgnunetutil.la  
+
 #test_testing_topology_ring_SOURCES = \
 # test_testing_topology.c
 #test_testing_topology_ring_LDADD = \

Modified: gnunet/src/testing/test_testing_connect.c
===================================================================
--- gnunet/src/testing/test_testing_connect.c   2010-04-22 13:37:22 UTC (rev 
11038)
+++ gnunet/src/testing/test_testing_connect.c   2010-04-22 14:56:18 UTC (rev 
11039)
@@ -32,6 +32,7 @@
  */
 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60)
 
+#define CONNECT_ATTEMPTS 3
 
 static int ok;
 
@@ -97,7 +98,7 @@
               "Daemon `%s' started.\n", GNUNET_i2s (id));
 #endif
   GNUNET_TESTING_daemons_connect (d1, d2,
-                                  TIMEOUT, &my_connect_complete, NULL);
+                                  TIMEOUT, CONNECT_ATTEMPTS, 
&my_connect_complete, NULL);
 }
 
 

Modified: gnunet/src/testing/test_testing_data_topology_clique.conf
===================================================================
--- gnunet/src/testing/test_testing_data_topology_clique.conf   2010-04-22 
13:37:22 UTC (rev 11038)
+++ gnunet/src/testing/test_testing_data_topology_clique.conf   2010-04-22 
14:56:18 UTC (rev 11039)
@@ -9,6 +9,7 @@
 PORT = 2565
 PLUGINS = tcp
 #PREFIX = xterm -e xterm -T transport -e gdb --args
+#BINARY = 
/home/mrwiggles/documents/research/gnunet/gnunet-ng/src/transport/.libs/gnunet-service-transport
 #PREFIX = valgrind --tool=memcheck --log-file=logs%p
 #DEBUG = YES
 
@@ -22,10 +23,15 @@
 [transport-tcp]
 PORT = 2568
 
+[transport-udp]
+PORT = 2568
+
 [peerinfo]
 PORT = 2569
 #DEBUG = YES
 #PREFIX = xterm -e xterm -T peerinfo -e gdb --args
+#BINARY = 
/home/mrwiggles/documents/research/gnunet/gnunet-ng/src/peerinfo/.libs/gnunet-service-peerinfo
+#PREFIX = valgrind --tool=memcheck --log-file=peerinfo%p
 
 [core]
 PORT = 2570
@@ -34,7 +40,7 @@
 #DEBUG = YES
 
 [testing]
-NUM_PEERS = 4
+NUM_PEERS = 5
 WEAKRANDOM = YES
 TOPOLOGY = 0
 F2F = YES

Modified: gnunet/src/testing/test_testing_topology.c
===================================================================
--- gnunet/src/testing/test_testing_topology.c  2010-04-22 13:37:22 UTC (rev 
11038)
+++ gnunet/src/testing/test_testing_topology.c  2010-04-22 14:56:18 UTC (rev 
11039)
@@ -27,8 +27,11 @@
 
 #define VERBOSE GNUNET_NO
 
+/**
+ * How long until we fail the whole testcase?
+ */
+#define TEST_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 
600)
 
-#define TEST_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 
360)
 /**
  * How long until we give up on connecting the peers?
  */
@@ -36,12 +39,16 @@
 
 #define DEFAULT_NUM_PEERS 4;
 
+static float fail_percentage = 0.05;
+
 static int ok;
 
 static unsigned long long num_peers;
 
 static unsigned int total_connections;
 
+static unsigned int failed_connections;
+
 static unsigned int total_server_connections;
 
 static unsigned int total_messages_received;
@@ -177,11 +184,9 @@
 static void
 end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext * tc)
 {
-#if VERBOSE
   char *msg = cls;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+  GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
               "End badly was called (%s)... stopping daemons.\n", msg);
-#endif
   struct Connection *pos;
 
   pos = global_connections;
@@ -266,7 +271,7 @@
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "transmit ready for peer %s\ntransmit_ready's scheduled %d, 
transmit_ready's called %d\n", GNUNET_i2s(peer), transmit_ready_scheduled, 
transmit_ready_called);
 #endif
-  GNUNET_SCHEDULER_add_now(sched, &schedule_transmission, NULL);
+  GNUNET_SCHEDULER_add_delayed(sched, 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 50), 
&schedule_transmission, NULL);
   return sizeof (struct GNUNET_MessageHeader);
 }
 
@@ -299,9 +304,6 @@
           if (conn_pos->peer == pos->peer1)
             {
               pos->peer1handle = conn_pos->server;
-              GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                                "Peer matched conn_count %d\n",
-                                conn_count);
               break;
             }
           conn_count++;
@@ -328,11 +330,12 @@
       */
       pos = pos->next;
       count++;
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "Prepared %d messages\n",
-                  count);
+
     }
 
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Prepared %d messages\n",
+              count);
   global_pos = test_messages;
 
   GNUNET_SCHEDULER_add_now(sched, &schedule_transmission, NULL);
@@ -437,7 +440,8 @@
 #if VERBOSE
   else
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Failed to connect peer %s to peer 
%s with error %s\n",
+      failed_connections++;
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Failed to connect peer %s to peer 
%s with error :\n%s\n",
                first_daemon->shortname,
                second_daemon->shortname, emsg);
     }
@@ -455,12 +459,27 @@
       /* die_task = GNUNET_SCHEDULER_add_now (sched, &setup_handlers, NULL); */
       die_task = GNUNET_SCHEDULER_add_delayed (sched, 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 1), &setup_handlers, 
NULL);
     }
+  else if (total_connections + failed_connections == expected_connections)
+    {
+      if (failed_connections < (unsigned int)(fail_percentage * 
total_connections))
+        {
+          GNUNET_SCHEDULER_cancel (sched, die_task);
+          /* die_task = GNUNET_SCHEDULER_add_now (sched, &setup_handlers, 
NULL); */
+          die_task = GNUNET_SCHEDULER_add_delayed (sched, 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 1), &setup_handlers, 
NULL);
+        }
+      else
+        {
+          GNUNET_SCHEDULER_cancel (sched, die_task);
+          die_task = GNUNET_SCHEDULER_add_now (sched,
+                                               &end_badly, "from 
topology_callback (too many failed connections)");
+        }
+    }
   else
     {
 #if VERBOSE
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                  "Have %d total connections, Need %d\n",
-                  total_connections, expected_connections);
+                  "Have %d total connections, %d failed connections, Want %d 
(at least %d)\n",
+                  total_connections, failed_connections, expected_connections, 
expected_connections - (unsigned int)(fail_percentage * expected_connections));
 #endif
     }
 }

Modified: gnunet/src/testing/testing.c
===================================================================
--- gnunet/src/testing/testing.c        2010-04-22 13:37:22 UTC (rev 11038)
+++ gnunet/src/testing/testing.c        2010-04-22 14:56:18 UTC (rev 11039)
@@ -35,8 +35,9 @@
 #include "gnunet_constants.h"
 #include "gnunet_testing_lib.h"
 #include "gnunet_transport_service.h"
+#include "gnunet_hello_lib.h"
 
-#define DEBUG_TESTING GNUNET_YES
+#define DEBUG_TESTING GNUNET_NO
 
 /**
  * How long do we wait after starting gnunet-service-arm
@@ -50,8 +51,40 @@
  */
 #define MAX_EXEC_WAIT_RUNS 50
 
+static struct GNUNET_CORE_MessageHandler no_handlers[] = { {NULL, 0, 0} };
 
 /**
+ * Receive the HELLO from one peer, give it to the other
+ * and ask them to connect.
+ *
+ * @param cls "struct ConnectContext"
+ * @param message HELLO message of peer
+ */
+static void
+process_hello (void *cls, const struct GNUNET_MessageHeader *message)
+{
+  struct GNUNET_TESTING_Daemon *daemon = cls;
+  GNUNET_TRANSPORT_get_hello_cancel(daemon->th, &process_hello, daemon);
+#if DEBUG_TESTING
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Received `%s' from transport service of `%4s'\n",
+              "HELLO", GNUNET_i2s (&daemon->id));
+#endif
+
+  GNUNET_assert (message != NULL);
+  GNUNET_free_non_null(daemon->hello);
+  daemon->hello = GNUNET_malloc(ntohs(message->size));
+  memcpy(daemon->hello, message, ntohs(message->size));
+
+  if (daemon->th != NULL)
+    {
+      GNUNET_TRANSPORT_disconnect(daemon->th);
+      daemon->th = NULL;
+    }
+
+}
+
+/**
  * Function called after GNUNET_CORE_connect has succeeded
  * (or failed for good).  Note that the private key of the
  * peer is intentionally not exposed here; if you need it,
@@ -97,6 +130,25 @@
     GNUNET_TESTING_daemon_stop (d, d->dead_cb, d->dead_cb_cls);
   else if (NULL != cb)
     cb (d->cb_cls, my_identity, d->cfg, d, NULL);
+#if DEBUG_TESTING
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Successfully started peer `%4s'.\n", GNUNET_i2s (my_identity));
+#endif
+
+
+  d->th = GNUNET_TRANSPORT_connect (d->sched,
+                                    d->cfg, d, NULL, NULL, NULL);
+  if (d->th == NULL)
+    {
+      if (GNUNET_YES == d->dead)
+        GNUNET_TESTING_daemon_stop (d, d->dead_cb, d->dead_cb_cls);
+      else if (NULL != d->cb)
+        d->cb (d->cb_cls, &d->id, d->cfg, d,
+            _("Failed to connect to transport service!\n"));
+      return;
+    }
+
+  GNUNET_TRANSPORT_get_hello (d->th, &process_hello, d);
 }
 
 
@@ -109,7 +161,6 @@
 static void
 start_fsm (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  static struct GNUNET_CORE_MessageHandler no_handlers[] = { {NULL, 0, 0} };
   struct GNUNET_TESTING_Daemon *d = cls;
   GNUNET_TESTING_NotifyDaemonRunning cb;
   enum GNUNET_OS_ProcessStatusType type;
@@ -120,6 +171,7 @@
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Peer FSM is in phase %u.\n", d->phase);
 #endif
+
   d->task = GNUNET_SCHEDULER_NO_TASK;
   switch (d->phase)
     {
@@ -177,7 +229,7 @@
 #if DEBUG_TESTING
                                             "-L", "DEBUG",
 #endif
-                                            "-s", NULL);
+                                            "-s", "-q", NULL);
         }
       else
         {
@@ -190,7 +242,7 @@
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                       "Starting `%s', with command `%s %s %s %s %s %s %s 
%s'.\n",
                       "gnunet-arm", "ssh", dst, "gnunet-arm", "-c", d->cfgfile,
-                      "-L", "DEBUG", "-s");
+                      "-L", "DEBUG", "-s", "-q");
 #endif
           d->pid = GNUNET_OS_start_process (NULL, NULL, "ssh",
                                             "ssh",
@@ -199,7 +251,7 @@
 #if DEBUG_TESTING
                                             "-L", "DEBUG",
 #endif
-                                            "-c", d->cfgfile, "-s", NULL);
+                                            "-c", d->cfgfile, "-s", "-q", 
NULL);
           GNUNET_free (dst);
         }
       if (-1 == d->pid)
@@ -284,6 +336,12 @@
             {
               d->dead_cb (d->dead_cb_cls,
                           _("either `gnunet-arm' or `ssh' does not seem to 
terminate.\n"));
+              if (d->th != NULL)
+                {
+                  GNUNET_TRANSPORT_get_hello_cancel(d->th, &process_hello, d);
+                  GNUNET_TRANSPORT_disconnect(d->th);
+                  d->th = NULL;
+                }
               GNUNET_CONFIGURATION_destroy (d->cfg);
               GNUNET_free (d->cfgfile);
               GNUNET_free_non_null (d->hostname);
@@ -304,6 +362,12 @@
           if (NULL != d->dead_cb)
             d->dead_cb (d->dead_cb_cls,
                         _("shutdown (either `gnunet-arm' or `ssh') did not 
complete cleanly.\n"));
+          if (d->th != NULL)
+            {
+              GNUNET_TRANSPORT_get_hello_cancel(d->th, &process_hello, d);
+              GNUNET_TRANSPORT_disconnect(d->th);
+              d->th = NULL;
+            }
           GNUNET_CONFIGURATION_destroy (d->cfg);
           GNUNET_free (d->cfgfile);
           GNUNET_free_non_null (d->hostname);
@@ -315,6 +379,12 @@
 #if DEBUG_TESTING
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Peer shutdown complete.\n");
 #endif
+      if (d->th != NULL)
+        {
+          GNUNET_TRANSPORT_get_hello_cancel(d->th, &process_hello, d);
+          GNUNET_TRANSPORT_disconnect(d->th);
+          d->th = NULL;
+        }
       /* state clean up and notifications */
       GNUNET_CONFIGURATION_destroy (d->cfg);
       GNUNET_free (d->cfgfile);
@@ -544,7 +614,7 @@
 #if DEBUG_TESTING
                                               "-L", "DEBUG",
 #endif
-                                              "-c", d->cfgfile, "-e", "-d", 
NULL);
+                                              "-c", d->cfgfile, "-e", "-d", 
"-q", NULL);
       /* Use -e to end arm, and -d to remove temp files */
 
       GNUNET_free (arg);
@@ -560,9 +630,11 @@
 #if DEBUG_TESTING
                                             "-L", "DEBUG",
 #endif
-                                            "-c", d->cfgfile, "-e", "-d", 
NULL);
+                                            "-c", d->cfgfile, "-e", "-d", 
"-q", NULL);
   }
 
+  GNUNET_free_non_null(d->hello);
+
   d->wait_runs = 0;
   d->task
     = GNUNET_SCHEDULER_add_delayed (d->sched,
@@ -667,16 +739,6 @@
   struct GNUNET_TESTING_Daemon *d2;
 
   /**
-   * Handle to core of second daemon (to check connect)
-   */
-  struct GNUNET_CORE_Handle * d2core;
-
-  /**
-   * Transport handle to the first daemon.
-   */
-  struct GNUNET_TRANSPORT_Handle *d1th;
-
-  /**
    * Transport handle to the second daemon.
    */
   struct GNUNET_TRANSPORT_Handle *d2th;
@@ -692,18 +754,24 @@
   void *cb_cls;
 
   /**
-   * Transmit handle for our request for transmission
-   * (as given to d2 asking to talk to d1).
-   */
-  struct GNUNET_CORE_TransmitHandle *ntr;
-
-  /**
    * When should this operation be complete (or we must trigger
    * a timeout).
    */
   struct GNUNET_TIME_Absolute timeout;
 
   /**
+   * The relative timeout from whence this connect attempt was
+   * started.  Allows for reconnect attempts.
+   */
+  struct GNUNET_TIME_Relative relative_timeout;
+
+  /**
+   * Maximum number of connect attempts, will retry connection
+   * this number of times on failures.
+   */
+  unsigned int max_connect_attempts;
+
+  /**
    * Hello timeout task
    */
   GNUNET_SCHEDULER_TaskIdentifier hello_send_task;
@@ -719,44 +787,19 @@
    */
   struct GNUNET_TIME_Relative timeout_hello;
 
-  /**
-   * The current hello message we have (for d1)
-   */
-  struct GNUNET_MessageHeader *hello;
 
   /**
-   * Was the connection successful?
+   * Was the connection attempt successful?
    */
   int connected;
 };
 
 
-/**
- * Receive the HELLO from one peer, give it to the other
- * and ask them to connect.
- *
- * @param cls "struct ConnectContext"
- * @param message HELLO message of peer
- */
+/** Forward declaration **/
 static void
-process_hello (void *cls, const struct GNUNET_MessageHeader *message)
-{
-  struct ConnectContext *ctx = cls;
+reattempt_daemons_connect(void *cls, const struct GNUNET_SCHEDULER_TaskContext 
*tc);
 
-#if DEBUG_TESTING
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received `%s' from transport service of `%4s'\n",
-              "HELLO", GNUNET_i2s (&ctx->d1->id));
-#endif
 
-  GNUNET_assert (message != NULL);
-  GNUNET_free_non_null(ctx->hello);
-  ctx->hello = GNUNET_malloc(ntohs(message->size));
-  memcpy(ctx->hello, message, ntohs(message->size));
-
-}
-
-
 /**
  * Notify callback about success or failure of the attempt
  * to connect the two peers
@@ -769,34 +812,58 @@
                        const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct ConnectContext *ctx = cls;
+  struct GNUNET_TIME_Relative remaining;
 
-  GNUNET_TRANSPORT_get_hello_cancel (ctx->d1th, &process_hello, ctx);
-  GNUNET_SCHEDULER_cancel(ctx->d1->sched, ctx->hello_send_task);
+  if (ctx->hello_send_task != GNUNET_SCHEDULER_NO_TASK)
+    {
+      GNUNET_SCHEDULER_cancel(ctx->d1->sched, ctx->hello_send_task);
+      ctx->hello_send_task = GNUNET_SCHEDULER_NO_TASK;
+    }
 
-  if (ctx->cb != NULL)
+  if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
     {
-      if (ctx->connected == GNUNET_NO)
+      if (ctx->d2th != NULL)
+        GNUNET_TRANSPORT_disconnect (ctx->d2th);
+      ctx->d2th = NULL;
+      if (ctx->d1core != NULL)
+        GNUNET_CORE_disconnect (ctx->d1core);
+
+      ctx->d1core = NULL;
+      GNUNET_free (ctx);
+      return;
+    }
+
+  remaining = GNUNET_TIME_absolute_get_remaining(ctx->timeout);
+
+  if (ctx->connected == GNUNET_YES)
+    {
+      if (ctx->cb != NULL)
         {
           ctx->cb (ctx->cb_cls, &ctx->d1->id, &ctx->d2->id, ctx->d1->cfg,
-                  ctx->d2->cfg, ctx->d1, ctx->d2,
-                  _("Peers failed to connect"));
+                   ctx->d2->cfg, ctx->d1, ctx->d2, NULL);
         }
-      else
+      GNUNET_SCHEDULER_cancel(ctx->d1->sched, ctx->timeout_task);
+    }
+  else if (remaining.value > 0)
+    {
+      GNUNET_SCHEDULER_add_now(ctx->d1->sched, &reattempt_daemons_connect, 
ctx);
+      return;
+    }
+  else
+    {
+      if (ctx->cb != NULL)
         {
           ctx->cb (ctx->cb_cls, &ctx->d1->id, &ctx->d2->id, ctx->d1->cfg,
-                   ctx->d2->cfg, ctx->d1, ctx->d2, NULL);
-          GNUNET_SCHEDULER_cancel(ctx->d1->sched, ctx->timeout_task);
+                   ctx->d2->cfg, ctx->d1, ctx->d2,
+                   _("Peers failed to connect"));
         }
     }
 
-  ctx->ntr = NULL;
-  GNUNET_TRANSPORT_disconnect (ctx->d1th);
-  ctx->d1th = NULL;
+
   GNUNET_TRANSPORT_disconnect (ctx->d2th);
   ctx->d2th = NULL;
   GNUNET_CORE_disconnect (ctx->d1core);
   ctx->d1core = NULL;
-  GNUNET_free_non_null (ctx->hello);
   GNUNET_free (ctx);
 }
 
@@ -816,20 +883,8 @@
 {
   struct ConnectContext *ctx = cls;
 
-#if DEBUG_TESTING
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Core notified us about connection to a peer\n");
-#endif
   if (memcmp(&ctx->d2->id, peer, sizeof(struct GNUNET_PeerIdentity)) == 0)
     {
-#if DEBUG_TESTING
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Core notified us about connection to peer %s\n", 
GNUNET_i2s(peer));
-#endif
-      /*
-       * If we disconnect here, then the hello may never get sent (if it was 
delayed!)
-       * However I'm sure there was a reason it was here... so I'm just 
commenting.
-       */
       ctx->connected = GNUNET_YES;
       GNUNET_SCHEDULER_add_now (ctx->d1->sched,
                                 &notify_connect_result,
@@ -843,19 +898,21 @@
 {
   struct ConnectContext *ctx = cls;
 
-  if (ctx->hello != NULL)
+  if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
+    return;
+
+  if (ctx->d1->hello != NULL)
     {
-      GNUNET_TRANSPORT_offer_hello (ctx->d2th, ctx->hello);
+      GNUNET_TRANSPORT_offer_hello (ctx->d2th, 
GNUNET_HELLO_get_header(ctx->d1->hello));
       ctx->timeout_hello = GNUNET_TIME_relative_add(ctx->timeout_hello,
                                                    
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS,
-                                                                               
  200));
+                                                                               
  500));
     }
   ctx->hello_send_task = GNUNET_SCHEDULER_add_delayed(ctx->d1->sched,
                                                      ctx->timeout_hello,
                                                      &send_hello, ctx);
 }
 
-
 /**
  * Establish a connection between two GNUnet daemons.
  *
@@ -863,6 +920,8 @@
  * @param d2 handle for the second daemon
  * @param timeout how long is the connection attempt
  *        allowed to take?
+ * @param max_connect_attempts how many times should we try to reconnect
+ *        (within timeout)
  * @param cb function to call at the end
  * @param cb_cls closure for cb
  */
@@ -870,11 +929,11 @@
 GNUNET_TESTING_daemons_connect (struct GNUNET_TESTING_Daemon *d1,
                                 struct GNUNET_TESTING_Daemon *d2,
                                 struct GNUNET_TIME_Relative timeout,
+                                unsigned int max_connect_attempts,
                                 GNUNET_TESTING_NotifyConnection cb,
                                 void *cb_cls)
 {
   struct ConnectContext *ctx;
-  static struct GNUNET_CORE_MessageHandler no_handlers[] = { {NULL, 0, 0} };
 
   if ((d1->server == NULL) || (d2->server == NULL))
     {
@@ -887,16 +946,16 @@
   ctx->d1 = d1;
   ctx->d2 = d2;
   ctx->timeout = GNUNET_TIME_relative_to_absolute (timeout);
+  ctx->timeout_hello = 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 500);
+  ctx->relative_timeout = timeout;
   ctx->cb = cb;
   ctx->cb_cls = cb_cls;
-  ctx->timeout_hello = 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 400);
+  ctx->max_connect_attempts = max_connect_attempts;
   ctx->connected = GNUNET_NO;
 #if DEBUG_TESTING
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Asked to connect peer %s to peer %s\n",
               d1->shortname, d2->shortname);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Connecting to transport service of peer %s\n", d1->shortname);
 #endif
 
   ctx->d1core = GNUNET_CORE_connect (d1->sched,
@@ -916,17 +975,7 @@
       return;
     }
 
-  ctx->d1th = GNUNET_TRANSPORT_connect (d1->sched,
-                                        d1->cfg, d1, NULL, NULL, NULL);
-  if (ctx->d1th == NULL)
-    {
-      GNUNET_free (ctx);
-      if (NULL != cb)
-        cb (cb_cls, &d1->id, &d2->id, d1->cfg, d2->cfg, d1, d2,
-            _("Failed to connect to transport service!\n"));
-      return;
-    }
-#if DEBUG_TESTING
+#if DEBUG_TESTING > 2
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Asked to connect peer %s to peer %s\n",
               d1->shortname, d2->shortname);
@@ -939,7 +988,6 @@
                                         d2->cfg, d2, NULL, NULL, NULL);
   if (ctx->d2th == NULL)
     {
-      GNUNET_TRANSPORT_disconnect (ctx->d1th);
       GNUNET_free (ctx);
       if (NULL != cb)
         cb (cb_cls, &d1->id, &d2->id, d1->cfg, d2->cfg, d1, d2,
@@ -947,19 +995,72 @@
       return;
     }
 
+  ctx->timeout_task = GNUNET_SCHEDULER_add_delayed (d1->sched,
+                                                    
GNUNET_TIME_relative_divide(ctx->relative_timeout, max_connect_attempts), /* 
Allow up to 8 reconnect attempts */
+                                                    &notify_connect_result, 
ctx);
+
+  ctx->hello_send_task = GNUNET_SCHEDULER_add_now(ctx->d1->sched, &send_hello, 
ctx);
+}
+
+static void
+reattempt_daemons_connect (void *cls, const struct 
GNUNET_SCHEDULER_TaskContext *tc)
+{
+
+  struct ConnectContext *ctx = cls;
+  if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
+    {
+      return;
+    }
 #if DEBUG_TESTING
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Asking for HELLO from peer %s\n", GNUNET_i2s (&d1->id));
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "re-attempting connect of peer %s to 
peer %s\n",
+              ctx->d1->shortname, ctx->d2->shortname);
 #endif
 
-  ctx->timeout_task = GNUNET_SCHEDULER_add_delayed (d1->sched,
-                                                    timeout,
+  if (ctx->d1core != NULL)
+    {
+      GNUNET_CORE_disconnect(ctx->d1core);
+      ctx->d1core = NULL;
+    }
+
+  if (ctx->d2th != NULL)
+    {
+      GNUNET_TRANSPORT_disconnect(ctx->d2th);
+      ctx->d2th = NULL;
+    }
+
+  ctx->d1core = GNUNET_CORE_connect (ctx->d1->sched,
+                                     ctx->d1->cfg,
+                                     
GNUNET_TIME_absolute_get_remaining(ctx->timeout),
+                                     ctx,
+                                     NULL,
+                                     &connect_notify, NULL,
+                                     NULL, GNUNET_NO,
+                                     NULL, GNUNET_NO, no_handlers);
+  if (ctx->d1core == NULL)
+    {
+      if (NULL != ctx->cb)
+        ctx->cb (ctx->cb_cls, &ctx->d1->id, &ctx->d2->id, ctx->d1->cfg, 
ctx->d2->cfg, ctx->d1, ctx->d2,
+                 _("Failed to connect to core service of first peer!\n"));
+      GNUNET_free (ctx);
+      return;
+    }
+
+  ctx->d2th = GNUNET_TRANSPORT_connect (ctx->d2->sched,
+                                        ctx->d2->cfg, ctx->d2, NULL, NULL, 
NULL);
+  if (ctx->d2th == NULL)
+    {
+      GNUNET_free (ctx);
+      if (NULL != ctx->cb)
+        ctx->cb (ctx->cb_cls, &ctx->d1->id, &ctx->d2->id, ctx->d1->cfg, 
ctx->d2->cfg, ctx->d1, ctx->d2,
+            _("Failed to connect to transport service!\n"));
+      return;
+    }
+
+  ctx->timeout_task = GNUNET_SCHEDULER_add_delayed (ctx->d1->sched,
+                                                    
GNUNET_TIME_relative_divide(ctx->relative_timeout, ctx->max_connect_attempts),
                                                     &notify_connect_result, 
ctx);
 
-  GNUNET_TRANSPORT_get_hello (ctx->d1th, &process_hello, ctx);
-  ctx->hello_send_task = GNUNET_SCHEDULER_add_delayed(ctx->d1->sched, 
ctx->timeout_hello,
-                                                     &send_hello, ctx);
+  ctx->hello_send_task = GNUNET_SCHEDULER_add_now(ctx->d1->sched, &send_hello, 
ctx);
 }
 
-
 /* end of testing.c */

Modified: gnunet/src/testing/testing_group.c
===================================================================
--- gnunet/src/testing/testing_group.c  2010-04-22 13:37:22 UTC (rev 11038)
+++ gnunet/src/testing/testing_group.c  2010-04-22 14:56:18 UTC (rev 11039)
@@ -27,7 +27,7 @@
 #include "gnunet_arm_service.h"
 #include "gnunet_testing_lib.h"
 
-#define VERBOSE_TESTING GNUNET_YES
+#define VERBOSE_TESTING GNUNET_NO
 
 /**
  * Lowest port used for GNUnet testing.  Should be high enough to not
@@ -46,8 +46,10 @@
 
 #define MAX_OUTSTANDING_CONNECTIONS 50
 
-#define CONNECT_TIMEOUT GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 180)
+#define CONNECT_TIMEOUT GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 160)
 
+#define CONNECT_ATTEMPTS 8
+
 struct PeerConnection
 {
   /*
@@ -607,7 +609,7 @@
         connect_attempts += add_connections (pg, i, nodeToConnect);
     }
   natLog = log (pg->total);
-#if VERBOSE_TESTING
+#if VERBOSE_TESTING > 2
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               _("natural log of %d is %d, will run %d iterations\n"),
              pg->total, natLog, (int) (natLog * percentage));
@@ -644,7 +646,7 @@
         }
     }
   connect_attempts += smallWorldConnections;
-#if VERBOSE_TESTING
+#if VERBOSE_TESTING > 2
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                       _("Total connections added for small world: %d!\n"),
                       smallWorldConnections);
@@ -983,9 +985,12 @@
 {
   struct ConnectContext *connect_context = cls;
 
+  if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
+    return;
+
   if (outstanding_connects > MAX_OUTSTANDING_CONNECTIONS)
     {
-#if VERBOSE_TESTING
+#if VERBOSE_TESTING > 2
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                       _("Delaying connect, we have too many outstanding 
connections!\n"));
 #endif
@@ -993,7 +998,7 @@
     }
   else
     {
-#if VERBOSE_TESTING
+#if VERBOSE_TESTING > 2
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                       _("Creating connection, outstanding_connections is 
%d\n"), outstanding_connects);
 #endif
@@ -1001,6 +1006,7 @@
       GNUNET_TESTING_daemons_connect (connect_context->first,
                                       connect_context->second,
                                       CONNECT_TIMEOUT,
+                                      CONNECT_ATTEMPTS,
                                       &internal_connect_notify,
                                       connect_context->pg);
       GNUNET_free(connect_context);
@@ -1029,23 +1035,8 @@
           connect_context->pg = pg;
           connect_context->first = pg->peers[pg_iter].daemon;
           connect_context->second = connection_iter->daemon;
-
           GNUNET_SCHEDULER_add_now(pg->sched, &schedule_connect, 
connect_context);
-          /*GNUNET_TESTING_daemons_connect (pg->peers[pg_iter].daemon,
-                                          connection_iter->daemon,
-                                          CONNECT_TIMEOUT,
-                                          pg->notify_connection,
-                                          pg->notify_connection_cls);*/
           connection_iter = connection_iter->next;
-
-          /*if (outstanding_connects > MAX_OUTSTANDING_CONNECTS)
-            {
-#if VERBOSE_TESTING
-              GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                          _("Sleeping to give peers a chance to connect!\n"));
-#endif
-              sleep(2);
-            } */
         }
     }
 }





reply via email to

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