From 0f821828934dfa4959c75f8ca06be651fd535001 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Wed, 29 May 2013 13:20:41 +0000 Subject: [PATCH] changes --- src/experimentation/Makefile.am | 8 +- .../gnunet-daemon-experimentation.h | 2 +- .../gnunet-daemon-experimentation_nodes.c | 14 +++- .../gnunet-daemon-experimentation_scheduler.c | 76 ++++++++++++++++--- ... => test_experimentation_clique_connect.c} | 8 +- 5 files changed, 87 insertions(+), 21 deletions(-) rename src/experimentation/{test_experimentation_clique.c => test_experimentation_clique_connect.c} (98%) diff --git a/src/experimentation/Makefile.am b/src/experimentation/Makefile.am index aaa205460..49876adc1 100644 --- a/src/experimentation/Makefile.am +++ b/src/experimentation/Makefile.am @@ -18,7 +18,7 @@ endif if HAVE_EXPERIMENTAL - TEXT_EXP_CLIQUE = test_experimentation_clique + TEXT_EXP_CLIQUE = test_experimentation_clique_connect endif check_PROGRAMS = \ @@ -44,9 +44,9 @@ gnunet_daemon_experimentation_LDADD = \ $(top_builddir)/src/statistics/libgnunetstatistics.la \ $(top_builddir)/src/util/libgnunetutil.la -test_experimentation_clique_SOURCES = \ - test_experimentation_clique.c -test_experimentation_clique_LDADD = \ +test_experimentation_clique_connect_SOURCES = \ + test_experimentation_clique_connect.c +test_experimentation_clique_connect_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/statistics/libgnunetstatistics.la \ $(top_builddir)/src/testbed/libgnunettestbed.la diff --git a/src/experimentation/gnunet-daemon-experimentation.h b/src/experimentation/gnunet-daemon-experimentation.h index 8be39fa93..2d19720d0 100644 --- a/src/experimentation/gnunet-daemon-experimentation.h +++ b/src/experimentation/gnunet-daemon-experimentation.h @@ -291,7 +291,7 @@ GNUNET_EXPERIMENTATION_experiments_stop (); * Start the scheduler component */ void -GNUNET_EXPERIMENTATION_scheduler_add (struct Experiment *e); +GNUNET_EXPERIMENTATION_scheduler_add (struct Node *n, struct Experiment *e); /** * Start the scheduler component diff --git a/src/experimentation/gnunet-daemon-experimentation_nodes.c b/src/experimentation/gnunet-daemon-experimentation_nodes.c index 2e8628088..8631e5d58 100644 --- a/src/experimentation/gnunet-daemon-experimentation_nodes.c +++ b/src/experimentation/gnunet-daemon-experimentation_nodes.c @@ -225,7 +225,7 @@ size_t send_request_cb (void *cls, size_t bufsize, void *buf) msg.capabilities = htonl (GSE_node_capabilities); msg.issuer_count = htonl (GSE_my_issuer_count); memcpy (buf, &msg, msg_size); - memcpy (&buf[msg_size], GSE_my_issuer, ri_size); + memcpy (&((char *) buf)[msg_size], GSE_my_issuer, ri_size); GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Sending request to peer %s\n"), GNUNET_i2s (&n->id)); @@ -292,7 +292,7 @@ size_t send_response_cb (void *cls, size_t bufsize, void *buf) msg.capabilities = htonl (GSE_node_capabilities); msg.issuer_count = htonl (GSE_my_issuer_count); memcpy (buf, &msg, msg_size); - memcpy (&buf[msg_size], GSE_my_issuer, ri_size); + memcpy (&((char *) buf)[msg_size], GSE_my_issuer, ri_size); GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Sending response to peer %s\n"), GNUNET_i2s (&n->id)); @@ -304,6 +304,7 @@ static void get_experiments_cb (struct Node *n, struct Experiment *e) { static int counter = 0; + //size_t start_size; if (NULL == e) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Added %u experiments for peer %s\n"), @@ -314,7 +315,14 @@ get_experiments_cb (struct Node *n, struct Experiment *e) GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Starting experiment `%s' with peer %s\n"), e->name, GNUNET_i2s (&n->id)); - //GNUNET_EXPERIMENTATION_scheduler_add (e); + + /* Request experiment */ +/* start_size = sizeof (struct Experimentation_Start); + GNUNET_CORE_notify_transmit_ready (ch, GNUNET_NO, 0, EXP_RESPONSE_TIMEOUT, + n->id, start_size, send_start_cb, n);*/ + + GNUNET_EXPERIMENTATION_scheduler_add (n, e); + counter ++; } diff --git a/src/experimentation/gnunet-daemon-experimentation_scheduler.c b/src/experimentation/gnunet-daemon-experimentation_scheduler.c index 39b541574..37f4f0640 100644 --- a/src/experimentation/gnunet-daemon-experimentation_scheduler.c +++ b/src/experimentation/gnunet-daemon-experimentation_scheduler.c @@ -31,11 +31,21 @@ #include "gnunet_statistics_service.h" #include "gnunet-daemon-experimentation.h" +enum ExperimentState +{ + NOT_RUNNING, + REQUESTED, + STARTED, + STOPPED +}; + struct ScheduledExperiment { struct ScheduledExperiment *next; struct ScheduledExperiment *prev; struct Experiment *e; + struct Node *n; + int state; GNUNET_SCHEDULER_TaskIdentifier task; }; @@ -43,27 +53,70 @@ struct ScheduledExperiment *list_head; struct ScheduledExperiment *list_tail; +static void +request_timeout (void *cls,const struct GNUNET_SCHEDULER_TaskContext* tc) +{ + struct ScheduledExperiment *se = cls; + se->task = GNUNET_SCHEDULER_NO_TASK; + + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Peer `%s' did not respond to request for experiment `%s'\n", + GNUNET_i2s (&se->n->id), se->e->name); + + GNUNET_CONTAINER_DLL_remove (list_head, list_tail, se); + GNUNET_free (se); + + /* Remove experiment */ +} + static void run (void *cls,const struct GNUNET_SCHEDULER_TaskContext* tc) { struct ScheduledExperiment *se = cls; - //struct GNUNET_TIME_Relative end; + struct GNUNET_TIME_Relative end; se->task = GNUNET_SCHEDULER_NO_TASK; - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Running `%s'\n", se->e->name); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Executing `%s'\n", se->e->name); + -// end = GNUNET_TIME_absolute_get_remaining(se->e->stop); -// if (0 < end.rel_value) -// return; /* End of experiment is reached */ + if (NOT_RUNNING == se->state) + { + /* Send start message */ + //GNUNET_EXPERIMENT_nodes_request_start (se->e); + se->state = REQUESTED; + se->task = GNUNET_SCHEDULER_add_delayed (EXP_RESPONSE_TIMEOUT, &request_timeout, se); + return; + } + else if (REQUESTED == se->state) + { + /* Already requested */ + return; + } + else if (STARTED == se->state) + { + /* Experiment is running */ + + /* do work here */ -//GNUNET_break (0); - se->task = GNUNET_SCHEDULER_add_delayed (se->e->frequency, &run, se); + /* Reschedule */ + end = GNUNET_TIME_absolute_get_remaining(GNUNET_TIME_absolute_add (se->e->stop, se->e->frequency)); + if (0 == end.rel_value) + { + se->state = STOPPED; + return; /* End of experiment is reached */ + } + se->task = GNUNET_SCHEDULER_add_delayed (se->e->frequency, &run, se); + } + + else if (STOPPED == se->state) + { + /* Experiment expired */ + } } /** * Start the scheduler component */ void -GNUNET_EXPERIMENTATION_scheduler_add (struct Experiment *e) +GNUNET_EXPERIMENTATION_scheduler_add (struct Node *n, struct Experiment *e) { struct ScheduledExperiment *se; struct GNUNET_TIME_Relative start; @@ -72,18 +125,23 @@ GNUNET_EXPERIMENTATION_scheduler_add (struct Experiment *e) start = GNUNET_TIME_absolute_get_remaining(e->start); end = GNUNET_TIME_absolute_get_remaining(e->stop); + /* Add additional checks here if required */ + if (0 == end.rel_value) return; /* End of experiment is reached */ se = GNUNET_malloc (sizeof (struct ScheduledExperiment)); + se->state = NOT_RUNNING; se->e = e; + se->n = n; if (0 == start.rel_value) se->task = GNUNET_SCHEDULER_add_now (&run, se); else se->task = GNUNET_SCHEDULER_add_delayed (start, &run, se); GNUNET_CONTAINER_DLL_insert (list_head, list_tail, se); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Scheduled `%s'\n", e->name); + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Added experiment `%s' for node to be scheduled\n", + e->name, GNUNET_i2s(&se->n->id)); } /** diff --git a/src/experimentation/test_experimentation_clique.c b/src/experimentation/test_experimentation_clique_connect.c similarity index 98% rename from src/experimentation/test_experimentation_clique.c rename to src/experimentation/test_experimentation_clique_connect.c index 0913c1a7f..9b4d0117b 100644 --- a/src/experimentation/test_experimentation_clique.c +++ b/src/experimentation/test_experimentation_clique_connect.c @@ -19,7 +19,7 @@ */ /** - * @file src/testbed/test_testbed_api_topology.c + * @file src/experimentation/test_experimentation_clique_connect.c * @brief test case to connect experimentation daemons in a clique * @author Sree Harsha Totakura * @author Matthias Wachs @@ -33,7 +33,7 @@ /** * Number of peers we want to start */ -#define NUM_PEERS 20 +#define NUM_PEERS 2 #define NUM_ISSUER 1 @@ -401,7 +401,7 @@ main (int argc, char **argv) event_mask = 0; event_mask |= (1LL << GNUNET_TESTBED_ET_CONNECT); event_mask |= (1LL << GNUNET_TESTBED_ET_OPERATION_FINISHED); - (void) GNUNET_TESTBED_test_run ("test_experimentation_clique", + (void) GNUNET_TESTBED_test_run ("test_experimentation_clique_connect", "test_experimentation_clique.conf", NUM_PEERS, event_mask, &controller_event_cb, NULL, &test_master, NULL); @@ -410,4 +410,4 @@ main (int argc, char **argv) return 0; } -/* end of test_testbed_api_topology.c */ +/* end of test_experimentation_clique_connect.c */ -- 2.25.1