[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r26019 - in gnunet/src: gns include regex testbed,
gnunet <=