#include "gnunet_dht_service.h"
#include "gnunet_testbed_service.h"
-#define FIND_TIMEOUT GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 90)
+#define FIND_TIMEOUT \
+ GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 90)
#define SEARCHES_IN_PARALLEL 100
-#define ANNOUNCE_DELAY GNUNET_TIME_relative_multiply(\
- GNUNET_TIME_UNIT_MILLISECONDS,\
- 300)
-#define SEARCH_DELAY GNUNET_TIME_relative_multiply(\
- GNUNET_TIME_UNIT_MILLISECONDS,\
- 200)
/**
* DLL of operations
char *policy_file;
/**
- * Peers search string.
+ * Peer's search string.
*/
const char *search_str;
/**
* Index of peer to start next announce/search..
*/
-static unsigned int search_index;
+static unsigned int next_search;
/**
* Search task identifier
*/
static char * regex_prefix;
+/**
+ * What's the maximum regex reannounce period.
+ */
+static struct GNUNET_TIME_Relative reannounce_period_max;
+
/******************************************************************************/
/****************************** DECLARATIONS ********************************/
if (NULL != cfg)
GNUNET_CONFIGURATION_destroy (cfg);
- GNUNET_SCHEDULER_shutdown (); /* Stop scheduler to shutdown testbed run */
+ GNUNET_SCHEDULER_shutdown (); /* Stop scheduler to shutdown testbed run */
}
{
peer->stats_op_handle =
GNUNET_TESTBED_service_connect (NULL,
- peer->peer_handle,
- "statistics",
- &stats_connect_cb,
- peer,
- &stats_ca,
- &stats_da,
- peer);
+ peer->peer_handle,
+ "statistics",
+ &stats_connect_cb,
+ peer,
+ &stats_ca,
+ &stats_da,
+ peer);
}
}
peer->stats_handle = ca_result;
if (NULL == GNUNET_STATISTICS_get (peer->stats_handle, NULL, NULL,
- GNUNET_TIME_UNIT_FOREVER_REL,
- &stats_cb,
- &stats_iterator, peer))
+ GNUNET_TIME_UNIT_FOREVER_REL,
+ &stats_cb,
+ &stats_iterator, peer))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Could not get statistics of peer %u!\n", peer->id);
+ "Could not get statistics of peer %u!\n", peer->id);
}
}
peer->stats_op_handle =
GNUNET_TESTBED_service_connect (NULL,
- peer->peer_handle,
- "statistics",
- &stats_connect_cb,
- peer,
- &stats_ca,
- &stats_da,
- peer);
+ peer->peer_handle,
+ "statistics",
+ &stats_connect_cb,
+ peer,
+ &stats_ca,
+ &stats_da,
+ peer);
}
{
GNUNET_SCHEDULER_cancel (peer->timeout);
peer->timeout = GNUNET_SCHEDULER_NO_TASK;
- GNUNET_SCHEDULER_add_delayed (SEARCH_DELAY, &announce_next_regex, NULL);
+ GNUNET_SCHEDULER_add_now (&announce_next_regex, NULL);
}
if (NULL == id)
peer_cnt >= num_search_strings)
return;
- parallel_searches++;
peers[peer_cnt].search_str = search_strings[peer_cnt];
peers[peer_cnt].search_str_matched = GNUNET_NO;
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
{
struct RegexPeer *peer = cls;
- peer->arm_handle = GNUNET_ARM_alloc (cfg);
- GNUNET_ARM_connect (peer->arm_handle, NULL, NULL);
+ peer->arm_handle = GNUNET_ARM_connect (cfg, NULL, NULL);
return peer->arm_handle;
}
if (NULL != peer->arm_handle)
{
- GNUNET_ARM_disconnect (peer->arm_handle);
+ GNUNET_ARM_disconnect_and_free (peer->arm_handle);
peer->arm_handle = NULL;
}
}
case GNUNET_ARM_RESULT_STARTING:
GNUNET_SCHEDULER_add_now (&arm_op_done, peer);
- if (search_index < (num_peers - 1))
{
long search_peer;
- unsigned int i = 0;
+ unsigned int i;
+ unsigned int me;
+
+ me = peer - peers;
/* Find a peer to look for a string matching the regex announced */
search_peer = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
{
search_peer = (search_peer + 1) % num_peers;
if (i > num_peers)
- GNUNET_abort (); /* we run out of peers, must be a bug */
+ GNUNET_abort (); /* we ran out of peers, must be a bug */
}
- peers[search_peer].search_str = search_strings[search_index];
- GNUNET_SCHEDULER_add_delayed (SEARCH_DELAY,
+ peers[search_peer].search_str = search_strings[me];
+ GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(
+ reannounce_period_max,
+ 2),
&find_string,
(void *) search_peer);
}
- else
+ if (next_search >= num_peers &&
+ GNUNET_SCHEDULER_NO_TASK == search_timeout_task)
{
- GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "All daemons started."
- " Waiting %s to start string searches\n",
- GNUNET_STRINGS_relative_time_to_string (search_delay,
- GNUNET_NO));
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO, "All daemons started.\n");
/* FIXME start GLOBAL timeout to abort experiment */
search_timeout_task = GNUNET_SCHEDULER_add_delayed (search_timeout_time,
&search_timeout,
}
GNUNET_assert (NULL != peer->arm_handle);
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "[]%p - ()%p\n", peer->op_handle, op);
GNUNET_assert (peer->op_handle == op);
GNUNET_assert (peer->arm_handle == ca_result);
static void
do_announce (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
+ unsigned int i;
+
GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Starting announce.\n");
- for (search_index = 0; search_index < SEARCHES_IN_PARALLEL; search_index++)
+ for (i = 0; i < SEARCHES_IN_PARALLEL; i++)
{
- /* First connect to arm service, then announce. Next
- announce will be in arm_connect_cb */
- peers[search_index].op_handle =
- GNUNET_TESTBED_service_connect (NULL,
- peers[search_index].peer_handle,
- "arm",
- &arm_connect_cb,
- &peers[search_index],
- &arm_ca,
- &arm_da,
- &peers[search_index]);
- parallel_searches++;
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ " scheduling announce %u\n",
+ i);
+ (void) GNUNET_SCHEDULER_add_now (&announce_next_regex, NULL);
}
}
static void
announce_next_regex (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
{
- if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
+ if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) ||
+ next_search >= num_peers)
return;
- GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Starting daemon %u\n", search_index);
-
- peers[search_index].op_handle =
+ /* First connect to arm service, then announce. Next
+ * a nnounce will be in arm_connect_cb */
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Starting daemon %u\n", next_search);
+ peers[next_search].op_handle =
GNUNET_TESTBED_service_connect (NULL,
- peers[search_index].peer_handle,
+ peers[next_search].peer_handle,
"arm",
&arm_connect_cb,
- &peers[search_index],
+ &peers[next_search],
&arm_ca,
&arm_da,
- &peers[search_index]);
+ &peers[next_search]);
+ next_search++;
+ parallel_searches++;
}
/**
{
prof_time = GNUNET_TIME_absolute_get_duration (prof_start_time);
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
- "\n%u links established in %s\n",
+ "%u links established in %s\n",
num_links,
GNUNET_STRINGS_relative_time_to_string (prof_time,
GNUNET_NO));
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (config, "REGEXPROFILER", "REGEX_PREFIX",
- ®ex_prefix))
+ ®ex_prefix))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
_("Configuration option \"regex_prefix\" missing. Exiting\n"));
shutdown_task = GNUNET_SCHEDULER_add_now (&do_shutdown, NULL);
return;
}
+ cfg = GNUNET_CONFIGURATION_dup (config);
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_time (cfg, "REGEXPROFILER",
+ "REANNOUNCE_PERIOD_MAX",
+ &reannounce_period_max))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "reannounce_period_max not given. Using 10 minutes.\n");
+ reannounce_period_max =
+ GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 10);
+ }
unsigned int i;
for (i = 0; i < num_search_strings; i++)
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "search string: %s\n", search_strings[i]);
- cfg = GNUNET_CONFIGURATION_dup (config);
abort_task =
GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
(GNUNET_TIME_UNIT_SECONDS, 5), &do_abort,