- sync wait period with deamon
[oweals/gnunet.git] / src / regex / gnunet-regex-profiler.c
index 991cd40f308dd3f4fedce841a2fb50b92ebb5544..83b8ec50f0d36e0222abde11f545f27d3d53fab8 100644 (file)
 #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
@@ -146,7 +141,7 @@ struct RegexPeer
   char *policy_file;
 
   /**
-   * Peers search string.
+   * Peer's search string.
    */
   const char *search_str;
 
@@ -354,7 +349,7 @@ static unsigned int peers_found;
 /**
  * Index of peer to start next announce/search..
  */
-static unsigned int search_index;
+static unsigned int next_search;
 
 /**
  * Search task identifier
@@ -398,6 +393,11 @@ static unsigned int max_path_compression;
  */
 static char * regex_prefix;
 
+/**
+ * What's the maximum regex reannounce period.
+ */
+static struct GNUNET_TIME_Relative reannounce_period_max;
+
 
 /******************************************************************************/
 /******************************  DECLARATIONS  ********************************/
@@ -571,7 +571,7 @@ do_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   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 */
 }
 
 
@@ -713,13 +713,13 @@ stats_cb (void *cls,
   {
     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);
   }
 }
 
@@ -754,12 +754,12 @@ stats_connect_cb (void *cls,
   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);
   }
 }
 
@@ -780,13 +780,13 @@ do_collect_stats (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 
   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);
 }
 
 
@@ -843,7 +843,7 @@ regex_found_handler (void *cls,
   {
     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)
@@ -971,7 +971,6 @@ find_string (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
       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,
@@ -1010,8 +1009,7 @@ arm_ca (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
   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;
 }
@@ -1032,7 +1030,7 @@ arm_da (void *cls, void *op_result)
 
   if (NULL != peer->arm_handle)
   {
-    GNUNET_ARM_disconnect (peer->arm_handle);
+    GNUNET_ARM_disconnect_and_free (peer->arm_handle);
     peer->arm_handle = NULL;
   }
 }
@@ -1091,10 +1089,12 @@ arm_start_cb (void *cls, struct GNUNET_ARM_Handle *arm,
     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,
@@ -1103,20 +1103,19 @@ arm_start_cb (void *cls, struct GNUNET_ARM_Handle *arm,
         {
           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,
@@ -1153,6 +1152,7 @@ arm_connect_cb (void *cls, struct GNUNET_TESTBED_Operation *op,
   }
 
   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);
 
@@ -1173,22 +1173,16 @@ arm_connect_cb (void *cls, struct GNUNET_TESTBED_Operation *op,
 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);
   }
 }
 
@@ -1202,20 +1196,24 @@ do_announce (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 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++;
 }
 
 /**
@@ -1640,7 +1638,7 @@ controller_event_cb (void *cls,
      {
        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));
@@ -2014,7 +2012,7 @@ run (void *cls, char *const *args, const char *cfgfile,
 
   if (GNUNET_OK !=
       GNUNET_CONFIGURATION_get_value_string (config, "REGEXPROFILER", "REGEX_PREFIX",
-                                            &regex_prefix))
+                                             &regex_prefix))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 _("Configuration option \"regex_prefix\" missing. Exiting\n"));
@@ -2065,10 +2063,20 @@ run (void *cls, char *const *args, const char *cfgfile,
     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,