- sync wait period with deamon
[oweals/gnunet.git] / src / regex / gnunet-regex-profiler.c
index ea6fd6fdcc50ed08504d103587eab301cfe64c6c..83b8ec50f0d36e0222abde11f545f27d3d53fab8 100644 (file)
@@ -38,8 +38,6 @@
 
 #define FIND_TIMEOUT \
         GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 90)
-#define ANNOUNCE_TIME \
-        GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 200)
 #define SEARCHES_IN_PARALLEL 100
 
 /**
@@ -143,7 +141,7 @@ struct RegexPeer
   char *policy_file;
 
   /**
-   * Peers search string.
+   * Peer's search string.
    */
   const char *search_str;
 
@@ -351,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
@@ -395,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  ********************************/
@@ -1006,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;
 }
@@ -1028,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;
   }
 }
@@ -1089,7 +1091,10 @@ arm_start_cb (void *cls, struct GNUNET_ARM_Handle *arm,
 
       {
         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,
@@ -1098,14 +1103,16 @@ 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 (ANNOUNCE_TIME,
+        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);
       }
-      if (search_index == (num_peers - 1) &&
+      if (next_search >= num_peers &&
           GNUNET_SCHEDULER_NO_TASK == search_timeout_task)
       {
         GNUNET_log (GNUNET_ERROR_TYPE_INFO, "All daemons started.\n");
@@ -1145,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);
 
@@ -1189,22 +1197,22 @@ static void
 announce_next_regex (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) ||
-      search_index >= num_peers)
+            next_search >= num_peers)
     return;
 
   /* 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", search_index);
-  peers[search_index].op_handle =
+  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]);
-  search_index++;
+                                    &peers[next_search]);
+  next_search++;
   parallel_searches++;
 }
 
@@ -2055,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,