fixing EXTRA_DIST issues'
[oweals/gnunet.git] / src / rps / gnunet-rps-profiler.c
index 79f0fbe2f4e7605d354caa6d9f78a90a39971736..36a167203978d9fdc532dd9bf776e04b5d9b5c3b 100644 (file)
@@ -14,6 +14,8 @@
     
      You should have received a copy of the GNU Affero General Public License
      along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
 */
 /**
  * @file rps/test_rps.c
@@ -83,14 +85,28 @@ enum STAT_TYPE
   STAT_TYPE_BLOCKS_NO_PUSH_NO_PULL,   /*   6 */
   STAT_TYPE_ISSUED_PUSH_SEND,         /*   7 */
   STAT_TYPE_ISSUED_PULL_REQ,          /*   8 */
-  STAT_TYPE_ISSUED_PULL_REP,          /*  9 */
-  STAT_TYPE_SENT_PUSH_SEND,           /*  10 */
-  STAT_TYPE_SENT_PULL_REQ,            /*  11 */
-  STAT_TYPE_SENT_PULL_REP,            /*  12 */
-  STAT_TYPE_RECV_PUSH_SEND,           /*  13 */
-  STAT_TYPE_RECV_PULL_REQ,            /*  14 */
-  STAT_TYPE_RECV_PULL_REP,            /*  15 */
-  STAT_TYPE_MAX,                      /*  16 */
+  STAT_TYPE_ISSUED_PULL_REQ_MH,       /*   9 */
+  STAT_TYPE_ISSUED_PULL_REP,          /*  10 */
+  STAT_TYPE_SENT_PUSH_SEND,           /*  11 */
+  STAT_TYPE_SENT_PULL_REQ,            /*  12 */
+  STAT_TYPE_SENT_PULL_REQ_MH,         /*  13 */
+  STAT_TYPE_SENT_PULL_REP,            /*  14 */
+  STAT_TYPE_RECV_PUSH_SEND,           /*  15 */
+  STAT_TYPE_RECV_PULL_REQ,            /*  16 */
+  STAT_TYPE_RECV_PULL_REQ_MH,         /*  17 */
+  STAT_TYPE_RECV_PULL_REP,            /*  18 */
+  STAT_TYPE_RECV_PULL_REP_MH,         /*  19 */
+  STAT_TYPE_VIEW_SIZE,                /*  20 */
+  STAT_TYPE_KNOWN_PEERS,              /*  21 */
+  STAT_TYPE_VALID_PEERS,              /*  22 */
+  STAT_TYPE_LEARND_PEERS,             /*  23 */
+  STAT_TYPE_PENDING_ONLINE_CHECKS,    /*  24 */
+  STAT_TYPE_UNREQUESTED_PULL_REPLIES, /*  25 */
+  STAT_TYPE_PEERS_IN_PUSH_MAP,        /*  26 */
+  STAT_TYPE_PEERS_IN_PULL_MAP,        /*  27 */
+  STAT_TYPE_PEERS_IN_VIEW,            /*  28 */
+  STAT_TYPE_VIEW_SIZE_AIM,            /*  29 */
+  STAT_TYPE_MAX,                      /*  30 */
 };
 
 static char* stat_type_strings[] = {
@@ -103,13 +119,27 @@ static char* stat_type_strings[] = {
   "# rounds blocked - no pushes, no pull replies",
   "# push send issued",
   "# pull request send issued",
+  "# pull request send issued (multi-hop peer)",
   "# pull reply send issued",
   "# pushes sent",
   "# pull requests sent",
+  "# pull requests sent (multi-hop peer)",
   "# pull replys sent",
   "# push message received",
   "# pull request message received",
+  "# pull request message received (multi-hop peer)",
   "# pull reply messages received",
+  "# pull reply messages received (multi-hop peer)",
+  "view size",
+  "# known peers",
+  "# valid peers",
+  "# learnd peers",
+  "# pending online checks",
+  "# unrequested pull replies",
+  "# peers in push map at end of round",
+  "# peers in pull map at end of round",
+  "# peers in view at end of round",
+  "view size aim",
 };
 
 struct STATcls
@@ -182,6 +212,12 @@ enum STAT_TYPE stat_str_2_type (const char *stat_str)
   {
     return STAT_TYPE_ISSUED_PULL_REQ;
   }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_ISSUED_PULL_REQ_MH],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_ISSUED_PULL_REQ_MH])))
+  {
+    return STAT_TYPE_ISSUED_PULL_REQ_MH;
+  }
   else if (0 == strncmp (stat_type_strings[STAT_TYPE_ISSUED_PULL_REP],
                          stat_str,
                          strlen (stat_type_strings[STAT_TYPE_ISSUED_PULL_REP])))
@@ -200,6 +236,12 @@ enum STAT_TYPE stat_str_2_type (const char *stat_str)
   {
     return STAT_TYPE_SENT_PULL_REQ;
   }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_SENT_PULL_REQ_MH],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_SENT_PULL_REQ_MH])))
+  {
+    return STAT_TYPE_SENT_PULL_REQ_MH;
+  }
   else if (0 == strncmp (stat_type_strings[STAT_TYPE_SENT_PULL_REP],
                          stat_str,
                          strlen (stat_type_strings[STAT_TYPE_SENT_PULL_REP])))
@@ -218,12 +260,84 @@ enum STAT_TYPE stat_str_2_type (const char *stat_str)
   {
     return STAT_TYPE_RECV_PULL_REQ;
   }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_RECV_PULL_REQ_MH],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_RECV_PULL_REQ_MH])))
+  {
+    return STAT_TYPE_RECV_PULL_REQ_MH;
+  }
   else if (0 == strncmp (stat_type_strings[STAT_TYPE_RECV_PULL_REP],
                          stat_str,
                          strlen (stat_type_strings[STAT_TYPE_RECV_PULL_REP])))
   {
     return STAT_TYPE_RECV_PULL_REP;
   }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_RECV_PULL_REP_MH],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_RECV_PULL_REP_MH])))
+  {
+    return STAT_TYPE_RECV_PULL_REP_MH;
+  }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_VIEW_SIZE],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_VIEW_SIZE])))
+  {
+    return STAT_TYPE_VIEW_SIZE;
+  }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_KNOWN_PEERS],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_KNOWN_PEERS])))
+  {
+    return STAT_TYPE_KNOWN_PEERS;
+  }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_VALID_PEERS],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_VALID_PEERS])))
+  {
+    return STAT_TYPE_VALID_PEERS;
+  }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_LEARND_PEERS],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_LEARND_PEERS])))
+  {
+    return STAT_TYPE_LEARND_PEERS;
+  }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_PENDING_ONLINE_CHECKS],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_PENDING_ONLINE_CHECKS])))
+  {
+    return STAT_TYPE_PENDING_ONLINE_CHECKS;
+  }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_UNREQUESTED_PULL_REPLIES],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_UNREQUESTED_PULL_REPLIES])))
+  {
+    return STAT_TYPE_UNREQUESTED_PULL_REPLIES;
+  }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_PEERS_IN_PUSH_MAP],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_PEERS_IN_PUSH_MAP])))
+  {
+    return STAT_TYPE_PEERS_IN_PUSH_MAP;
+  }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_PEERS_IN_PULL_MAP],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_PEERS_IN_PULL_MAP])))
+  {
+    return STAT_TYPE_PEERS_IN_PULL_MAP;
+  }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_PEERS_IN_VIEW],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_PEERS_IN_VIEW])))
+  {
+    return STAT_TYPE_PEERS_IN_VIEW;
+  }
+  else if (0 == strncmp (stat_type_strings[STAT_TYPE_VIEW_SIZE_AIM],
+                         stat_str,
+                         strlen (stat_type_strings[STAT_TYPE_VIEW_SIZE_AIM])))
+  {
+    return STAT_TYPE_VIEW_SIZE_AIM;
+  }
   return STAT_TYPE_MAX;
 }
 
@@ -475,11 +589,6 @@ static struct GNUNET_PeerIdentity *rps_peer_ids;
  */
 static struct GNUNET_PeerIdentity *target_peer;
 
-/**
- * ID of the peer that requests for the evaluation.
- */
-static struct RPSPeer *eval_peer;
-
 /**
  * Number of online peers.
  */
@@ -914,6 +1023,7 @@ cancel_request (struct PendingReply *pending_rep)
   rps_peer->num_pending_reps--;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Cancelling rps get reply\n");
+  GNUNET_assert (NULL != pending_rep->req_handle);
   GNUNET_RPS_request_cancel (pending_rep->req_handle);
   GNUNET_free (pending_rep);
 }
@@ -994,6 +1104,7 @@ shutdown_op (void *cls)
   {
     clean_peer (i);
   }
+  close_all_files();
 }
 
 static void
@@ -1019,8 +1130,8 @@ post_test_op (void *cls)
 
   post_test_task = NULL;
   post_test = GNUNET_YES;
-  GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-              "Post test task scheduled.\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Executing post test op.\n");
   if (NULL != churn_task)
   {
     GNUNET_SCHEDULER_cancel (churn_task);
@@ -1028,10 +1139,15 @@ post_test_op (void *cls)
   }
   for (i = 0; i < num_peers; i++)
   {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Executing post test op. (peer %" PRIu32 ")\n",
+                rps_peers[i].index);
     if (NULL != rps_peers[i].op)
     {
       GNUNET_TESTBED_operation_done (rps_peers[i].op);
       rps_peers[i].op = NULL;
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "Cancelled testbed operation\n");
     }
     if (NULL != cur_test_run.post_test)
     {
@@ -1293,7 +1409,11 @@ rps_disconnect_adapter (void *cls,
       cancel_request (pending_rep);
     }
     GNUNET_assert (h == peer->rps_handle);
-    GNUNET_RPS_disconnect (h);
+    if (NULL != h)
+    {
+      GNUNET_RPS_disconnect (h);
+      h = NULL;
+    }
     peer->rps_handle = NULL;
   }
 }
@@ -1762,12 +1882,7 @@ churn (void *cls)
  */
 static void profiler_init_peer (struct RPSPeer *rps_peer)
 {
-  if (num_peers - 1 == rps_peer->index)
-  {
-    rps_peer->num_ids_to_request = cur_test_run.num_requests;
-  } else {
-    rps_peer->num_ids_to_request = 0;
-  }
+  rps_peer->num_ids_to_request = cur_test_run.num_requests;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "peer shall request %i peers\n",
               rps_peer->num_ids_to_request);
 }
@@ -1787,19 +1902,33 @@ profiler_reply_handle (void *cls,
 {
   struct RPSPeer *rps_peer;
   struct RPSPeer *rcv_rps_peer;
-  char *file_name;
-  char *file_name_dh;
-  char *file_name_dhr;
-  char *file_name_dhru;
+  char file_name_buf[128];
+  char file_name_dh_buf[128];
+  char file_name_dhr_buf[128];
+  char file_name_dhru_buf[128];
+  char *file_name = file_name_buf;
+  char *file_name_dh = file_name_dh_buf;
+  char *file_name_dhr = file_name_dhr_buf;
+  char *file_name_dhru = file_name_dhru_buf;
   unsigned int i;
   struct PendingReply *pending_rep = (struct PendingReply *) cls;
 
+  pending_rep->req_handle = NULL;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "profiler_reply_handle()\n");
   rps_peer = pending_rep->rps_peer;
-  file_name = "/tmp/rps/received_ids";
-  file_name_dh = "/tmp/rps/diehard_input";
-  file_name_dhr = "/tmp/rps/diehard_input_raw";
-  file_name_dhru = "/tmp/rps/diehard_input_raw_aligned";
+  (void) GNUNET_asprintf (&file_name,
+                                       "/tmp/rps/received_ids-%u",
+                                       rps_peer->index);
+
+  (void) GNUNET_asprintf (&file_name_dh,
+                                       "/tmp/rps/diehard_input-%u",
+                                       rps_peer->index);
+  (void) GNUNET_asprintf (&file_name_dhr,
+                                       "/tmp/rps/diehard_input_raw-%u",
+                                       rps_peer->index);
+  (void) GNUNET_asprintf (&file_name_dhru,
+                                       "/tmp/rps/diehard_input_raw_aligned-%u",
+                                       rps_peer->index);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "[%s] got %" PRIu64 " peers:\n",
               GNUNET_i2s (rps_peer->peer_id),
@@ -1818,6 +1947,7 @@ profiler_reply_handle (void *cls,
     tofile (file_name_dh,
              "%" PRIu32 "\n",
              (uint32_t) rcv_rps_peer->index);
+#ifdef TO_FILE
     to_file_raw (file_name_dhr,
                 (char *) &rcv_rps_peer->index,
                  sizeof (uint32_t));
@@ -1825,6 +1955,7 @@ profiler_reply_handle (void *cls,
                           (char *) &rcv_rps_peer->index,
                            sizeof (uint32_t),
                            bits_needed);
+#endif /* TO_FILE */
   }
   default_reply_handle (cls, n, recv_peers);
 }
@@ -1855,7 +1986,7 @@ profiler_cb (struct RPSPeer *rps_peer)
   /* Only request peer ids at one peer.
    * (It's the before-last because last one is target of the focussed attack.)
    */
-  if (eval_peer == rps_peer)
+  if (0 < rps_peer->num_ids_to_request)
     schedule_missing_requests (rps_peer);
 }
 
@@ -1868,7 +1999,7 @@ profiler_cb (struct RPSPeer *rps_peer)
  *  #GNUNET_NO to stop iteration with no error,
  *  #GNUNET_SYSERR to abort iteration with error!
  */
-int
+static int
 file_name_cb (void *cls, const char *filename)
 {
   if (NULL != strstr (filename, "sampler_el"))
@@ -1900,14 +2031,16 @@ file_name_cb (void *cls, const char *filename)
  *
  * Compute all perfect samples.
  */
-int
+static int
 profiler_eval (void)
 {
+#ifdef TO_FILE
   /* Compute perfect sample for each sampler element */
   if (-1 == GNUNET_DISK_directory_scan ("/tmp/rps/", file_name_cb, NULL))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Scan of directory failed\n");
   }
+#endif /* TO_FILE */
 
   return evaluate ();
 }
@@ -1925,8 +2058,8 @@ static uint32_t binom (uint32_t n, uint32_t k)
 {
   //GNUNET_assert (n >= k);
   if (k > n) return 0;
-  if (0 > n) return 0; /* just for clarity - always false */
-  if (0 > k) return 0; /* just for clarity - always false */
+  /* if (0 > n) return 0;  - always false */
+  /* if (0 > k) return 0;  - always false */
   if (0 == k) return 1;
   return fac (n)
     /
@@ -2324,13 +2457,23 @@ void write_final_stats (void){
   for (uint32_t i = 0; i < num_peers; i++)
   {
     to_file ("/tmp/rps/final_stats.csv",
-             "%" PRIu32 ", " /* index */
+             "%" PRIu32 ", " /* index */
              "%s, %" /* id */
              PRIu64 ", %" /* rounds */
              PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" /* blocking */
-             PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" /* issued */
-             PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" /* sent */
-             PRIu64 ", %" PRIu64 ", %" PRIu64 /* recv */,
+             PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" /* issued */
+             PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" /* sent */
+             PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" /* recv */
+             PRIu64 ", %" /* view size */
+             PRIu64 ", %" /* known peers */
+             PRIu64 ", %" /* valid peers */
+             PRIu64 ", %" /* learned peers */
+             PRIu64 ", %" /* pending online checks */
+             PRIu64 ", %" /* unrequested pull replies */
+             PRIu64 ", %" /* peers in push map */
+             PRIu64 ", %" /* peers in pull map */
+             PRIu64 ", %" /* peers in view */
+             PRIu64 "\n"/* view size aim */,
              i,
              GNUNET_i2s (rps_peers[i].peer_id),
              rps_peers[i].stats[STAT_TYPE_ROUNDS],
@@ -2342,13 +2485,27 @@ void write_final_stats (void){
              rps_peers[i].stats[STAT_TYPE_BLOCKS_NO_PUSH_NO_PULL],
              rps_peers[i].stats[STAT_TYPE_ISSUED_PUSH_SEND],
              rps_peers[i].stats[STAT_TYPE_ISSUED_PULL_REQ],
+             rps_peers[i].stats[STAT_TYPE_ISSUED_PULL_REQ_MH],
              rps_peers[i].stats[STAT_TYPE_ISSUED_PULL_REP],
              rps_peers[i].stats[STAT_TYPE_SENT_PUSH_SEND],
              rps_peers[i].stats[STAT_TYPE_SENT_PULL_REQ],
+             rps_peers[i].stats[STAT_TYPE_SENT_PULL_REQ_MH],
              rps_peers[i].stats[STAT_TYPE_SENT_PULL_REP],
              rps_peers[i].stats[STAT_TYPE_RECV_PUSH_SEND],
              rps_peers[i].stats[STAT_TYPE_RECV_PULL_REQ],
-             rps_peers[i].stats[STAT_TYPE_RECV_PULL_REP]);
+             rps_peers[i].stats[STAT_TYPE_RECV_PULL_REQ_MH],
+             rps_peers[i].stats[STAT_TYPE_RECV_PULL_REP_MH],
+             rps_peers[i].stats[STAT_TYPE_RECV_PULL_REP],
+             rps_peers[i].stats[STAT_TYPE_VIEW_SIZE],
+             rps_peers[i].stats[STAT_TYPE_KNOWN_PEERS],
+             rps_peers[i].stats[STAT_TYPE_VALID_PEERS],
+             rps_peers[i].stats[STAT_TYPE_LEARND_PEERS],
+             rps_peers[i].stats[STAT_TYPE_PENDING_ONLINE_CHECKS],
+             rps_peers[i].stats[STAT_TYPE_UNREQUESTED_PULL_REPLIES],
+             rps_peers[i].stats[STAT_TYPE_PEERS_IN_PUSH_MAP],
+             rps_peers[i].stats[STAT_TYPE_PEERS_IN_PULL_MAP],
+             rps_peers[i].stats[STAT_TYPE_PEERS_IN_VIEW],
+             rps_peers[i].stats[STAT_TYPE_VIEW_SIZE_AIM]);
     for (enum STAT_TYPE stat_type = STAT_TYPE_ROUNDS;
          stat_type < STAT_TYPE_MAX;
          stat_type++)
@@ -2360,9 +2517,19 @@ void write_final_stats (void){
            "SUM %"
            PRIu64 " %" /* rounds */
            PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" PRIu64 " %" /* blocking */
-           PRIu64 " %" PRIu64 " %" PRIu64 " %" /* issued */
-           PRIu64 " %" PRIu64 " %" PRIu64 " %" /* sent */
-           PRIu64 " %" PRIu64 " %" PRIu64 /* recv */,
+           PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" /* issued */
+           PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" /* sent */
+           PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" /* recv */
+           PRIu64 ", %" /* view size */
+           PRIu64 ", %" /* known peers */
+           PRIu64 ", %" /* valid peers */
+           PRIu64 ", %" /* learned peers */
+           PRIu64 ", %" /* pending online checks */
+           PRIu64 ", %" /* unrequested pull replies */
+           PRIu64 ", %" /* peers in push map */
+           PRIu64 ", %" /* peers in pull map */
+           PRIu64 ", %" /* peers in view */
+           PRIu64 "\n"/* view size aim */,
            sums[STAT_TYPE_ROUNDS],
            sums[STAT_TYPE_BLOCKS],
            sums[STAT_TYPE_BLOCKS_MANY_PUSH],
@@ -2372,13 +2539,27 @@ void write_final_stats (void){
            sums[STAT_TYPE_BLOCKS_NO_PUSH_NO_PULL],
            sums[STAT_TYPE_ISSUED_PUSH_SEND],
            sums[STAT_TYPE_ISSUED_PULL_REQ],
+           sums[STAT_TYPE_ISSUED_PULL_REQ_MH],
            sums[STAT_TYPE_ISSUED_PULL_REP],
            sums[STAT_TYPE_SENT_PUSH_SEND],
            sums[STAT_TYPE_SENT_PULL_REQ],
+           sums[STAT_TYPE_SENT_PULL_REQ_MH],
            sums[STAT_TYPE_SENT_PULL_REP],
            sums[STAT_TYPE_RECV_PUSH_SEND],
            sums[STAT_TYPE_RECV_PULL_REQ],
-           sums[STAT_TYPE_RECV_PULL_REP]);
+           sums[STAT_TYPE_RECV_PULL_REQ_MH],
+           sums[STAT_TYPE_RECV_PULL_REP],
+           sums[STAT_TYPE_RECV_PULL_REP_MH],
+           sums[STAT_TYPE_VIEW_SIZE],
+           sums[STAT_TYPE_KNOWN_PEERS],
+           sums[STAT_TYPE_VALID_PEERS],
+           sums[STAT_TYPE_LEARND_PEERS],
+           sums[STAT_TYPE_PENDING_ONLINE_CHECKS],
+           sums[STAT_TYPE_UNREQUESTED_PULL_REPLIES],
+           sums[STAT_TYPE_PEERS_IN_PUSH_MAP],
+           sums[STAT_TYPE_PEERS_IN_PULL_MAP],
+           sums[STAT_TYPE_PEERS_IN_VIEW],
+           sums[STAT_TYPE_VIEW_SIZE_AIM]);
 }
 
 /**
@@ -2419,10 +2600,10 @@ post_test_shutdown_ready_cb (void *cls,
     GNUNET_TESTBED_operation_done (rps_peer->stat_op);
   }
 
-  //write_final_stats ();
+  write_final_stats ();
   if (GNUNET_YES == check_statistics_collect_completed())
   {
-    write_final_stats ();
+    //write_final_stats ();
     GNUNET_free (stat_cls);
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
         "Shutting down\n");
@@ -2552,6 +2733,7 @@ test_run (void *cls,
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\tnum_peers: %" PRIu32 "\n", num_peers);
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\tpeers: %p\n", peers);
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "\tlinks_succeeded: %u\n", links_succeeded);
+    ok = 1;
     GNUNET_SCHEDULER_shutdown ();
     return;
   }
@@ -2668,13 +2850,27 @@ run (void *cls,
                                     BIT(STAT_TYPE_BLOCKS_NO_PUSH_NO_PULL) |
                                     BIT(STAT_TYPE_ISSUED_PUSH_SEND) |
                                     BIT(STAT_TYPE_ISSUED_PULL_REQ) |
+                                    BIT(STAT_TYPE_ISSUED_PULL_REQ_MH) |
                                     BIT(STAT_TYPE_ISSUED_PULL_REP) |
                                     BIT(STAT_TYPE_SENT_PUSH_SEND) |
                                     BIT(STAT_TYPE_SENT_PULL_REQ) |
+                                    BIT(STAT_TYPE_SENT_PULL_REQ_MH) |
                                     BIT(STAT_TYPE_SENT_PULL_REP) |
                                     BIT(STAT_TYPE_RECV_PUSH_SEND) |
                                     BIT(STAT_TYPE_RECV_PULL_REQ) |
-                                    BIT(STAT_TYPE_RECV_PULL_REP);
+                                    BIT(STAT_TYPE_RECV_PULL_REQ_MH) |
+                                    BIT(STAT_TYPE_RECV_PULL_REP) |
+                                    BIT(STAT_TYPE_RECV_PULL_REP_MH) |
+                                    BIT(STAT_TYPE_VIEW_SIZE) |
+                                    BIT(STAT_TYPE_KNOWN_PEERS) |
+                                    BIT(STAT_TYPE_VALID_PEERS) |
+                                    BIT(STAT_TYPE_LEARND_PEERS) |
+                                    BIT(STAT_TYPE_PENDING_ONLINE_CHECKS) |
+                                    BIT(STAT_TYPE_UNREQUESTED_PULL_REPLIES) |
+                                    BIT(STAT_TYPE_PEERS_IN_PUSH_MAP) |
+                                    BIT(STAT_TYPE_PEERS_IN_PULL_MAP) |
+                                    BIT(STAT_TYPE_PEERS_IN_VIEW) |
+                                    BIT(STAT_TYPE_VIEW_SIZE_AIM);
   cur_test_run.have_collect_view = COLLECT_VIEW;
 
   /* 'Clean' directory */
@@ -2727,10 +2923,6 @@ run (void *cls,
   if ( (2 == mal_type) ||
        (3 == mal_type))
     target_peer = &rps_peer_ids[num_peers - 2];
-  if (profiler_eval == cur_test_run.eval_cb)
-    eval_peer = &rps_peers[num_peers - 1];    /* FIXME: eval_peer could be a
-                                                 malicious peer if not careful
-                                                 with the malicious portion */
 
   ok = 1;
   GNUNET_TESTBED_run (NULL,