gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r32017 - gnunet/src/ats-tests


From: gnunet
Subject: [GNUnet-SVN] r32017 - gnunet/src/ats-tests
Date: Thu, 23 Jan 2014 15:56:59 +0100

Author: wachs
Date: 2014-01-23 15:56:59 +0100 (Thu, 23 Jan 2014)
New Revision: 32017

Modified:
   gnunet/src/ats-tests/ats-testing-experiment.c
   gnunet/src/ats-tests/ats-testing-log.c
   gnunet/src/ats-tests/ats-testing.c
   gnunet/src/ats-tests/ats-testing.h
   gnunet/src/ats-tests/gnunet-ats-sim.c
Log:
new logging functionality


Modified: gnunet/src/ats-tests/ats-testing-experiment.c
===================================================================
--- gnunet/src/ats-tests/ats-testing-experiment.c       2014-01-23 12:44:35 UTC 
(rev 32016)
+++ gnunet/src/ats-tests/ats-testing-experiment.c       2014-01-23 14:56:59 UTC 
(rev 32017)
@@ -35,20 +35,141 @@
   e->name = NULL;
   e->num_masters = 0;
   e->num_slaves = 0;
-
+  e->start = NULL;
+  e->total_duration = GNUNET_TIME_UNIT_ZERO;
   return e;
 }
 
 static void
 free_experiment (struct Experiment *e)
 {
+  struct Episode *cur;
+  struct Episode *next;
+
+  next = e->start;
+  for (cur = next; NULL != cur; cur = next)
+  {
+    next = cur->next;
+    GNUNET_free (cur);
+  }
+
   GNUNET_free_non_null (e->name);
   GNUNET_free_non_null (e->cfg_file);
   GNUNET_free (e);
 }
 
+static int
+load_episodes (struct Experiment *e, struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+  int e_counter = 0;
+  char *sec_name;
+  struct GNUNET_TIME_Relative e_duration;
+  struct Episode *cur;
+  struct Episode *last;
+
+  e_counter = 0;
+  last = NULL;
+  while (1)
+  {
+    GNUNET_asprintf(&sec_name, "episode-%u", e_counter);
+    if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time(cfg,
+        sec_name, "duration", &e_duration))
+    {
+      GNUNET_free (sec_name);
+      break;
+    }
+
+    cur = GNUNET_new (struct Episode);
+    cur->duration = e_duration;
+    cur->id = e_counter;
+
+    fprintf (stderr, "Found episode %u with duration %s \n",
+        e_counter,
+        GNUNET_STRINGS_relative_time_to_string(cur->duration, GNUNET_YES));
+
+    /* Update experiment */
+    e->num_episodes ++;
+    e->total_duration = GNUNET_TIME_relative_add(e->total_duration, 
cur->duration);
+    /* Put in linked list */
+    if (NULL == last)
+      e->start = cur;
+    else
+    last->next = cur;
+
+    GNUNET_free (sec_name);
+    e_counter ++;
+    last = cur;
+  }
+  return e_counter;
+}
+
+static void
+timeout_experiment (void *cls, const struct GNUNET_SCHEDULER_TaskContext* tc)
+{
+  struct Experiment *e = cls;
+  e->experiment_timeout_task = GNUNET_SCHEDULER_NO_TASK;
+  fprintf (stderr, "Experiment timeout!\n");
+
+  e->e_done_cb (e, GNUNET_SYSERR);
+}
+
+static void
+timeout_episode (void *cls, const struct GNUNET_SCHEDULER_TaskContext* tc)
+{
+  struct Experiment *e = cls;
+  e->episode_timeout_task = GNUNET_SCHEDULER_NO_TASK;
+  e->ep_done_cb (e->cur);
+
+  /* Scheduling next */
+  e->cur = e->cur->next;
+  if (NULL == e->cur)
+  {
+    /* done */
+    fprintf (stderr, "Last episode done!\n");
+    if (GNUNET_SCHEDULER_NO_TASK != e->experiment_timeout_task)
+    {
+      GNUNET_SCHEDULER_cancel (e->experiment_timeout_task);
+      e->experiment_timeout_task = GNUNET_SCHEDULER_NO_TASK;
+    }
+    e->e_done_cb (e, GNUNET_OK);
+    return;
+  }
+
+  fprintf (stderr, "Running episode %u with timeout %s\n",
+      e->cur->id,
+      GNUNET_STRINGS_relative_time_to_string(e->cur->duration, GNUNET_YES));
+  e->episode_timeout_task = GNUNET_SCHEDULER_add_delayed (e->cur->duration,
+      &timeout_episode, e);
+}
+
+
+void
+GNUNET_ATS_TEST_experimentation_run (struct Experiment *e,
+    GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb,
+    GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb)
+{
+  fprintf (stderr, "Running experiment `%s'  with timeout %s\n", e->name,
+      GNUNET_STRINGS_relative_time_to_string(e->max_duration, GNUNET_YES));
+  e->e_done_cb = e_done_cb;
+  e->ep_done_cb = ep_done_cb;
+
+  /* Start total time out */
+  e->experiment_timeout_task = GNUNET_SCHEDULER_add_delayed (e->max_duration,
+      &timeout_experiment, e);
+
+  /* Start */
+  e->cur = e->start;
+  fprintf (stderr, "Running episode %u with timeout %s\n",
+      e->cur->id,
+      GNUNET_STRINGS_relative_time_to_string(e->cur->duration, GNUNET_YES));
+  e->episode_timeout_task = GNUNET_SCHEDULER_add_delayed (e->cur->duration,
+      &timeout_episode, e);
+
+
+}
+
 struct Experiment *
-GNUNET_ATS_TEST_experimentation_start (char *filename)
+GNUNET_ATS_TEST_experimentation_load (char *filename)
 {
   struct Experiment *e;
   struct GNUNET_CONFIGURATION_Handle *cfg;
@@ -57,7 +178,7 @@
   cfg = GNUNET_CONFIGURATION_create();
   if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, filename))
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to load `%s'\n", filename);
+    fprintf (stderr, "Failed to load `%s'\n", filename);
     GNUNET_CONFIGURATION_destroy (cfg);
     return NULL;
   }
@@ -72,7 +193,7 @@
     return NULL;
   }
   else
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment name: `%s'\n", e->name);
+    fprintf (stderr, "Experiment name: `%s'\n", e->name);
 
   if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_filename (cfg, 
"experiment",
       "cfg_file", &e->cfg_file))
@@ -82,7 +203,7 @@
     return NULL;
   }
   else
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment name: `%s'\n", 
e->cfg_file);
+    fprintf (stderr, "Experiment name: `%s'\n", e->cfg_file);
 
   if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number(cfg, "experiment",
       "masters", &e->num_masters))
@@ -92,7 +213,7 @@
     return NULL;
   }
   else
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment masters: `%llu'\n",
+    fprintf (stderr, "Experiment masters: `%llu'\n",
         e->num_masters);
 
   if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_number(cfg, "experiment",
@@ -103,7 +224,7 @@
     return NULL;
   }
   else
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment slaves: `%llu'\n",
+    fprintf (stderr, "Experiment slaves: `%llu'\n",
         e->num_slaves);
 
   if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_time(cfg, "experiment",
@@ -114,15 +235,26 @@
     return NULL;
   }
   else
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment duration: `%s'\n",
+    fprintf (stderr, "Experiment duration: `%s'\n",
         GNUNET_STRINGS_relative_time_to_string (e->max_duration, GNUNET_YES));
 
+  load_episodes (e, cfg);
+  fprintf (stderr, "Loaded %u episodes with total duration %s\n",
+      e->num_episodes,
+      GNUNET_STRINGS_relative_time_to_string (e->total_duration, GNUNET_YES));
+
+  GNUNET_CONFIGURATION_destroy (cfg);
   return e;
 }
 
 void
 GNUNET_ATS_TEST_experimentation_stop (struct Experiment *e)
 {
+  if (GNUNET_SCHEDULER_NO_TASK != e->experiment_timeout_task)
+  {
+    GNUNET_SCHEDULER_cancel (e->experiment_timeout_task);
+    e->experiment_timeout_task = GNUNET_SCHEDULER_NO_TASK;
+  }
   free_experiment (e);
 }
 

Modified: gnunet/src/ats-tests/ats-testing-log.c
===================================================================
--- gnunet/src/ats-tests/ats-testing-log.c      2014-01-23 12:44:35 UTC (rev 
32016)
+++ gnunet/src/ats-tests/ats-testing-log.c      2014-01-23 14:56:59 UTC (rev 
32017)
@@ -18,14 +18,14 @@
  Boston, MA 02111-1307, USA.
  */
 /**
- * @file ats/perf_ats_logging.c
+ * @file ats-tests/ats-testing-log.c
  * @brief ats benchmark: logging for performance tests
  * @author Christian Grothoff
  * @author Matthias Wachs
  */
 #include "platform.h"
 #include "gnunet_util_lib.h"
-#include "perf_ats.h"
+#include "ats-testing.h"
 
 #define THROUGHPUT_TEMPLATE "#!/usr/bin/gnuplot \n" \
 "set datafile separator ';' \n" \
@@ -70,19 +70,6 @@
 #define LOG_ITEM_ATS_UTIL_DOWN 17
 
 /**
- * Logging task
- */
-static GNUNET_SCHEDULER_TaskIdentifier log_task;
-
-/**
- * Reference to perf_ats' masters
- */
-static int num_peers;
-static int running;
-static char *name;
-static struct GNUNET_TIME_Relative frequency;
-
-/**
  * A single logging time step for a partner
  */
 struct PartnerLoggingTimestep
@@ -238,12 +225,30 @@
   struct PeerLoggingTimestep *tail;
 };
 
-/**
- * Log structure of length num_peers
- */
-static struct LoggingPeer *lp;
+struct LoggingHandle
+{
+  /**
+   * Logging task
+   */
+  GNUNET_SCHEDULER_TaskIdentifier log_task;
 
+  /**
+   * Reference to perf_ats' masters
+   */
+  int num_peers;
+  int running;
+  char *name;
+  struct GNUNET_TIME_Relative frequency;
 
+  /**
+   * Log structure of length num_peers
+   */
+  struct LoggingPeer *lp;
+
+};
+
+
+
 static void
 write_throughput_gnuplot_script (char * fn, struct LoggingPeer *lp)
 {
@@ -397,8 +402,8 @@
 }
 
 
-static void
-write_to_file ()
+void
+GNUNET_ATS_TEST_logging_write_to_file (struct LoggingHandle *l, char *test)
 {
   struct GNUNET_DISK_FileHandle *f;
 
@@ -411,10 +416,10 @@
   int c_m;
   int c_s;
 
-  for (c_m = 0; c_m < num_peers; c_m++)
+  for (c_m = 0; c_m < l->num_peers; c_m++)
   {
-    GNUNET_asprintf (&filename, "%llu_master_%u_%s_%s.data", 
GNUNET_TIME_absolute_get().abs_value_us,
-        lp[c_m].peer->no, GNUNET_i2s(&lp[c_m].peer->id), name);
+    GNUNET_asprintf (&filename, "%s_%llu_master_%u_%s_%s.data", test, 
GNUNET_TIME_absolute_get().abs_value_us,
+        l->lp[c_m].peer->no, GNUNET_i2s(&l->lp[c_m].peer->id), l->name);
 
     f = GNUNET_DISK_file_open (filename,
         GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_CREATE,
@@ -426,16 +431,16 @@
       return;
     }
 
-    for (cur_lt = lp[c_m].head; NULL != cur_lt; cur_lt = cur_lt->next)
+    for (cur_lt = l->lp[c_m].head; NULL != cur_lt; cur_lt = cur_lt->next)
     {
        GNUNET_log(GNUNET_ERROR_TYPE_INFO,
-          "Master [%u]: timestamp %llu %llu ; %u %u %u ; %u %u %u\n", 
lp[c_m].peer->no,
-          cur_lt->timestamp, 
GNUNET_TIME_absolute_get_difference(lp[c_m].start,cur_lt->timestamp).rel_value_us
 / 1000,
+          "Master [%u]: timestamp %llu %llu ; %u %u %u ; %u %u %u\n", 
l->lp[c_m].peer->no,
+          cur_lt->timestamp, 
GNUNET_TIME_absolute_get_difference(l->lp[c_m].start,cur_lt->timestamp).rel_value_us
 / 1000,
           cur_lt->total_messages_sent, cur_lt->total_bytes_sent, 
cur_lt->total_throughput_send,
           cur_lt->total_messages_received, cur_lt->total_bytes_received, 
cur_lt->total_throughput_recv);
 
       slave_string = GNUNET_strdup (";");
-      for (c_s = 0; c_s < lp[c_m].peer->num_partners; c_s++)
+      for (c_s = 0; c_s < l->lp[c_m].peer->num_partners; c_s++)
       {
         plt = &cur_lt->slaves_log[c_s];
         /* Log partners */
@@ -465,7 +470,7 @@
 
       GNUNET_asprintf (&data, "%llu;%llu;%u;%u;%u;%u;%u;%u;;;;;;;;;;;%s\n",
           cur_lt->timestamp,
-          
GNUNET_TIME_absolute_get_difference(lp[c_m].start,cur_lt->timestamp).rel_value_us
 / 1000,
+          
GNUNET_TIME_absolute_get_difference(l->lp[c_m].start,cur_lt->timestamp).rel_value_us
 / 1000,
           cur_lt->total_messages_sent, cur_lt->total_bytes_sent,  
cur_lt->total_throughput_send,
           cur_lt->total_messages_received, cur_lt->total_bytes_received, 
cur_lt->total_throughput_recv,
           slave_string);
@@ -482,9 +487,9 @@
       return;
     }
 
-    write_throughput_gnuplot_script (filename, lp);
-    write_rtt_gnuplot_script (filename, lp);
-    write_bw_gnuplot_script (filename, lp);
+    write_throughput_gnuplot_script (filename, l->lp);
+    write_rtt_gnuplot_script (filename, l->lp);
+    write_bw_gnuplot_script (filename, l->lp);
 
     GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Data file successfully written to log 
file `%s'\n", filename);
     GNUNET_free (filename);
@@ -493,7 +498,7 @@
 
 
 void
-GNUNET_ATS_TEST_logging_now (void)
+GNUNET_ATS_TEST_logging_now (struct LoggingHandle *l)
 {
   struct LoggingPeer *bp;
   struct PeerLoggingTimestep *mlt;
@@ -507,12 +512,12 @@
   unsigned int app_rtt;
   double mult;
 
-  if (GNUNET_YES != running)
+  if (GNUNET_YES != l->running)
     return;
 
-  for (c_m = 0; c_m < num_peers; c_m++)
+  for (c_m = 0; c_m < l->num_peers; c_m++)
   {
-    bp = &lp[c_m];
+    bp = &l->lp[c_m];
     mlt = GNUNET_new (struct PeerLoggingTimestep);
     GNUNET_CONTAINER_DLL_insert_tail(bp->head, bp->tail, mlt);
     prev_log_mlt = mlt->prev;
@@ -530,7 +535,7 @@
     if (NULL == prev_log_mlt)
      {
        /* Get difference to start */
-       delta = GNUNET_TIME_absolute_get_difference (lp[c_m].start, 
mlt->timestamp);
+       delta = GNUNET_TIME_absolute_get_difference (l->lp[c_m].start, 
mlt->timestamp);
      }
      else
      {
@@ -639,75 +644,79 @@
 static void
 collect_log_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  log_task = GNUNET_SCHEDULER_NO_TASK;
+  struct LoggingHandle *l = cls;
+  l->log_task = GNUNET_SCHEDULER_NO_TASK;
 
-  GNUNET_ATS_TEST_logging_now();
+  GNUNET_ATS_TEST_logging_now (l);
 
   if (tc->reason == GNUNET_SCHEDULER_REASON_SHUTDOWN)
     return;
 
-  log_task = GNUNET_SCHEDULER_add_delayed (frequency,
-      &collect_log_task, NULL);
+  l->log_task = GNUNET_SCHEDULER_add_delayed (l->frequency,
+      &collect_log_task, l);
 }
 
 
 void
-GNUNET_ATS_TEST_logging_stop (void)
+GNUNET_ATS_TEST_logging_stop (struct LoggingHandle *l)
 {
   int c_m;
   struct GNUNET_SCHEDULER_TaskContext tc;
   struct PeerLoggingTimestep *cur;
 
-  if (GNUNET_YES!= running)
+  if (GNUNET_YES!= l->running)
     return;
 
-  if (GNUNET_SCHEDULER_NO_TASK != log_task)
-    GNUNET_SCHEDULER_cancel (log_task);
-  log_task = GNUNET_SCHEDULER_NO_TASK;
+  if (GNUNET_SCHEDULER_NO_TASK != l->log_task)
+    GNUNET_SCHEDULER_cancel (l->log_task);
+  l->log_task = GNUNET_SCHEDULER_NO_TASK;
   tc.reason = GNUNET_SCHEDULER_REASON_SHUTDOWN;
-  collect_log_task (NULL, &tc);
+  collect_log_task (l, &tc);
 
   GNUNET_log(GNUNET_ERROR_TYPE_INFO,
       _("Stop logging\n"));
 
-  write_to_file ();
 
-  for (c_m = 0; c_m < num_peers; c_m++)
+  for (c_m = 0; c_m < l->num_peers; c_m++)
   {
-    while (NULL != (cur = lp[c_m].head))
+    while (NULL != (cur = l->lp[c_m].head))
     {
-      GNUNET_CONTAINER_DLL_remove (lp[c_m].head, lp[c_m].tail, cur);
+      GNUNET_CONTAINER_DLL_remove (l->lp[c_m].head, l->lp[c_m].tail, cur);
       GNUNET_free (cur->slaves_log);
       GNUNET_free (cur);
     }
   }
 
-  GNUNET_free (lp);
+  GNUNET_free (l->lp);
+  GNUNET_free (l);
 }
 
-void
+struct LoggingHandle *
 GNUNET_ATS_TEST_logging_start (struct GNUNET_TIME_Relative log_frequency,
     char * testname, struct BenchmarkPeer *masters, int num_masters)
 {
+  struct LoggingHandle *l;
   int c_m;
   GNUNET_log(GNUNET_ERROR_TYPE_INFO,
       _("Start logging `%s'\n"), testname);
 
-  num_peers = num_masters;
-  name = testname;
-  frequency = log_frequency;
+  l = GNUNET_new (struct LoggingHandle);
+  l->num_peers = num_masters;
+  l->name = testname;
+  l->frequency = log_frequency;
+  l->lp = GNUNET_malloc (num_masters * sizeof (struct LoggingPeer));
 
-  lp = GNUNET_malloc (num_masters * sizeof (struct LoggingPeer));
-
   for (c_m = 0; c_m < num_masters; c_m ++)
   {
-    lp[c_m].peer = &masters[c_m];
-    lp[c_m].start = GNUNET_TIME_absolute_get();
+    l->lp[c_m].peer = &masters[c_m];
+    l->lp[c_m].start = GNUNET_TIME_absolute_get();
   }
 
   /* Schedule logging task */
-  log_task = GNUNET_SCHEDULER_add_now (&collect_log_task, NULL);
-  running = GNUNET_YES;
+  l->log_task = GNUNET_SCHEDULER_add_now (&collect_log_task, l);
+  l->running = GNUNET_YES;
+
+  return l;
 }
-/* end of file perf_ats_logging.c */
+/* end of file ats-testing-log.c */
 

Modified: gnunet/src/ats-tests/ats-testing.c
===================================================================
--- gnunet/src/ats-tests/ats-testing.c  2014-01-23 12:44:35 UTC (rev 32016)
+++ gnunet/src/ats-tests/ats-testing.c  2014-01-23 14:56:59 UTC (rev 32017)
@@ -19,7 +19,7 @@
  */
 /**
  * @file ats-tests/ats-testing.c
- * @brief ats testing library: setup topology and provide logging to test ats
+ * @brief ats testing library: setup topology
  * solvers
  * @author Christian Grothoff
  * @author Matthias Wachs
@@ -65,9 +65,6 @@
   int c_op;
   struct BenchmarkPeer *p;
 
-  if (GNUNET_YES == top->logging)
-    GNUNET_ATS_TEST_logging_stop ();
-
   top->shutdown_task = GNUNET_SCHEDULER_NO_TASK;
   top->state.benchmarking = GNUNET_NO;
 
@@ -544,10 +541,13 @@
 }
 
 static void
-ats_performance_info_cb (void *cls, const struct GNUNET_HELLO_Address *address,
-    int address_active, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
+ats_performance_info_cb (void *cls,
+    const struct GNUNET_HELLO_Address *address,
+    int address_active,
+    struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
     struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
-    const struct GNUNET_ATS_Information *ats, uint32_t ats_count)
+    const struct GNUNET_ATS_Information *ats,
+    uint32_t ats_count)
 {
   struct BenchmarkPeer *me = cls;
   struct BenchmarkPartner *p;
@@ -630,10 +630,8 @@
          break;
      }
    }
-   if ((GNUNET_YES == top->logging) && (GNUNET_YES == log))
-     GNUNET_ATS_TEST_logging_now();
-
-  top->ats_perf_cb (cls, address, address_active, bandwidth_out, bandwidth_in,
+  if (GNUNET_YES == log)
+    top->ats_perf_cb (cls, address, address_active, bandwidth_out, 
bandwidth_in,
       ats, ats_count);
   GNUNET_free(peer_id);
 }
@@ -843,10 +841,10 @@
     unsigned int num_slaves,
     unsigned int num_masters,
     int test_core,
-    GNUNET_ATS_TESTING_TopologySetupDoneCallback done_cb,
+    GNUNET_ATS_TEST_TopologySetupDoneCallback done_cb,
     void *done_cb_cls,
     GNUNET_TRANSPORT_ReceiveCallback transport_recv_cb,
-    GNUNET_ATS_AddressInformationCallback ats_perf_cb)
+    GNUNET_ATS_AddressInformationCallback log_request_cb)
 {
 
   static struct GNUNET_CORE_MessageHandler handlers[] = {
@@ -862,7 +860,7 @@
   top->done_cb_cls = done_cb_cls;
   top->test_core = test_core;
   top->transport_recv_cb = transport_recv_cb;
-  top->ats_perf_cb = ats_perf_cb;
+  top->ats_perf_cb = log_request_cb;
 
   top->mps = GNUNET_malloc (num_masters * sizeof (struct BenchmarkPeer));
   top->sps = GNUNET_malloc (num_slaves * sizeof (struct BenchmarkPeer));

Modified: gnunet/src/ats-tests/ats-testing.h
===================================================================
--- gnunet/src/ats-tests/ats-testing.h  2014-01-23 12:44:35 UTC (rev 32016)
+++ gnunet/src/ats-tests/ats-testing.h  2014-01-23 14:56:59 UTC (rev 32017)
@@ -39,11 +39,19 @@
 struct BenchmarkPeer;
 struct GNUNET_ATS_TEST_Topology;
 struct TrafficGenerator;
+struct LoggingHandle;
 
-typedef void (*GNUNET_ATS_TESTING_TopologySetupDoneCallback) (void *cls,
+typedef void (*GNUNET_ATS_TEST_TopologySetupDoneCallback) (void *cls,
     struct BenchmarkPeer *masters,
     struct BenchmarkPeer *slaves);
 
+typedef void
+(*GNUNET_ATS_TEST_LogRequest) (void *cls,
+    const struct GNUNET_HELLO_Address *address, int address_active,
+    struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
+    struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
+    const struct GNUNET_ATS_Information *ats, uint32_t ats_count);
+
 /**
  * Information we track for a peer in the testbed.
  */
@@ -309,11 +317,6 @@
    */
   int result;
 
-  /**
-   * Test result logging
-   */
-  int logging;
-
   /**Test core (GNUNET_YES) or transport (GNUNET_NO)
    */
   int test_core;
@@ -377,11 +380,22 @@
 
   GNUNET_TRANSPORT_ReceiveCallback transport_recv_cb;
 
-  GNUNET_ATS_TESTING_TopologySetupDoneCallback done_cb;
+  GNUNET_ATS_TEST_TopologySetupDoneCallback done_cb;
   GNUNET_ATS_AddressInformationCallback ats_perf_cb;
   void *done_cb_cls;
 };
 
+struct Experiment;
+
+struct Episode;
+
+typedef void (*GNUNET_ATS_TESTING_EpisodeDoneCallback) (
+    struct Episode *e);
+
+typedef void (*GNUNET_ATS_TESTING_ExperimentDoneCallback) (
+    struct Experiment *e, int success);
+
+
 struct Experiment
 {
   char *name;
@@ -389,10 +403,33 @@
   unsigned long long int num_masters;
   unsigned long long int num_slaves;
   struct GNUNET_TIME_Relative max_duration;
+  struct GNUNET_TIME_Relative total_duration;
+  struct GNUNET_TIME_Absolute start_time;
+  unsigned int num_episodes;
+  struct Episode *start;
+
+  GNUNET_SCHEDULER_TaskIdentifier experiment_timeout_task;
+  GNUNET_SCHEDULER_TaskIdentifier episode_timeout_task;
+  struct Episode *cur;
+
+  GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb;
+  GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb;
 };
 
+struct Episode
+{
+  int id;
+  struct Episode *next;
+  struct GNUNET_TIME_Relative duration;
+};
+
+void
+GNUNET_ATS_TEST_experimentation_run (struct Experiment *e,
+    GNUNET_ATS_TESTING_EpisodeDoneCallback ep_done_cb,
+    GNUNET_ATS_TESTING_ExperimentDoneCallback e_done_cb);
+
 struct Experiment *
-GNUNET_ATS_TEST_experimentation_start (char *filename);
+GNUNET_ATS_TEST_experimentation_load (char *filename);
 
 void
 GNUNET_ATS_TEST_experimentation_stop (struct Experiment *e);
@@ -415,7 +452,7 @@
 /**
  * Start logging
  */
-void
+struct LoggingHandle *
 GNUNET_ATS_TEST_logging_start (struct GNUNET_TIME_Relative log_frequency,
     char * testname, struct BenchmarkPeer *masters, int num_masters);
 
@@ -423,14 +460,16 @@
  * Stop logging
  */
 void
-GNUNET_ATS_TEST_logging_stop (void);
+GNUNET_ATS_TEST_logging_stop (struct LoggingHandle *);
 
 /**
  * Log all data now
  */
 void
-GNUNET_ATS_TEST_logging_now (void);
+GNUNET_ATS_TEST_logging_now (struct LoggingHandle *);
 
+void
+GNUNET_ATS_TEST_logging_write_to_file (struct LoggingHandle *, char *test);
 
 void
 GNUNET_ATS_TEST_traffic_handle_ping (struct BenchmarkPartner *p);
@@ -444,10 +483,10 @@
     unsigned int num_slaves,
     unsigned int num_masters,
     int test_core,
-    GNUNET_ATS_TESTING_TopologySetupDoneCallback done_cb,
+    GNUNET_ATS_TEST_TopologySetupDoneCallback done_cb,
     void *done_cb_cls,
     GNUNET_TRANSPORT_ReceiveCallback transport_recv_cb,
-    GNUNET_ATS_AddressInformationCallback ats_perf_cb);
+    GNUNET_ATS_TEST_LogRequest ats_perf_cb);
 
 void
 GNUNET_ATS_TEST_shutdown_topology (void);

Modified: gnunet/src/ats-tests/gnunet-ats-sim.c
===================================================================
--- gnunet/src/ats-tests/gnunet-ats-sim.c       2014-01-23 12:44:35 UTC (rev 
32016)
+++ gnunet/src/ats-tests/gnunet-ats-sim.c       2014-01-23 14:56:59 UTC (rev 
32017)
@@ -37,9 +37,11 @@
 static struct BenchmarkPeer *masters_p;
 static struct BenchmarkPeer *slaves_p;
 
+GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+
 struct Experiment *e;
+struct LoggingHandle *l;
 
-
 static void
 evaluate ()
 {
@@ -105,8 +107,12 @@
 static void
 do_shutdown ()
 {
-  /* Shutdown a topology with */
-  evaluate ();
+  /* timeout */
+  if (NULL != e)
+  {
+    GNUNET_ATS_TEST_experimentation_stop (e);
+    e = NULL;
+  }
   GNUNET_ATS_TEST_shutdown_topology ();
 }
 
@@ -119,14 +125,47 @@
 }
 
 static void
-ats_performance_info_cb (void *cls, const struct GNUNET_HELLO_Address *address,
+log_request__cb (void *cls, const struct GNUNET_HELLO_Address *address,
     int address_active, struct GNUNET_BANDWIDTH_Value32NBO bandwidth_out,
     struct GNUNET_BANDWIDTH_Value32NBO bandwidth_in,
     const struct GNUNET_ATS_Information *ats, uint32_t ats_count)
 {
+  if (NULL != l)
+    GNUNET_ATS_TEST_logging_now (l);
+}
 
+static void
+experiment_done_cb (struct Experiment *e, int success)
+{
+  if (GNUNET_OK == success)
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment `%s' done successful\n", 
e->name);
+  else
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Experiment `%s' failed \n", e->name);
+  if (GNUNET_SCHEDULER_NO_TASK != timeout_task)
+  {
+    GNUNET_SCHEDULER_cancel (timeout_task);
+    timeout_task = GNUNET_SCHEDULER_NO_TASK;
+  }
+  /* Stop logging */
+  GNUNET_ATS_TEST_logging_stop (l);
+  evaluate ();
+
+  /* Stop traffic generation */
+  GNUNET_ATS_TEST_generate_traffic_stop_all();
+  /* Clean up experiment */
+  GNUNET_ATS_TEST_experimentation_stop (e);
+  e = NULL;
+
+  /* Shutdown topology */
+  GNUNET_ATS_TEST_shutdown_topology ();
 }
 
+static void
+episode_done_cb (struct Episode *ep)
+{
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Episode %u done\n", ep->id);
+}
+
 static void topology_setup_done (void *cls,
     struct BenchmarkPeer *masters,
     struct BenchmarkPeer *slaves)
@@ -138,25 +177,31 @@
   masters_p = masters;
   slaves_p = slaves;
 
+  l = GNUNET_ATS_TEST_logging_start (GNUNET_TIME_UNIT_SECONDS, e->name,
+      masters_p, e->num_masters);
+  GNUNET_ATS_TEST_experimentation_run (e, &episode_done_cb, 
&experiment_done_cb);
+
   for (c_m = 0; c_m < e->num_masters; c_m++)
   {
       for (c_s = 0; c_s < e->num_slaves; c_s++)
       {
         /* Generate maximum traffic to all peers */
-        fprintf (stderr, "c_m %u c_s %u\n", c_m, c_s);
         GNUNET_ATS_TEST_generate_traffic_start (&masters[c_m],
             &masters[c_m].partners[c_s],
             10000,
             GNUNET_TIME_UNIT_FOREVER_REL);
       }
   }
-  GNUNET_SCHEDULER_add_delayed (TEST_TIMEOUT, &do_shutdown, NULL);
+
+  timeout_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_add 
(GNUNET_TIME_UNIT_MINUTES,
+      e->max_duration), &do_shutdown, NULL);
 }
 
 
 int
 main (int argc, char *argv[])
 {
+  GNUNET_log_setup("gnunet-ats-sim", "INFO", NULL);
   if (argc < 2)
   {
     fprintf (stderr, "No experiment given...\n");
@@ -164,15 +209,18 @@
   }
 
   fprintf (stderr, "Loading experiment `%s' \n", argv[1]);
-  e = GNUNET_ATS_TEST_experimentation_start (argv[1]);
+  e = GNUNET_ATS_TEST_experimentation_load (argv[1]);
   if (NULL == e)
   {
     fprintf (stderr, "Invalid experiment\n");
     return 1;
   }
+  if (0 == e->num_episodes)
+  {
+    fprintf (stderr, "No episodes included\n");
+    return 1;
+  }
 
-  fprintf (stderr, "%llu %llu\n", e->num_masters, e->num_slaves);
-
   /* Setup a topology with */
   GNUNET_ATS_TEST_create_topology ("gnunet-ats-sim", e->cfg_file,
       e->num_slaves,
@@ -181,7 +229,7 @@
       &topology_setup_done,
       NULL,
       &transport_recv_cb,
-      &ats_performance_info_cb);
+      &log_request__cb);
   return 0;
 }
 /* end of file gnunet-ats-sim.c */




reply via email to

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