#include "gnunet_disk_lib.h"
/** Globals **/
-#define DEFAULT_CONNECT_TIMEOUT GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 30)
+#define DEFAULT_CONNECT_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
#define DEFAULT_CONNECT_ATTEMPTS 2
unsigned int total;
unsigned int peers_left;
unsigned long long max_concurrent_connections;
+
+ /**
+ * Maximum attemps to connect two daemons.
+ */
unsigned long long connect_attempts;
+
+ /**
+ * How long to spend trying to establish all the connections?
+ */
+ struct GNUNET_TIME_Relative connect_timeout;
+
unsigned long long max_concurrent_ssh;
struct GNUNET_TIME_Absolute timeout;
GNUNET_TESTING_NotifyConnection connect_cb;
ret = GNUNET_malloc (sizeof (struct ProgressMeter));
ret->print = print;
ret->total = total;
- ret->modnum = total / 4;
+ ret->modnum = (total / 4 == 0) ? 1 : (total / 4);
ret->dotnum = (total / 50) + 1;
if (start_string != NULL)
ret->startup_string = GNUNET_strdup (start_string);
{
if (meter->completed == 0)
{
- fprintf (stdout, "%sProgress: [0%%", meter->startup_string);
+ FPRINTF (stdout, "%sProgress: [0%%", meter->startup_string);
}
else
- fprintf (stdout, "%d%%", (int) (((float) meter->completed
- / meter->total) * 100));
+ FPRINTF (stdout, "%d%%",
+ (int) (((float) meter->completed / meter->total) * 100));
}
else if (meter->completed % meter->dotnum == 0)
- fprintf (stdout, ".");
+ FPRINTF (stdout, "%s", ".");
if (meter->completed + 1 == meter->total)
- fprintf (stdout, "%d%%]\n", 100);
+ FPRINTF (stdout, "%d%%]\n", 100);
fflush (stdout);
}
meter->completed++;
* failure (peers failed to connect).
*/
static void
-internal_topology_callback (void *cls,
- const struct GNUNET_PeerIdentity *first,
+internal_topology_callback (void *cls, const struct GNUNET_PeerIdentity *first,
const struct GNUNET_PeerIdentity *second,
uint32_t distance,
const struct GNUNET_CONFIGURATION_Handle *first_cfg,
#endif
#if TIMING
- if (GNUNET_TIME_absolute_get_difference (connect_last_time,
- GNUNET_TIME_absolute_get
- ()).rel_value >
+ if (GNUNET_TIME_absolute_get_difference
+ (connect_last_time,
+ GNUNET_TIME_absolute_get ()).rel_value >
GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS,
CONN_UPDATE_DURATION).rel_value)
{
new_failed_connections = failed_connections - previous_failed_connections;
/* Get duration in seconds */
- duration
- = GNUNET_TIME_absolute_get_difference (connect_last_time,
- GNUNET_TIME_absolute_get
- ()).rel_value / 1000;
+ duration =
+ GNUNET_TIME_absolute_get_difference (connect_last_time,
+ GNUNET_TIME_absolute_get
+ ()).rel_value / 1000;
total_duration =
GNUNET_TIME_absolute_get_difference (connect_start_time,
GNUNET_TIME_absolute_get
conns_per_sec_total = (double) total_connections / total_duration;
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Recent: %.2f/s, Total: %.2f/s, Recent failed: %.2f/s, total failed %.2f/s\n",
- conns_per_sec_recent, CONN_UPDATE_DURATION,
- conns_per_sec_total, failed_conns_per_sec_recent,
- failed_conns_per_sec_total);
+ conns_per_sec_recent, CONN_UPDATE_DURATION, conns_per_sec_total,
+ failed_conns_per_sec_recent, failed_conns_per_sec_total);
connect_last_time = GNUNET_TIME_absolute_get ();
previous_connections = total_connections;
previous_failed_connections = failed_connections;
GNUNET_assert (pg_start_ctx->connect_meter != NULL);
if (pg_start_ctx->connect_cb != NULL)
- pg_start_ctx->connect_cb (pg_start_ctx->cls, first,
- second,
- distance,
- first_cfg,
- second_cfg, first_daemon, second_daemon, emsg);
+ pg_start_ctx->connect_cb (pg_start_ctx->cls, first, second, distance,
+ first_cfg, second_cfg, first_daemon,
+ second_daemon, emsg);
if (GNUNET_YES == update_meter (pg_start_ctx->connect_meter))
{
#if VERBOSE
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Created %d total connections, which is our target number! Starting next phase of testing.\n",
- total_connections);
+ pg_start_ctx->total_connections);
#endif
#if TIMING
- total_duration
- = GNUNET_TIME_absolute_get_difference (connect_start_time,
- GNUNET_TIME_absolute_get
- ()).rel_value / 1000;
+ total_duration =
+ GNUNET_TIME_absolute_get_difference (connect_start_time,
+ GNUNET_TIME_absolute_get
+ ()).rel_value / 1000;
failed_conns_per_sec_total = (double) failed_connections / total_duration;
conns_per_sec_total = (double) total_connections / total_duration;
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
}
}
+
+/**
+ * Callback called for each started daemon.
+ *
+ * @param cls Clause (PG Context).
+ * @param id PeerIdentidy of started daemon.
+ * @param cfg Configuration used by the daemon.
+ * @param d Handle for the daemon.
+ * @param emsg Error message, NULL on success.
+ */
static void
internal_peers_started_callback (void *cls,
const struct GNUNET_PeerIdentity *id,
#if VERBOSE > 1
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Started daemon %llu out of %llu\n",
- (num_peers - peers_left) + 1, num_peers);
+ (pg_start_ctx->total - pg_start_ctx->peers_left) + 1,
+ pg_start_ctx->total);
#endif
pg_start_ctx->peers_left--;
+ if (NULL == pg_start_ctx->peer_start_meter)
+ {
+ /* Cancelled Ctrl-C or error */
+ return;
+ }
if (GNUNET_YES == update_meter (pg_start_ctx->peer_start_meter))
{
#if VERBOSE
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "All %d daemons started, now connecting peers!\n", num_peers);
+ "All %d daemons started, now connecting peers!\n",
+ pg_start_ctx->total);
#endif
GNUNET_assert (pg_start_ctx->die_task != GNUNET_SCHEDULER_NO_TASK);
GNUNET_SCHEDULER_cancel (pg_start_ctx->die_task);
pg_start_ctx->expected_connections = UINT_MAX;
+ // FIXME: why whould peers_left be != 0?? Or pg NULL?
if ((pg_start_ctx->pg != NULL) && (pg_start_ctx->peers_left == 0))
{
pg_start_ctx->connect_start_time = GNUNET_TIME_absolute_get ();
- pg_start_ctx->expected_connections
- = GNUNET_TESTING_connect_topology (pg_start_ctx->pg,
- pg_start_ctx->connect_topology,
- pg_start_ctx->connect_topology_option,
- pg_start_ctx->connect_topology_option_modifier,
- DEFAULT_CONNECT_TIMEOUT,
- pg_start_ctx->connect_attempts,
- NULL, NULL);
-
- pg_start_ctx->connect_meter
- = create_meter (pg_start_ctx->expected_connections,
- "Peer connection ", pg_start_ctx->verbose);
- GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "Have %d expected connections\n",
+ pg_start_ctx->expected_connections =
+ GNUNET_TESTING_connect_topology (pg_start_ctx->pg,
+ pg_start_ctx->connect_topology,
+ pg_start_ctx->connect_topology_option,
+ pg_start_ctx->connect_topology_option_modifier,
+ pg_start_ctx->connect_timeout,
+ pg_start_ctx->connect_attempts, NULL,
+ NULL);
+
+ pg_start_ctx->connect_meter =
+ create_meter (pg_start_ctx->expected_connections, "Peer connection ",
+ pg_start_ctx->verbose);
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Have %d expected connections\n",
pg_start_ctx->expected_connections);
}
GNUNET_strdup ("from connect topology (bad return)");
pg_start_ctx->die_task =
GNUNET_SCHEDULER_add_now (&end_badly, pg_start_ctx);
+ return;
}
GNUNET_free_non_null (pg_start_ctx->fail_reason);
#if VERBOSE > 1
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Hostkey (%d/%d) created for peer `%s'\n",
- num_peers - peers_left, num_peers, GNUNET_i2s (id));
+ pg_start_ctx->total - pg_start_ctx->peers_left + 1,
+ pg_start_ctx->total, GNUNET_i2s (id));
#endif
pg_start_ctx->peers_left--;
if (GNUNET_YES == update_meter (pg_start_ctx->hostkey_meter))
{
GNUNET_SCHEDULER_cancel (pg_start_ctx->die_task);
+ GNUNET_free_non_null (pg_start_ctx->fail_reason);
/* Set up task in case topology creation doesn't finish
* within a reasonable amount of time */
+ pg_start_ctx->fail_reason = GNUNET_strdup ("from create_topology");
pg_start_ctx->die_task =
GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining
(pg_start_ctx->timeout), &end_badly,
- "from create_topology");
+ pg_start_ctx);
pg_start_ctx->peers_left = pg_start_ctx->total; /* Reset counter */
create_expected_connections =
GNUNET_TESTING_create_topology (pg_start_ctx->pg,
else
{
GNUNET_SCHEDULER_cancel (pg_start_ctx->die_task);
- pg_start_ctx->die_task = GNUNET_SCHEDULER_add_now (&end_badly,
- "from create topology (bad return)");
+ GNUNET_free_non_null (pg_start_ctx->fail_reason);
+ pg_start_ctx->fail_reason =
+ GNUNET_strdup ("from create topology (bad return)");
+ pg_start_ctx->die_task =
+ GNUNET_SCHEDULER_add_now (&end_badly, pg_start_ctx);
+ return;
}
GNUNET_SCHEDULER_cancel (pg_start_ctx->die_task);
- pg_start_ctx->die_task
- =
+ GNUNET_free_non_null (pg_start_ctx->fail_reason);
+ pg_start_ctx->fail_reason =
+ GNUNET_strdup ("from continue startup (timeout)");
+ pg_start_ctx->die_task =
GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining
(pg_start_ctx->timeout), &end_badly,
- "from continue startup (timeout)");
+ pg_start_ctx);
}
}
* @param cls closure
* @param first peer id for first daemon
* @param second peer id for the second daemon
- * @param distance distance between the connected peers
* @param emsg error message (NULL on success)
*/
void
-write_topology_cb (void *cls,
- const struct GNUNET_PeerIdentity *first,
+write_topology_cb (void *cls, const struct GNUNET_PeerIdentity *first,
const struct GNUNET_PeerIdentity *second, const char *emsg)
{
struct TopologyOutputContext *topo_ctx;
const struct GNUNET_TESTING_Host *hostnames)
{
struct PeerGroupStartupContext *pg_start_ctx;
- unsigned long long temp_config_number;
char *temp_str;
int temp;
+ struct GNUNET_TIME_Relative rtimeout;
GNUNET_assert (total > 0);
GNUNET_assert (cfg != NULL);
pg_start_ctx = GNUNET_malloc (sizeof (struct PeerGroupStartupContext));
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (cfg, "testing",
- "connect_attempts",
- &pg_start_ctx->connect_attempts))
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_number (cfg, "testing", "connect_attempts",
+ &pg_start_ctx->connect_attempts))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Must provide option %s:%s!\n",
"testing", "connect_attempts");
return NULL;
}
- if (GNUNET_OK
- != GNUNET_CONFIGURATION_get_value_number (cfg, "testing",
- "max_outstanding_connections",
- &pg_start_ctx->max_concurrent_connections))
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_time (cfg, "testing", "CONNECT_TIMEOUT",
+ &pg_start_ctx->connect_timeout))
+ {
+ pg_start_ctx->connect_timeout = DEFAULT_CONNECT_TIMEOUT;
+ }
+
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_number (cfg, "testing",
+ "max_outstanding_connections",
+ &pg_start_ctx->max_concurrent_connections))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Must provide option %s:%s!\n",
"testing", "max_outstanding_connections");
return NULL;
}
- if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_number (cfg, "testing",
- "max_concurrent_ssh",
- &pg_start_ctx->max_concurrent_ssh))
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_number (cfg, "testing",
+ "max_concurrent_ssh",
+ &pg_start_ctx->max_concurrent_ssh))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Must provide option %s:%s!\n",
"testing", "max_concurrent_ssh");
return NULL;
}
- if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cfg, "testing",
- "peergroup_timeout",
- &temp_config_number))
- pg_start_ctx->timeout =
- GNUNET_TIME_relative_to_absolute (GNUNET_TIME_relative_multiply
- (GNUNET_TIME_UNIT_SECONDS,
- temp_config_number));
- else
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_time (cfg, "testing", "PEERGROUP_TIMEOUT",
+ &rtimeout))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Must provide option %s:%s!\n",
- "testing", "peergroup_timeout");
+ "testing", "PEERGROUP_TIMEOUT");
GNUNET_free (pg_start_ctx);
return NULL;
}
+ pg_start_ctx->timeout = GNUNET_TIME_relative_to_absolute (rtimeout);
/* Read topology related options from the configuration file */
temp_str = NULL;
- if ((GNUNET_YES == GNUNET_CONFIGURATION_get_value_string (cfg, "testing",
- "topology",
- &temp_str))
- && (GNUNET_NO ==
- GNUNET_TESTING_topology_get (&pg_start_ctx->topology, temp_str)))
+ if ((GNUNET_YES ==
+ GNUNET_CONFIGURATION_get_value_string (cfg, "testing", "topology",
+ &temp_str)) &&
+ (GNUNET_NO ==
+ GNUNET_TESTING_topology_get (&pg_start_ctx->topology, temp_str)))
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Invalid topology `%s' given for section %s option %s\n",
GNUNET_free (temp_str);
}
- if (GNUNET_OK
- != GNUNET_CONFIGURATION_get_value_string (cfg, "testing", "percentage",
- &temp_str))
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_string (cfg, "testing", "percentage",
+ &temp_str))
pg_start_ctx->topology_percentage = 0.5;
else
{
GNUNET_free (temp_str);
}
- if (GNUNET_OK
- != GNUNET_CONFIGURATION_get_value_string (cfg, "testing", "probability",
- &temp_str))
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_get_value_string (cfg, "testing", "probability",
+ &temp_str))
pg_start_ctx->topology_probability = 0.5;
else
{
GNUNET_free (temp_str);
}
- if ((GNUNET_YES
- == GNUNET_CONFIGURATION_get_value_string (cfg, "testing",
- "connect_topology",
- &temp_str))
- && (GNUNET_NO ==
- GNUNET_TESTING_topology_get (&pg_start_ctx->connect_topology,
- temp_str)))
+ if ((GNUNET_YES ==
+ GNUNET_CONFIGURATION_get_value_string (cfg, "testing",
+ "connect_topology", &temp_str)) &&
+ (GNUNET_NO ==
+ GNUNET_TESTING_topology_get (&pg_start_ctx->connect_topology, temp_str)))
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Invalid connect topology `%s' given for section %s option %s\n",
}
GNUNET_free_non_null (temp_str);
- if ((GNUNET_YES
- == GNUNET_CONFIGURATION_get_value_string (cfg, "testing",
- "connect_topology_option",
- &temp_str))
- && (GNUNET_NO
- ==
- GNUNET_TESTING_topology_option_get
- (&pg_start_ctx->connect_topology_option, temp_str)))
+ if ((GNUNET_YES ==
+ GNUNET_CONFIGURATION_get_value_string (cfg, "testing",
+ "connect_topology_option",
+ &temp_str)) &&
+ (GNUNET_NO ==
+ GNUNET_TESTING_topology_option_get
+ (&pg_start_ctx->connect_topology_option, temp_str)))
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
"Invalid connect topology option `%s' given for section %s option %s\n",
}
GNUNET_free_non_null (temp_str);
- if (GNUNET_YES
- == GNUNET_CONFIGURATION_get_value_string (cfg,
- "testing",
- "connect_topology_option_modifier",
- &temp_str))
+ if (GNUNET_YES ==
+ GNUNET_CONFIGURATION_get_value_string (cfg, "testing",
+ "connect_topology_option_modifier",
+ &temp_str))
{
- if (sscanf (temp_str, "%lf",
- &pg_start_ctx->connect_topology_option_modifier) != 1)
+ if (sscanf
+ (temp_str, "%lf", &pg_start_ctx->connect_topology_option_modifier) != 1)
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
_
GNUNET_free (temp_str);
}
- if (GNUNET_YES
- != GNUNET_CONFIGURATION_get_value_string (cfg, "testing",
- "blacklist_transports",
- &pg_start_ctx->restrict_transports))
+ if (GNUNET_YES !=
+ GNUNET_CONFIGURATION_get_value_string (cfg, "testing",
+ "blacklist_transports",
+ &pg_start_ctx->restrict_transports))
pg_start_ctx->restrict_transports = NULL;
pg_start_ctx->restrict_topology = GNUNET_TESTING_TOPOLOGY_NONE;
- if ((GNUNET_YES
- == GNUNET_CONFIGURATION_get_value_string (cfg, "testing",
- "blacklist_topology",
- &temp_str))
+ if ((GNUNET_YES ==
+ GNUNET_CONFIGURATION_get_value_string (cfg, "testing",
+ "blacklist_topology", &temp_str))
&& (GNUNET_NO ==
GNUNET_TESTING_topology_get (&pg_start_ctx->restrict_topology,
temp_str)))
pg_start_ctx->verbose);
/* Make compilers happy */
reset_meter (pg_start_ctx->peer_start_meter);
- pg_start_ctx->die_task
- =
+ pg_start_ctx->fail_reason =
+ GNUNET_strdup
+ ("didn't generate all hostkeys within allowed startup time!");
+ pg_start_ctx->die_task =
GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_absolute_get_remaining
(pg_start_ctx->timeout), &end_badly,
- "didn't generate all hostkeys within allowed startup time!");
-
- pg_start_ctx->pg
- = GNUNET_TESTING_daemons_start (pg_start_ctx->cfg,
- pg_start_ctx->peers_left,
- pg_start_ctx->max_concurrent_connections,
- pg_start_ctx->max_concurrent_ssh,
- GNUNET_TIME_absolute_get_remaining
- (pg_start_ctx->timeout),
- &internal_hostkey_callback, pg_start_ctx,
- &internal_peers_started_callback,
- pg_start_ctx, &internal_topology_callback,
- pg_start_ctx, pg_start_ctx->hostnames);
+ pg_start_ctx);
+
+ pg_start_ctx->pg =
+ GNUNET_TESTING_daemons_start (pg_start_ctx->cfg, pg_start_ctx->peers_left,
+ pg_start_ctx->max_concurrent_connections,
+ pg_start_ctx->max_concurrent_ssh,
+ GNUNET_TIME_absolute_get_remaining
+ (pg_start_ctx->timeout),
+ &internal_hostkey_callback, pg_start_ctx,
+ &internal_peers_started_callback,
+ pg_start_ctx, &internal_topology_callback,
+ pg_start_ctx, pg_start_ctx->hostnames);
return pg_start_ctx->pg;
}