gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r14522 - gnunet/src/testing


From: gnunet
Subject: [GNUnet-SVN] r14522 - gnunet/src/testing
Date: Thu, 24 Feb 2011 13:15:41 +0100

Author: nevans
Date: 2011-02-24 13:15:41 +0100 (Thu, 24 Feb 2011)
New Revision: 14522

Modified:
   gnunet/src/testing/testing_group.c
Log:
clique topology optimization, progress meter for connecting

Modified: gnunet/src/testing/testing_group.c
===================================================================
--- gnunet/src/testing/testing_group.c  2011-02-24 11:45:11 UTC (rev 14521)
+++ gnunet/src/testing/testing_group.c  2011-02-24 12:15:41 UTC (rev 14522)
@@ -89,7 +89,8 @@
                                                             first,
                                                             unsigned int
                                                             second,
-                                                            enum PeerLists 
list);
+                                                            enum PeerLists 
list,
+                                                            unsigned int 
check);
 
 
 /**
@@ -958,6 +959,25 @@
   unsigned int current;
 };
 
+/**
+ * Simple struct to keep track of progress, and print a
+ * nice little percentage meter for long running tasks.
+ */
+struct ProgressMeter
+{
+  unsigned int total;
+
+  unsigned int modnum;
+
+  unsigned int dotnum;
+
+  unsigned int completed;
+
+  int print;
+
+  char *startup_string;
+};
+
 #if !OLD
 /**
  * Convert unique ID to hash code.
@@ -990,6 +1010,102 @@
 #endif
 
 /**
+ * Create a meter to keep track of the progress of some task.
+ *
+ * @param total the total number of items to complete
+ * @param start_string a string to prefix the meter with (if printing)
+ * @param print GNUNET_YES to print the meter, GNUNET_NO to count
+ *              internally only
+ *
+ * @return the progress meter
+ */
+static struct ProgressMeter *
+create_meter(unsigned int total, char * start_string, int print)
+{
+  struct ProgressMeter *ret;
+  ret = GNUNET_malloc(sizeof(struct ProgressMeter));
+  ret->print = print;
+  ret->total = total;
+  ret->modnum = total / 4;
+  ret->dotnum = (total / 50) + 1;
+  if (start_string != NULL)
+    ret->startup_string = GNUNET_strdup(start_string);
+  else
+    ret->startup_string = GNUNET_strdup("");
+
+  return ret;
+}
+
+/**
+ * Update progress meter (increment by one).
+ *
+ * @param meter the meter to update and print info for
+ *
+ * @return GNUNET_YES if called the total requested,
+ *         GNUNET_NO if more items expected
+ */
+static int
+update_meter(struct ProgressMeter *meter)
+{
+  if (meter->print == GNUNET_YES)
+    {
+      if (meter->completed % meter->modnum == 0)
+        {
+          if (meter->completed == 0)
+            {
+              fprintf(stdout, "%sProgress: [0%%", meter->startup_string);
+            }
+          else
+            fprintf(stdout, "%d%%", (int) (((float) meter->completed
+                / meter->total) * 100));
+        }
+      else if (meter->completed % meter->dotnum == 0)
+        fprintf(stdout, ".");
+
+      if (meter->completed + 1 == meter->total)
+        fprintf(stdout, "%d%%]\n", 100);
+      fflush(stdout);
+    }
+  meter->completed++;
+
+  if (meter->completed == meter->total)
+    return GNUNET_YES;
+  if (meter->completed > meter->total)
+    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Progress meter overflow!!\n");
+  return GNUNET_NO;
+}
+
+/**
+ * Reset progress meter.
+ *
+ * @param meter the meter to reset
+ *
+ * @return GNUNET_YES if meter reset,
+ *         GNUNET_SYSERR on error
+ */
+static int
+reset_meter(struct ProgressMeter *meter)
+{
+  if (meter == NULL)
+    return GNUNET_SYSERR;
+
+  meter->completed = 0;
+  return GNUNET_YES;
+}
+
+/**
+ * Release resources for meter
+ *
+ * @param meter the meter to free
+ */
+static void
+free_meter(struct ProgressMeter *meter)
+{
+  GNUNET_free_non_null (meter->startup_string);
+  GNUNET_free (meter);
+}
+
+/**
  * Get a topology from a string input.
  *
  * @param topology where to write the retrieved topology
@@ -1345,6 +1461,7 @@
  * @param first index of the first peer
  * @param second index of the second peer
  * @param list the peer list to use
+ * @param check UNUSED
  *
  * @return the number of connections added (can be 0, 1 or 2)
  *
@@ -1352,7 +1469,7 @@
 static unsigned int
 remove_connections (struct GNUNET_TESTING_PeerGroup *pg,
                    unsigned int first, unsigned int second,
-                   enum PeerLists list)
+                   enum PeerLists list, unsigned int check)
 {
   int removed;
 #if OLD
@@ -1457,6 +1574,8 @@
  * @param first index of the first peer
  * @param second index of the second peer
  * @param list the list type that we should modify
+ * @param check GNUNET_YES to check lists before adding
+ *              GNUNET_NO to force add
  *
  * @return the number of connections added (can be 0, 1 or 2)
  *
@@ -1464,7 +1583,8 @@
 static unsigned int
 add_connections (struct GNUNET_TESTING_PeerGroup *pg,
                  unsigned int first, unsigned int second,
-                 enum PeerLists list)
+                 enum PeerLists list,
+                 unsigned int check)
 {
   int added;
   int add_first;
@@ -1521,26 +1641,29 @@
   add_first = GNUNET_YES;
   add_second = GNUNET_YES;
 
-  first_iter = *first_list;
-  while (first_iter != NULL)
+  if (check == GNUNET_YES)
     {
-      if (first_iter->index == second)
+      first_iter = *first_list;
+      while (first_iter != NULL)
         {
-          add_first = GNUNET_NO;
-          break;
+          if (first_iter->index == second)
+            {
+              add_first = GNUNET_NO;
+              break;
+            }
+          first_iter = first_iter->next;
         }
-      first_iter = first_iter->next;
-    }
 
-  second_iter = *second_list;
-  while (second_iter != NULL)
-    {
-      if (second_iter->index == first)
+      second_iter = *second_list;
+      while (second_iter != NULL)
         {
-          add_second = GNUNET_NO;
-          break;
+          if (second_iter->index == first)
+            {
+              add_second = GNUNET_NO;
+              break;
+            }
+          second_iter = second_iter->next;
         }
-      second_iter = second_iter->next;
     }
 #else
   if (GNUNET_NO ==
@@ -1634,7 +1757,7 @@
   GNUNET_assert (pg->total > 1);
 
   /* Add a connection between the first two nodes */
-  total_connections = proc (pg, 0, 1, list);
+  total_connections = proc (pg, 0, 1, list, GNUNET_YES);
 
   for (outer_count = 1; outer_count < pg->total; outer_count++)
     {
@@ -1659,7 +1782,7 @@
               GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                           "Connecting peer %d to peer %d\n", outer_count, i);
 #endif
-              total_connections += proc (pg, outer_count, i, list);
+              total_connections += proc (pg, outer_count, i, list, GNUNET_YES);
             }
         }
     }
@@ -1786,7 +1909,7 @@
                     GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
                                               pg->total);
                 }
-              smallWorldConnections += proc (pg, i, randomPeer, list);
+              smallWorldConnections += proc (pg, i, randomPeer, list, 
GNUNET_YES);
             }
           else
             {
@@ -1795,7 +1918,7 @@
                 {
                   nodeToConnect = nodeToConnect - pg->total;
                 }
-              connect_attempts += proc (pg, i, nodeToConnect, list);
+              connect_attempts += proc (pg, i, nodeToConnect, list, 
GNUNET_YES);
             }
         }
 
@@ -1856,7 +1979,7 @@
                           "Connecting peer %d to peer %d\n",
                           outer_count, inner_count);
 #endif
-              connect_attempts += proc (pg, outer_count, inner_count, list);
+              connect_attempts += proc (pg, outer_count, inner_count, list, 
GNUNET_YES);
             }
         }
     }
@@ -1915,8 +2038,8 @@
                           "Connecting peer %d to peer %d\n",
                           outer_count, inner_count);
 #endif
-              connect_attempts += proc (pg, outer_count, inner_count, list);
-              add_connections(pg, outer_count, inner_count, ALLOWED);
+              connect_attempts += proc (pg, outer_count, inner_count, list, 
GNUNET_YES);
+              add_connections(pg, outer_count, inner_count, ALLOWED, 
GNUNET_YES);
             }
         }
     }
@@ -2031,7 +2154,7 @@
       else
         nodeToConnect = i - cols + 1;
 
-      connect_attempts += proc (pg, i, nodeToConnect, list);
+      connect_attempts += proc (pg, i, nodeToConnect, list, GNUNET_YES);
 
       if (i < cols)
         {
@@ -2043,7 +2166,7 @@
         nodeToConnect = i - cols;
 
       if (nodeToConnect < pg->total)
-        connect_attempts += proc (pg, i, nodeToConnect, list);
+        connect_attempts += proc (pg, i, nodeToConnect, list, GNUNET_YES);
     }
   natLog = log (pg->total);
 #if VERBOSE_TESTING > 2
@@ -2085,7 +2208,7 @@
                     ((double) UINT64_MAX);
                   /* If random < probability, then connect the two nodes */
                   if (random < probability)
-                    smallWorldConnections += proc (pg, j, k, list);
+                    smallWorldConnections += proc (pg, j, k, list, GNUNET_YES);
 
                 }
             }
@@ -2153,7 +2276,7 @@
 #endif
           if (temp_rand < probability)
             {
-              connect_attempts += proc (pg, outer_count, inner_count, list);
+              connect_attempts += proc (pg, outer_count, inner_count, list, 
GNUNET_YES);
             }
         }
     }
@@ -2229,7 +2352,7 @@
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Connecting peer %d to peer %d\n", i, nodeToConnect);
 #endif
-      connect_attempts += proc (pg, i, nodeToConnect, list);
+      connect_attempts += proc (pg, i, nodeToConnect, list, GNUNET_YES);
 
       /* Second connect to the node immediately above */
       if (i < cols)
@@ -2247,7 +2370,7 @@
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                       "Connecting peer %d to peer %d\n", i, nodeToConnect);
 #endif
-          connect_attempts += proc (pg, i, nodeToConnect, list);
+          connect_attempts += proc (pg, i, nodeToConnect, list, GNUNET_YES);
         }
 
     }
@@ -2264,20 +2387,25 @@
  * @param proc the connection processor to call to actually set
  *        up connections between two peers
  * @param list the peer list to use
+ * @param check does the connection processor need to check before
+ *              performing an action on the list?
  *
  * @return the number of connections that were set up
  *
  */
 static unsigned int
 create_clique (struct GNUNET_TESTING_PeerGroup *pg,
-               GNUNET_TESTING_ConnectionProcessor proc, enum PeerLists list)
+               GNUNET_TESTING_ConnectionProcessor proc,
+               enum PeerLists list,
+               unsigned int check)
 {
   unsigned int outer_count;
   unsigned int inner_count;
   int connect_attempts;
-
+  struct ProgressMeter *conn_meter;
   connect_attempts = 0;
 
+  conn_meter = create_meter((((pg->total * pg->total) + pg->total) / 2) - 
pg->total, "Create Clique ", GNUNET_YES);
   for (outer_count = 0; outer_count < pg->total - 1; outer_count++)
     {
       for (inner_count = outer_count + 1; inner_count < pg->total;
@@ -2288,10 +2416,13 @@
                       "Connecting peer %d to peer %d\n",
                       outer_count, inner_count);
 #endif
-          connect_attempts += proc (pg, outer_count, inner_count, list);
+          connect_attempts += proc (pg, outer_count, inner_count, list, check);
+          update_meter(conn_meter);
         }
     }
-
+  GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Meter has %d left\n", 
conn_meter->total - conn_meter->completed);
+  reset_meter(conn_meter);
+  free_meter(conn_meter);
   return connect_attempts;
 }
 
@@ -2353,7 +2484,7 @@
       iter = pg->peers[count].allowed_peers_head;
       while (iter != NULL)
         {
-          remove_connections(pg, count, iter->index, BLACKLIST);
+          remove_connections(pg, count, iter->index, BLACKLIST, GNUNET_YES);
           //unblacklist_connections(pg, count, iter->index);
           iter = iter->next;
         }
@@ -2394,7 +2525,7 @@
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Connecting peer %d to peer %d\n", count, count + 1);
 #endif
-      connect_attempts += proc (pg, count, count + 1, list);
+      connect_attempts += proc (pg, count, count + 1, list, GNUNET_YES);
     }
 
   return connect_attempts;
@@ -2505,7 +2636,7 @@
               return connect_attempts;
             }
           /* Assume file is written with first peer 1, but array index is 0 */
-          connect_attempts += proc (pg, first_peer_index - 1, 
second_peer_index - 1, list);
+          connect_attempts += proc (pg, first_peer_index - 1, 
second_peer_index - 1, list, GNUNET_YES);
           while((buf[count] != '\n') && (buf[count] != ',') && (count < 
frstat.st_size - 1))
             count++;
           if (buf[count] == '\n')
@@ -2567,11 +2698,11 @@
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Connecting peer %d to peer %d\n", count, count + 1);
 #endif
-      connect_attempts += proc (pg, count, count + 1, list);
+      connect_attempts += proc (pg, count, count + 1, list, GNUNET_YES);
     }
 
   /* Connect the last peer to the first peer */
-  connect_attempts += proc (pg, pg->total - 1, 0, list);
+  connect_attempts += proc (pg, pg->total - 1, 0, list, GNUNET_YES);
 
   return connect_attempts;
 }
@@ -3608,7 +3739,7 @@
       while (iter != NULL)
         {
           GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Creating connection between %d 
and %d\n", pg_iter, iter->index);
-          total += add_connections(pg, pg_iter, iter->index, CONNECT);
+          total += add_connections(pg, pg_iter, iter->index, CONNECT, 
GNUNET_NO);
           //total += add_actual_connections(pg, pg_iter, iter->index);
           iter = iter->next;
         }
@@ -3764,7 +3895,7 @@
 #if VERBOSE_TESTING
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Creating clique topology\n"));
 #endif
-      num_connections = create_clique (pg, &add_connections, ALLOWED);
+      num_connections = create_clique (pg, &add_connections, ALLOWED, 
GNUNET_NO);
       break;
     case GNUNET_TESTING_TOPOLOGY_SMALL_WORLD_RING:
 #if VERBOSE_TESTING
@@ -3871,7 +4002,7 @@
 
   /* Use the create clique method to initially set all connections as 
blacklisted. */
   if ((restrict_topology != GNUNET_TESTING_TOPOLOGY_NONE) && 
(restrict_topology != GNUNET_TESTING_TOPOLOGY_FROM_FILE))
-    create_clique (pg, &add_connections, BLACKLIST);
+    create_clique (pg, &add_connections, BLACKLIST, GNUNET_NO);
 
   unblacklisted_connections = 0;
   /* Un-blacklist connections as per the topology specified */
@@ -3883,7 +4014,7 @@
                   _("Blacklisting all but clique topology\n"));
 #endif
       unblacklisted_connections =
-        create_clique (pg, &remove_connections, BLACKLIST);
+        create_clique (pg, &remove_connections, BLACKLIST, GNUNET_NO);
       break;
     case GNUNET_TESTING_TOPOLOGY_SMALL_WORLD_RING:
 #if VERBOSE_TESTING
@@ -4201,7 +4332,7 @@
                                        UINT64_MAX)) / ((double) UINT64_MAX);
           if (random_number < percentage)
             {
-              add_connections(pg, pg_iter, conn_iter->index, WORKING_SET);
+              add_connections(pg, pg_iter, conn_iter->index, WORKING_SET, 
GNUNET_YES);
             }
           conn_iter = conn_iter->next;
         }
@@ -4224,7 +4355,7 @@
     {
       conn_iter = pg->peers[pg_iter].connect_peers_head;
       while (pg->peers[pg_iter].connect_peers_head != NULL)
-        remove_connections(pg, pg_iter, 
pg->peers[pg_iter].connect_peers_head->index, CONNECT);
+        remove_connections(pg, pg_iter, 
pg->peers[pg_iter].connect_peers_head->index, CONNECT, GNUNET_YES);
 
       pg->peers[pg_iter].connect_peers_head = 
pg->peers[pg_iter].connect_peers_working_set_head;
       pg->peers[pg_iter].connect_peers_tail = 
pg->peers[pg_iter].connect_peers_working_set_tail;
@@ -4357,7 +4488,7 @@
             conn_iter = conn_iter->next;
           /* We now have a random connection, connect it! */
           GNUNET_assert(conn_iter != NULL);
-          add_connections(pg, pg_iter, conn_iter->index, WORKING_SET);
+          add_connections(pg, pg_iter, conn_iter->index, WORKING_SET, 
GNUNET_YES);
         }
     }
 #else
@@ -4396,7 +4527,7 @@
   for (pg_iter = 0; pg_iter < pg->total; pg_iter++)
     {
       while (pg->peers[pg_iter].connect_peers_head != NULL)
-        remove_connections(pg, pg_iter, 
pg->peers[pg_iter].connect_peers_head->index, CONNECT);
+        remove_connections(pg, pg_iter, 
pg->peers[pg_iter].connect_peers_head->index, CONNECT, GNUNET_YES);
 
       pg->peers[pg_iter].connect_peers_head = 
pg->peers[pg_iter].connect_peers_working_set_head;
       pg->peers[pg_iter].connect_peers_tail = 
pg->peers[pg_iter].connect_peers_working_set_tail;
@@ -4572,8 +4703,8 @@
           temp_count++;
         }
       GNUNET_assert(peer_iter != NULL);
-      add_connections(pg, starting_peer, peer_iter->index, WORKING_SET);
-      remove_connections(pg, starting_peer, peer_iter->index, CONNECT);
+      add_connections(pg, starting_peer, peer_iter->index, WORKING_SET, 
GNUNET_NO);
+      remove_connections(pg, starting_peer, peer_iter->index, CONNECT, 
GNUNET_YES);
       starting_peer = peer_iter->index;
       dfs_count++;
     }
@@ -5077,7 +5208,7 @@
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   _("Creating clique CONNECT topology\n"));
 #endif
-      create_clique (pg, &add_connections, CONNECT);
+      create_clique (pg, &add_connections, CONNECT, GNUNET_NO);
       break;
     case GNUNET_TESTING_TOPOLOGY_SMALL_WORLD_RING:
 #if VERBOSE_TOPOLOGY




reply via email to

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