gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r26019 - in gnunet/src: gns include regex testbed


From: gnunet
Subject: [GNUnet-SVN] r26019 - in gnunet/src: gns include regex testbed
Date: Tue, 5 Feb 2013 15:24:51 +0100

Author: harsha
Date: 2013-02-05 15:24:51 +0100 (Tue, 05 Feb 2013)
New Revision: 26019

Modified:
   gnunet/src/gns/test_gns_dht_three_peers.c
   gnunet/src/include/gnunet_testbed_service.h
   gnunet/src/regex/gnunet-regex-profiler.c
   gnunet/src/testbed/test_testbed_api_topology.c
   gnunet/src/testbed/test_testbed_api_topology_clique.c
   gnunet/src/testbed/testbed_api_testbed.c
   gnunet/src/testbed/testbed_api_topology.c
Log:
add completion callback for overlay topology configure functions

Modified: gnunet/src/gns/test_gns_dht_three_peers.c
===================================================================
--- gnunet/src/gns/test_gns_dht_three_peers.c   2013-02-05 14:22:08 UTC (rev 
26018)
+++ gnunet/src/gns/test_gns_dht_three_peers.c   2013-02-05 14:24:51 UTC (rev 
26019)
@@ -296,8 +296,9 @@
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "All peers started\n");
 
       topology_op = 
-          GNUNET_TESTBED_overlay_configure_topology  (NULL, 3, cpeers,
+          GNUNET_TESTBED_overlay_configure_topology  (NULL, 3, cpeers, NULL,
                                                       NULL,
+                                                      NULL,
                                                       
GNUNET_TESTBED_TOPOLOGY_RING,
                                                       
GNUNET_TESTBED_TOPOLOGY_OPTION_END);
   }

Modified: gnunet/src/include/gnunet_testbed_service.h
===================================================================
--- gnunet/src/include/gnunet_testbed_service.h 2013-02-05 14:22:08 UTC (rev 
26018)
+++ gnunet/src/include/gnunet_testbed_service.h 2013-02-05 14:24:51 UTC (rev 
26019)
@@ -1025,10 +1025,13 @@
      GNUNET_TESTBED_TOPOLOGY_OPTION_END */
 
   /**
-   * Disable automatic retrying for failed overlay connections. The default is
-   * to always retry failed overlay connections. This parameter takes no 
options.
+   * How many times should the failed overlay connect operations be retried
+   * before giving up.  The default if this option is not specified is to retry
+   * 3 times.  This option takes and unsigned integer as a parameter.  Use this
+   * option with parameter 0 to disable retrying of failed overlay connect
+   * operations.
    */
-  GNUNET_TESTBED_TOPOLOGY_DISABLE_AUTO_RETRY
+  GNUNET_TESTBED_TOPOLOGY_RETRY_CNT
 };
 
 
@@ -1093,15 +1096,33 @@
 
 
 /**
+ * Callbacks of this type are called when topology configuration is completed
+ *
+ * @param cls the operation closure given to
+ *          GNUNET_TESTBED_overlay_configure_topology_va() and
+ *          GNUNET_TESTBED_overlay_configure() calls
+ * @param nsuccess the number of successful overlay connects
+ * @param nfailures the number of overlay connects which failed
+ */
+typedef void (*GNUNET_TESTBED_TopologyCompletionCallback) (void *cls, 
+                                                          unsigned int 
nsuccess,
+                                                          unsigned int 
nfailures);
+
+
+/**
  * All peers must have been started before calling this function.
  * This function then connects the given peers in the P2P overlay
  * using the given topology.
  *
- * @param op_cls closure argument to give with the operation event
+ * @param op_cls closure argument to give with the peer connect operation 
events
+ *          generated through this function
  * @param num_peers number of peers in 'peers'
  * @param peers array of 'num_peers' with the peers to configure
  * @param max_connections the maximums number of overlay connections that will
  *          be made to achieve the given topology
+ * @param comp_cb the completion callback to call when the topology generation
+ *          is completed
+ * @param comp_cb_cls closure for the above completion callback
  * @param topo desired underlay topology to use
  * @param va topology-specific options
  * @return handle to the operation, NULL if connecting these
@@ -1113,6 +1134,9 @@
                                               unsigned int num_peers,
                                               struct GNUNET_TESTBED_Peer 
**peers,
                                               unsigned int *max_connections,
+                                              
GNUNET_TESTBED_TopologyCompletionCallback
+                                              comp_cb,
+                                              void *comp_cb_cls,
                                               enum 
GNUNET_TESTBED_TopologyOption topo,
                                               va_list va);
 
@@ -1122,11 +1146,15 @@
  * This function then connects the given peers in the P2P overlay
  * using the given topology.
  *
- * @param op_cls closure argument to give with the operation event
+ * @param op_cls closure argument to give with the peer connect operation 
events
+ *          generated through this function
  * @param num_peers number of peers in 'peers'
  * @param peers array of 'num_peers' with the peers to configure
  * @param max_connections the maximums number of overlay connections that will
  *          be made to achieve the given topology
+ * @param comp_cb the completion callback to call when the topology generation
+ *          is completed
+ * @param comp_cb_cls closure for the above completion callback
  * @param topo desired underlay topology to use
  * @param ... topology-specific options
  * @return handle to the operation, NULL if connecting these
@@ -1138,6 +1166,9 @@
                                            unsigned int num_peers,
                                            struct GNUNET_TESTBED_Peer **peers,
                                            unsigned int *max_connections,
+                                           
GNUNET_TESTBED_TopologyCompletionCallback
+                                           comp_cb,
+                                           void *comp_cb_cls,
                                            enum GNUNET_TESTBED_TopologyOption 
topo,
                                            ...);
 

Modified: gnunet/src/regex/gnunet-regex-profiler.c
===================================================================
--- gnunet/src/regex/gnunet-regex-profiler.c    2013-02-05 14:22:08 UTC (rev 
26018)
+++ gnunet/src/regex/gnunet-regex-profiler.c    2013-02-05 14:24:51 UTC (rev 
26019)
@@ -1107,9 +1107,12 @@
   topology_op =
     GNUNET_TESTBED_overlay_configure_topology (NULL, num_peers, peer_handles,
                                                NULL,
+                                               NULL,
+                                               NULL,
                                                
GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI,
                                                num_links,
-                                               
GNUNET_TESTBED_TOPOLOGY_DISABLE_AUTO_RETRY,
+                                               
GNUNET_TESTBED_TOPOLOGY_RETRY_CNT,
+                                               (unsigned int) 0,
                                                
GNUNET_TESTBED_TOPOLOGY_OPTION_END);
   if (NULL == topology_op)
   {

Modified: gnunet/src/testbed/test_testbed_api_topology.c
===================================================================
--- gnunet/src/testbed/test_testbed_api_topology.c      2013-02-05 14:22:08 UTC 
(rev 26018)
+++ gnunet/src/testbed/test_testbed_api_topology.c      2013-02-05 14:24:51 UTC 
(rev 26019)
@@ -135,6 +135,8 @@
   peers = peers_;
   overlay_connects = 0;
   op = GNUNET_TESTBED_overlay_configure_topology (NULL, NUM_PEERS, peers, NULL,
+                                                  NULL,
+                                                  NULL,
                                                   
GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI,
                                                   NUM_PEERS,
                                                   
GNUNET_TESTBED_TOPOLOGY_OPTION_END);

Modified: gnunet/src/testbed/test_testbed_api_topology_clique.c
===================================================================
--- gnunet/src/testbed/test_testbed_api_topology_clique.c       2013-02-05 
14:22:08 UTC (rev 26018)
+++ gnunet/src/testbed/test_testbed_api_topology_clique.c       2013-02-05 
14:24:51 UTC (rev 26019)
@@ -130,6 +130,8 @@
   peers = peers_;
   overlay_connects = 0;
   op = GNUNET_TESTBED_overlay_configure_topology (NULL, NUM_PEERS, peers, NULL,
+                                                  NULL,
+                                                  NULL,
                                                   
GNUNET_TESTBED_TOPOLOGY_CLIQUE,
                                                   /* 
GNUNET_TESTBED_TOPOLOGY_ERDOS_RENYI, */
                                                   /* NUM_PEERS, */

Modified: gnunet/src/testbed/testbed_api_testbed.c
===================================================================
--- gnunet/src/testbed/testbed_api_testbed.c    2013-02-05 14:22:08 UTC (rev 
26018)
+++ gnunet/src/testbed/testbed_api_testbed.c    2013-02-05 14:24:51 UTC (rev 
26019)
@@ -735,6 +735,8 @@
       rc->topology_operation =
           GNUNET_TESTBED_overlay_configure_topology (NULL, rc->num_peers,
                                                      rc->peers, &rc->num_oc,
+                                                     NULL,
+                                                     NULL,
                                                      rc->topology,
                                                      rc->random_links,
                                                      
GNUNET_TESTBED_TOPOLOGY_OPTION_END);
@@ -745,6 +747,8 @@
       rc->topology_operation =
           GNUNET_TESTBED_overlay_configure_topology (NULL, rc->num_peers,
                                                      rc->peers, &rc->num_oc,
+                                                     NULL,
+                                                     NULL,
                                                      rc->topology,
                                                      rc->topo_file,
                                                      
GNUNET_TESTBED_TOPOLOGY_OPTION_END);
@@ -753,6 +757,8 @@
       rc->topology_operation =
           GNUNET_TESTBED_overlay_configure_topology (NULL, rc->num_peers,
                                                      rc->peers, &rc->num_oc,
+                                                     NULL,
+                                                     NULL,
                                                      rc->topology,
                                                      
GNUNET_TESTBED_TOPOLOGY_OPTION_END);
     if (NULL == rc->topology_operation)

Modified: gnunet/src/testbed/testbed_api_topology.c
===================================================================
--- gnunet/src/testbed/testbed_api_topology.c   2013-02-05 14:22:08 UTC (rev 
26018)
+++ gnunet/src/testbed/testbed_api_topology.c   2013-02-05 14:24:51 UTC (rev 
26019)
@@ -38,6 +38,12 @@
 
 
 /**
+ * Default number of retires
+ */
+#define DEFAULT_RETRY_CNT 3
+
+
+/**
  * Context information for topology operations
  */
 struct TopologyContext;
@@ -72,6 +78,25 @@
 };
 
 
+struct RetryListEntry
+{
+  /**
+   * the next pointer for the DLL
+   */
+  struct RetryListEntry *next;
+
+  /**
+   * the prev pointer for the DLL
+   */
+  struct RetryListEntry *prev;
+  
+  /**
+   * The link to be retired
+   */
+  struct OverlayLink *link;
+};
+
+
 /**
  * Context information for topology operations
  */
@@ -93,6 +118,26 @@
   void *op_cls;
 
   /**
+   * topology generation completion callback
+   */
+  GNUNET_TESTBED_TopologyCompletionCallback comp_cb;
+
+  /**
+   * The closure for the above callback
+   */
+  void *comp_cb_cls;
+
+  /**
+   * DLL head for retry list
+   */
+  struct RetryListEntry *rl_head;
+
+  /**
+   * DLL tail for retry list
+   */
+  struct RetryListEntry *rl_tail;
+  
+  /**
    * The number of peers
    */
   unsigned int num_peers;
@@ -103,10 +148,29 @@
   unsigned int link_array_size;
 
   /**
-   * should the automatic retry be disabled
+   * How many retries to do before we give up
    */
-  int disable_retry;
+  unsigned int retry_cnt;
 
+  /**
+   * Number of links to try
+   */
+  unsigned int nlinks;
+
+  /**
+   * How many links have been completed
+   */
+  unsigned int ncompleted;
+
+  /**
+   * Total successfully established overlay connections
+   */
+  unsigned int nsuccess;
+
+  /**
+   * Total failed overlay connections
+   */
+  unsigned int nfailures;
 };
 
 
@@ -198,21 +262,51 @@
 {
   struct OverlayLink *link = cls;
   struct TopologyContext *tc;
+  struct RetryListEntry *retry_entry;
 
   GNUNET_assert (op == link->op);
   GNUNET_TESTBED_operation_done (op);
   link->op = NULL;
   tc = link->tc;
-  if ((NULL != emsg) && (GNUNET_NO == tc->disable_retry))
+  if (NULL != emsg)
   {
-    LOG (GNUNET_ERROR_TYPE_WARNING,
-         "Error while establishing a link: %s -- Retrying\n", emsg);
-    link->op =
-        GNUNET_TESTBED_overlay_connect (tc->op_cls, &overlay_link_completed,
-                                        link, tc->peers[link->A],
-                                        tc->peers[link->B]);
+    tc->nfailures++;
+    if (0 != tc->retry_cnt)
+    {
+      LOG (GNUNET_ERROR_TYPE_WARNING,
+           "Error while establishing a link: %s -- Retrying\n", emsg);
+      retry_entry = GNUNET_malloc (sizeof (struct RetryListEntry));
+      retry_entry->link = link;
+      GNUNET_CONTAINER_DLL_insert_tail (tc->rl_head, tc->rl_tail, retry_entry);
+    }
+  }
+  else
+    tc->nsuccess++;
+  tc->ncompleted++;
+  if (tc->ncompleted < tc->nlinks)
     return;
+  if ((0 != tc->retry_cnt) && (NULL != tc->rl_head))
+  {
+    tc->retry_cnt--;
+    tc->ncompleted = 0;
+    tc->nlinks = 0;
+    while (NULL != (retry_entry = tc->rl_head))
+    {
+      link = retry_entry->link;      
+      link->op =
+          GNUNET_TESTBED_overlay_connect (tc->op_cls, &overlay_link_completed,
+                                          link, tc->peers[link->A],
+                                          tc->peers[link->B]);
+      tc->nlinks++;
+      GNUNET_CONTAINER_DLL_remove (tc->rl_head, tc->rl_tail, retry_entry);
+      GNUNET_free (retry_entry);
+    }
+    return;
   }
+  if (NULL != tc->comp_cb)
+  {
+    tc->comp_cb (tc->comp_cb_cls, tc->nsuccess, tc->nfailures);
+  }
 }
 
 
@@ -228,6 +322,7 @@
   struct TopologyContext *tc = cls;
   unsigned int p;
 
+  tc->nlinks = tc->link_array_size;
   for (p = 0; p < tc->link_array_size; p++)
   {
     tc->link_array[p].op =
@@ -248,8 +343,14 @@
 oprelease_overlay_configure_topology (void *cls)
 {
   struct TopologyContext *tc = cls;
+  struct RetryListEntry *retry_entry;
   unsigned int p;
 
+  while (NULL != (retry_entry = tc->rl_head))
+  {
+    GNUNET_CONTAINER_DLL_remove (tc->rl_head, tc->rl_tail, retry_entry);
+    GNUNET_free (retry_entry);
+  }
   if (NULL != tc->link_array)
   {
     for (p = 0; p < tc->link_array_size; p++)
@@ -741,11 +842,15 @@
  * This function then connects the given peers in the P2P overlay
  * using the given topology.
  *
- * @param op_cls closure argument to give with the operation event
+ * @param op_cls closure argument to give with the peer connect operation 
events
+ *          generated through this function
  * @param num_peers number of peers in 'peers'
  * @param peers array of 'num_peers' with the peers to configure
  * @param max_connections the maximums number of overlay connections that will
  *          be made to achieve the given topology
+ * @param comp_cb the completion callback to call when the topology generation
+ *          is completed
+ * @param comp_cb_cls closure for the above completion callback
  * @param topo desired underlay topology to use
  * @param va topology-specific options
  * @return handle to the operation, NULL if connecting these
@@ -755,11 +860,13 @@
 struct GNUNET_TESTBED_Operation *
 GNUNET_TESTBED_overlay_configure_topology_va (void *op_cls,
                                               unsigned int num_peers,
-                                              struct GNUNET_TESTBED_Peer
-                                              **peers,
+                                              struct GNUNET_TESTBED_Peer 
**peers,
                                               unsigned int *max_connections,
-                                              enum 
GNUNET_TESTBED_TopologyOption
-                                              topo, va_list va)
+                                              
GNUNET_TESTBED_TopologyCompletionCallback
+                                              comp_cb,
+                                              void *comp_cb_cls,
+                                              enum 
GNUNET_TESTBED_TopologyOption topo,
+                                              va_list va)
 {
   struct TopologyContext *tc;
   struct GNUNET_TESTBED_Operation *op;
@@ -774,6 +881,7 @@
   tc->peers = peers;
   tc->num_peers = num_peers;
   tc->op_cls = op_cls;
+  tc->retry_cnt = DEFAULT_RETRY_CNT;
   switch (topo)
   {
   case GNUNET_TESTBED_TOPOLOGY_LINE:
@@ -847,8 +955,8 @@
 
     switch (secondary_option)
     {
-    case GNUNET_TESTBED_TOPOLOGY_DISABLE_AUTO_RETRY:
-      tc->disable_retry = GNUNET_YES;
+    case GNUNET_TESTBED_TOPOLOGY_RETRY_CNT:
+      tc->retry_cnt =  va_arg (va, unsigned int);
       break;
     case GNUNET_TESTBED_TOPOLOGY_OPTION_END:
       break;
@@ -880,11 +988,15 @@
  * This function then connects the given peers in the P2P overlay
  * using the given topology.
  *
- * @param op_cls closure argument to give with the operation event
+ * @param op_cls closure argument to give with the peer connect operation 
events
+ *          generated through this function
  * @param num_peers number of peers in 'peers'
  * @param peers array of 'num_peers' with the peers to configure
  * @param max_connections the maximums number of overlay connections that will
  *          be made to achieve the given topology
+ * @param comp_cb the completion callback to call when the topology generation
+ *          is completed
+ * @param comp_cb_cls closure for the above completion callback
  * @param topo desired underlay topology to use
  * @param ... topology-specific options
  * @return handle to the operation, NULL if connecting these
@@ -892,11 +1004,15 @@
  *         not running or underlay disallows) or if num_peers is less than 2
  */
 struct GNUNET_TESTBED_Operation *
-GNUNET_TESTBED_overlay_configure_topology (void *op_cls, unsigned int 
num_peers,
+GNUNET_TESTBED_overlay_configure_topology (void *op_cls,
+                                           unsigned int num_peers,
                                            struct GNUNET_TESTBED_Peer **peers,
                                            unsigned int *max_connections,
-                                           enum GNUNET_TESTBED_TopologyOption
-                                           topo, ...)
+                                           
GNUNET_TESTBED_TopologyCompletionCallback
+                                           comp_cb,
+                                           void *comp_cb_cls,
+                                           enum GNUNET_TESTBED_TopologyOption 
topo,
+                                           ...)
 {
   struct GNUNET_TESTBED_Operation *op;
   va_list vargs;
@@ -904,7 +1020,9 @@
   GNUNET_assert (topo < GNUNET_TESTBED_TOPOLOGY_OPTION_END);
   va_start (vargs, topo);
   op = GNUNET_TESTBED_overlay_configure_topology_va (op_cls, num_peers, peers,
-                                                     max_connections, topo,
+                                                     max_connections, 
+                                                     comp_cb, comp_cb_cls,
+                                                     topo,
                                                      vargs);
   va_end (vargs);
   return op;




reply via email to

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