gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r11294 - gnunet/src/testing
Date: Tue, 11 May 2010 09:35:38 +0200

Author: nevans
Date: 2010-05-11 09:35:38 +0200 (Tue, 11 May 2010)
New Revision: 11294

Modified:
   gnunet/src/testing/testing.c
   gnunet/src/testing/testing_group.c
Log:
more testing changes

Modified: gnunet/src/testing/testing.c
===================================================================
--- gnunet/src/testing/testing.c        2010-05-11 06:52:05 UTC (rev 11293)
+++ gnunet/src/testing/testing.c        2010-05-11 07:35:38 UTC (rev 11294)
@@ -126,7 +126,7 @@
     {
       d->server = NULL;
       if (GNUNET_YES == d->dead)
-        GNUNET_TESTING_daemon_stop (d, 
GNUNET_TIME_absolute_get_remaining(d->max_timeout), d->dead_cb, d->dead_cb_cls, 
GNUNET_YES);
+        GNUNET_TESTING_daemon_stop (d, 
GNUNET_TIME_absolute_get_remaining(d->max_timeout), d->dead_cb, d->dead_cb_cls, 
GNUNET_YES, GNUNET_NO);
       else if (NULL != cb)
         cb (d->cb_cls, NULL, d->cfg, d,
             _("Failed to connect to core service\n"));
@@ -141,7 +141,7 @@
   d->server = server;
   d->running = GNUNET_YES;
   if (GNUNET_YES == d->dead)
-    GNUNET_TESTING_daemon_stop (d, 
GNUNET_TIME_absolute_get_remaining(d->max_timeout), d->dead_cb, d->dead_cb_cls, 
GNUNET_YES);
+    GNUNET_TESTING_daemon_stop (d, 
GNUNET_TIME_absolute_get_remaining(d->max_timeout), d->dead_cb, d->dead_cb_cls, 
GNUNET_YES, GNUNET_NO);
   else if (NULL != cb)
     cb (d->cb_cls, my_identity, d->cfg, d, NULL);
 #if DEBUG_TESTING
@@ -155,7 +155,7 @@
   if (d->th == NULL)
     {
       if (GNUNET_YES == d->dead)
-        GNUNET_TESTING_daemon_stop (d, 
GNUNET_TIME_absolute_get_remaining(d->max_timeout), d->dead_cb, d->dead_cb_cls, 
GNUNET_YES);
+        GNUNET_TESTING_daemon_stop (d, 
GNUNET_TIME_absolute_get_remaining(d->max_timeout), d->dead_cb, d->dead_cb_cls, 
GNUNET_YES, GNUNET_NO);
       else if (NULL != d->cb)
         d->cb (d->cb_cls, &d->id, d->cfg, d,
             _("Failed to connect to transport service!\n"));
@@ -580,14 +580,19 @@
           d->th = NULL;
         }
       /* state clean up and notifications */
-      GNUNET_CONFIGURATION_destroy (d->cfg);
-      GNUNET_free (d->cfgfile);
+      if (d->churn == GNUNET_NO)
+        {
+          GNUNET_CONFIGURATION_destroy (d->cfg);
+          GNUNET_free (d->cfgfile);
+          GNUNET_free_non_null (d->hostname);
+          GNUNET_free_non_null (d->username);
+        }
+
       GNUNET_free_non_null(d->hello);
-      GNUNET_free_non_null (d->hostname);
-      GNUNET_free_non_null (d->username);
       GNUNET_free_non_null (d->shortname);
       if (NULL != d->dead_cb)
         d->dead_cb (d->dead_cb_cls, NULL);
+
       GNUNET_free (d);
       break;
     case SP_CONFIG_UPDATE:
@@ -643,7 +648,40 @@
   daemon->phase = SP_TOPOLOGY_SETUP;
 }
 
+
 /**
+ * Start a peer that has previously been stopped using the daemon_stop
+ * call (and files weren't deleted and the allow restart flag)
+ *
+ * @param daemon the daemon to start (has been previously stopped)
+ * @param timeout how long to wait for restart
+ * @param cb the callback for notification when the peer is running
+ * @param cb_cls closure for the callback
+ */
+void
+GNUNET_TESTING_daemon_start_stopped (struct GNUNET_TESTING_Daemon *daemon,
+                                     struct GNUNET_TIME_Relative timeout,
+                                     GNUNET_TESTING_NotifyDaemonRunning cb,
+                                     void *cb_cls)
+{
+  if (daemon->running == GNUNET_YES)
+  {
+    cb(cb_cls, &daemon->id, daemon->cfg, daemon, "Daemon already running, 
can't restart!");
+    return;
+  }
+
+  daemon->cb = cb;
+  daemon->cb_cls = cb_cls;
+  daemon->phase = SP_TOPOLOGY_SETUP;
+  daemon->max_timeout = GNUNET_TIME_relative_to_absolute(timeout);
+
+  GNUNET_SCHEDULER_add_continuation (daemon->sched,
+                                     &start_fsm,
+                                     daemon,
+                                     GNUNET_SCHEDULER_REASON_PREREQ_DONE);
+}
+
+/**
  * Starts a GNUnet daemon.  GNUnet must be installed on the target
  * system and available in the PATH.  The machine must furthermore be
  * reachable via "ssh" (unless the hostname is "NULL") without the
@@ -879,14 +917,15 @@
  * @param cb function called once the daemon was stopped
  * @param cb_cls closure for cb
  * @param delete_files GNUNET_YES to remove files, GNUNET_NO
- *        to leave them (i.e. for restarting at a later time,
- *        or logfile inspection once finished)
+ *        to leave them
+ * @param allow_restart GNUNET_YES to restart peer later (using this API)
+ *        GNUNET_NO to kill off and clean up for good
  */
 void
 GNUNET_TESTING_daemon_stop (struct GNUNET_TESTING_Daemon *d,
                             struct GNUNET_TIME_Relative timeout,
                             GNUNET_TESTING_NotifyCompletion cb, void *cb_cls,
-                            int delete_files)
+                            int delete_files, int allow_restart)
 {
   char *arg;
   char *del_arg;
@@ -926,6 +965,16 @@
 #endif
 
   d->phase = SP_SHUTDOWN_START;
+  d->running = GNUNET_NO;
+
+  if (allow_restart == GNUNET_YES)
+    d->churn = GNUNET_YES;
+  if (d->th != NULL)
+    {
+      GNUNET_TRANSPORT_get_hello_cancel(d->th, &process_hello, d);
+      GNUNET_TRANSPORT_disconnect(d->th);
+      d->th = NULL;
+    }
   /* Check if this is a local or remote process */
   if (NULL != d->hostname)
     {

Modified: gnunet/src/testing/testing_group.c
===================================================================
--- gnunet/src/testing/testing_group.c  2010-05-11 06:52:05 UTC (rev 11293)
+++ gnunet/src/testing/testing_group.c  2010-05-11 07:35:38 UTC (rev 11294)
@@ -2606,7 +2606,135 @@
 
 }
 
+void
+churn_stop_callback (void *cls, const char *emsg)
+{
+
+}
+
+void
+churn_start_callback (void *cls,
+                      const struct GNUNET_PeerIdentity *id,
+                      const struct GNUNET_CONFIGURATION_Handle *cfg,
+                      struct GNUNET_TESTING_Daemon *d,
+                      const char *emsg)
+{
+
+}
+
 /**
+ * Context for handling churning a peer group
+ */
+struct ChurnContext
+{
+
+};
+
+/**
+ * Simulate churn by stopping some peers (and possibly
+ * re-starting others if churn is called multiple times).  This
+ * function can only be used to create leave-join churn (peers "never"
+ * leave for good).  First "voff" random peers that are currently
+ * online will be taken offline; then "von" random peers that are then
+ * offline will be put back online.  No notifications will be
+ * generated for any of these operations except for the callback upon
+ * completion.  Note that the implementation is at liberty to keep
+ * the ARM service itself (but none of the other services or daemons)
+ * running even though the "peer" is being varied offline.
+ *
+ * @param pg handle for the peer group
+ * @param voff number of peers that should go offline
+ * @param von number of peers that should come back online;
+ *            must be zero on first call (since "testbed_start"
+ *            always starts all of the peers)
+ * @param timeout how long to wait for operations to finish before
+ *        giving up
+ * @param cb function to call at the end
+ * @param cb_cls closure for cb
+ */
+void
+GNUNET_TESTING_daemons_churn (struct GNUNET_TESTING_PeerGroup *pg,
+                              unsigned int voff,
+                              unsigned int von,
+                              struct GNUNET_TIME_Relative timeout,
+                              GNUNET_TESTING_NotifyCompletion cb,
+                              void *cb_cls)
+{
+  struct ChurnContext *churn_ctx;
+  unsigned int running;
+  unsigned int stopped;
+  unsigned int i;
+  unsigned int *running_arr;
+  unsigned int *stopped_arr;
+  unsigned int *running_permute;
+  unsigned int *stopped_permute;
+
+  running = 0;
+  stopped = 0;
+
+  for (i = 0; i < pg->total; i++)
+  {
+    if (pg->peers[i].daemon->running == GNUNET_YES)
+    {
+      running++;
+    }
+    else
+    {
+      stopped++;
+    }
+  }
+
+  if (voff > running)
+  {
+    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Trying to stop more peers than are 
currently running!\n");
+    cb(cb_cls, "Trying to stop more peers than are currently running!");
+    return;
+  }
+
+  if (von > stopped)
+  {
+    GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Trying to start more peers than are 
currently stopped!\n");
+    cb(cb_cls, "Trying to start more peers than are currently stopped!");
+    return;
+  }
+
+  churn_ctx = GNUNET_malloc(sizeof(struct ChurnContext));
+  running_arr = GNUNET_malloc(running * sizeof(unsigned int));
+  stopped_arr = GNUNET_malloc(stopped * sizeof(unsigned int));
+  running_permute = GNUNET_CRYPTO_random_permute(GNUNET_CRYPTO_QUALITY_WEAK, 
running);
+  stopped_permute = GNUNET_CRYPTO_random_permute(GNUNET_CRYPTO_QUALITY_WEAK, 
stopped);
+
+  running = 0;
+  stopped = 0;
+
+  for (i = 0; i < pg->total; i++)
+  {
+    if (pg->peers[i].daemon->running == GNUNET_YES)
+    {
+      running_arr[running] = i;
+      running++;
+    }
+    else
+    {
+      stopped_arr[stopped] = i;
+      stopped++;
+    }
+  }
+
+  for (i = 0; i < voff; i++)
+  {
+    
GNUNET_TESTING_daemon_stop(pg->peers[running_arr[running_permute[i]]].daemon, 
timeout, &churn_stop_callback, churn_ctx, GNUNET_NO, GNUNET_YES);
+  }
+
+  for (i = 0; i < von; i++)
+  {
+    
GNUNET_TESTING_daemon_start_stopped(pg->peers[stopped_arr[stopped_permute[i]]].daemon,
 timeout, &churn_start_callback, churn_ctx);
+  }
+
+}
+
+
+/**
  * Restart all peers in the given group.
  *
  * @param pg the handle to the peer group
@@ -2655,7 +2783,7 @@
          as well... */
 
       if (NULL != pg->peers[off].daemon)
-        GNUNET_TESTING_daemon_stop (pg->peers[off].daemon, timeout, NULL, 
NULL, GNUNET_YES);
+        GNUNET_TESTING_daemon_stop (pg->peers[off].daemon, timeout, NULL, 
NULL, GNUNET_YES, GNUNET_NO);
       if (NULL != pg->peers[off].cfg)
         GNUNET_CONFIGURATION_destroy (pg->peers[off].cfg);
 




reply via email to

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