splitting transport service and ats
authorMatthias Wachs <wachs@net.in.tum.de>
Thu, 7 Jul 2011 09:53:14 +0000 (09:53 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Thu, 7 Jul 2011 09:53:14 +0000 (09:53 +0000)
src/transport/gnunet-service-transport.c
src/transport/test_transport_ats_4addr.conf
src/transport/test_transport_ats_multiple_peers.c
src/transport/transport_ats.c
src/transport/transport_ats.h

index 5f369c73facfbcf1ccddc62e1e9714b0e6d0533c..73239c24151dd6800301dd15b3e537b91316e33c 100644 (file)
@@ -919,6 +919,11 @@ static struct GNUNET_STATISTICS_Handle *stats;
  */
 static GNUNET_SCHEDULER_TaskIdentifier hello_task;
 
+/**
+ * Identifier of ats scheduler task.
+ */
+static GNUNET_SCHEDULER_TaskIdentifier ats_task;
+
 /**
  * Is transport service shutting down ?
  */
@@ -983,8 +988,7 @@ static int update_addr_value (struct ForeignAddressList *fal, uint32_t value , i
       fal->quality[c].values[1] = fal->quality[c].values[2];
       fal->quality[c].values[2] = value;
       set = GNUNET_YES;
-      if (ats != NULL)
-        ats->stat.modified_quality = GNUNET_YES;
+      ats_modify_problem_state (ats, ATS_QUALITY_UPDATED);
     }
   }
   if (set == GNUNET_NO)
@@ -995,8 +999,7 @@ static int update_addr_value (struct ForeignAddressList *fal, uint32_t value , i
       {
         fal->ressources[c].c = value;
         set = GNUNET_YES;
-        if (ats != NULL)
-          ats->stat.modified_resources = GNUNET_YES;
+        ats_modify_problem_state (ats, ATS_COST_UPDATED);
       }
     }
   }
@@ -2430,8 +2433,8 @@ plugin_env_session_end  (void *cls,
     }
   GNUNET_free_non_null(pos->ressources);
   GNUNET_free_non_null(pos->quality);
-  if (ats != NULL)
-    ats->stat.recreate_problem = GNUNET_YES;
+  ats_modify_problem_state (ats, ATS_MODIFIED);
+
   if (GNUNET_YES != pos->connected)
     {
       /* nothing else to do, connection was never up... */
@@ -2603,7 +2606,7 @@ notify_clients_connect (const struct GNUNET_PeerIdentity *peer,
   /* notify ats about connecting peer */
   if ((ats != NULL) && (shutdown_in_progress == GNUNET_NO))
   {
-    ats->stat.recreate_problem = GNUNET_YES;
+    ats_modify_problem_state(ats, ATS_MODIFIED);
     ats_calculate_bandwidth_distribution (ats, stats, neighbours);
   }
 
@@ -2652,7 +2655,7 @@ notify_clients_disconnect (const struct GNUNET_PeerIdentity *peer)
   /* notify ats about connecting peer */
   if ((ats != NULL) && (shutdown_in_progress == GNUNET_NO))
   {
-    ats->stat.recreate_problem = GNUNET_YES;
+    ats_modify_problem_state(ats, ATS_MODIFIED);
     ats_calculate_bandwidth_distribution (ats, stats, neighbours);
   }
 
@@ -4817,8 +4820,7 @@ disconnect_neighbour (struct NeighbourList *n, int check)
   if (GNUNET_YES == n->received_pong)
     notify_clients_disconnect (&n->id);
 
-  if (ats != NULL)
-      ats->stat.recreate_problem = GNUNET_YES;
+  ats_modify_problem_state(ats, ATS_QUALITY_COST_UPDATED);
 
   /* clean up all plugins, cancel connections and pending transmissions */
   while (NULL != (rpos = n->plugins))
@@ -5322,19 +5324,16 @@ plugin_env_receive (void *cls, const struct GNUNET_PeerIdentity *peer,
        //GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "GNUNET_MESSAGE_TYPE_TRANSPORT_ATS: %i \n", value);
        /* Force ressource and quality update */
        if ((value == 4) && (ats != NULL))
-         {
-           ats->stat.modified_resources = GNUNET_YES;
-           ats->stat.modified_quality = GNUNET_YES;
-         }
+            ats_modify_problem_state(ats, ATS_QUALITY_COST_UPDATED);
        /* Force cost update */
        if ((value == 3) && (ats != NULL))
-         ats->stat.modified_resources = GNUNET_YES;
+          ats_modify_problem_state(ats, ATS_COST_UPDATED);
        /* Force quality update */
        if ((value == 2) && (ats != NULL))
-         ats->stat.modified_quality = GNUNET_YES;
+          ats_modify_problem_state(ats, ATS_QUALITY_UPDATED);
        /* Force full rebuild */
        if ((value == 1) && (ats != NULL))
-         ats->stat.recreate_problem = GNUNET_YES;
+          ats_modify_problem_state(ats, ATS_MODIFIED);
       }
     
 #if DEBUG_PING_PONG
@@ -6007,6 +6006,13 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   GNUNET_CONTAINER_multihashmap_destroy (validation_map);
   validation_map = NULL;
 
+  if (ats_task != GNUNET_SCHEDULER_NO_TASK)
+  {
+    GNUNET_SCHEDULER_cancel(ats_task);
+    ats_task = GNUNET_SCHEDULER_NO_TASK;
+  }
+
+
   if (ats != NULL)
     ats_shutdown (ats);
 
@@ -6060,7 +6066,7 @@ schedule_ats (void *cls,
   if (ats==NULL)
     return;
 
-  ats->ats_task = GNUNET_SCHEDULER_NO_TASK;
+  ats_task = GNUNET_SCHEDULER_NO_TASK;
   if ( (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0)
       return;
   if (shutdown_in_progress == GNUNET_YES)
@@ -6069,7 +6075,7 @@ schedule_ats (void *cls,
        GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Running scheduled calculation\n");
 #endif
   ats_calculate_bandwidth_distribution (ats, stats, neighbours);
-  ats->ats_task = GNUNET_SCHEDULER_add_delayed (ats->exec_interval,
+  ats_task = GNUNET_SCHEDULER_add_delayed (ats->exec_interval,
                                   &schedule_ats, ats);
 }
 
@@ -6211,7 +6217,7 @@ run (void *cls,
 
   ats = ats_init (cfg);
   if (ats != NULL)
-    ats->ats_task = GNUNET_SCHEDULER_add_now (&schedule_ats, ats);
+    ats_task = GNUNET_SCHEDULER_add_now (&schedule_ats, ats);
 
 
 #if DEBUG_TRANSPORT
index 644224dedf6777511c40524cc42f995d6711ce27..d7301124a5e7c6d88edf98cd24feed300d0d192f 100644 (file)
@@ -10,7 +10,7 @@ PORT = 2565
 PLUGINS = tcp
 #DEBUG = YES
 #PREFIX = xterm -e xterm -T transport -e gdb -x cmd --args
-#PREFIX = valgrind --tool=memcheck --log-file=logs%p
+#PREFIX = valgrind --tool=memcheck --log-file=multiple_peers/logs%p
 #WAN_BW_LIMIT_DOWN = 100
 #WAN_BW_LIMIT_UP = 1000000
 #LAN_BW_LIMIT_DOWN = 100
index e0cf58c6d33cc3d39f2a819bf176434554affa46..870d6cc5c05d90620a5f1ceae22fb6db007634ca 100644 (file)
@@ -26,6 +26,7 @@
 #include "gnunet_transport_service.h"
 #include "gnunet_scheduler_lib.h"
 #include "gauger.h"
+#include "transport_ats.h"
 
 #define VERBOSE GNUNET_NO
 
 #define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 300)
 #define SEND_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)
 
-#define ATS_NEW 0
-#define ATS_Q_UPDATED 1
-#define ATS_C_UPDATED 2
-#define ATS_QC_UPDATED 3
-#define ATS_UNMODIFIED 4
-
 static int ok;
 
 static int peers_left;
@@ -290,7 +285,9 @@ stats_cb (void *cls,
          int is_persistent)
 {
   static int printed = GNUNET_NO;
-  //GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s = %llu\n", name ,value);
+#if VERBOSE_ATS
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%s = %llu\n", name ,value);
+#endif
   if (0 == strcmp (name,"ATS invalid solutions"))
     {
       if (stats_task != GNUNET_SCHEDULER_NO_TASK)
@@ -386,7 +383,7 @@ stats_cb (void *cls,
                    }
                  
                }
-             if (current.state == ATS_Q_UPDATED)
+             if (current.state == ATS_QUALITY_UPDATED)
                {
                  if (c_modified < MEASUREMENTS)
                    {
@@ -469,11 +466,11 @@ stats_cb (void *cls,
          char * cont;
          if (value == ATS_NEW)
            cont = "NEW";
-         if (value == ATS_C_UPDATED)
+         if (value == ATS_COST_UPDATED)
            cont = "C_UPDATED";
-         if (value == ATS_Q_UPDATED)
+         if (value == ATS_QUALITY_UPDATED)
            cont = "Q_UPDATED";
-         if (value == ATS_QC_UPDATED)
+         if (value == ATS_QUALITY_COST_UPDATED)
            cont = "QC_UPDATED";
          if (value == ATS_UNMODIFIED)
            cont = "UNMODIFIED";
index fdd8126cd9e4e0aa7f3ce7ca65f83395f89677ca..e04bc97977984b1a2c874c285b15a6911f069e82 100644 (file)
@@ -730,7 +730,10 @@ static void _dummy ()
 
 static void _dummy2 ()
 {
+  ats_modify_problem_state (NULL, 0);
    _dummy();
+   int t = ATS_COST_UPDATED + ATS_MODIFIED + ATS_NEW;
+   t = 0;
 }
 
 /*
@@ -765,7 +768,6 @@ struct ATS_Handle * ats_init (const struct GNUNET_CONFIGURATION_Handle *cfg)
   ats->exec_interval = ATS_EXEC_INTERVAL;
   ats->max_exec_duration = ATS_MAX_EXEC_DURATION;
   ats->max_iterations = ATS_MAX_ITERATIONS;
-  ats->ats_task = GNUNET_SCHEDULER_NO_TASK;
 
   ats->D = 1.0;
   ats->U = 1.0;
@@ -1497,8 +1499,38 @@ void ats_delete_problem (struct ATS_Handle * ats)
   ats->stat.valid = GNUNET_SYSERR;
 }
 
+void ats_modify_problem_state (struct ATS_Handle * ats, enum ATS_problem_state s)
+{
+  if (ats == NULL)
+    return;
+  switch (s)
+  {
+  case ATS_NEW :
+    ats->stat.recreate_problem = GNUNET_NO;
+    ats->stat.modified_quality = GNUNET_NO;
+    ats->stat.modified_resources = GNUNET_NO;
+    break;
+  case ATS_MODIFIED:
+    ats->stat.recreate_problem = GNUNET_YES;
+    break;
+  case ATS_QUALITY_UPDATED :
+    ats->stat.modified_quality = GNUNET_YES;
+    break;
+  case ATS_COST_UPDATED :
+    ats->stat.modified_resources = GNUNET_YES;
+    break;
+  case ATS_QUALITY_COST_UPDATED:
+    ats->stat.modified_resources = GNUNET_YES;
+    ats->stat.modified_quality = GNUNET_YES;
+    break;
+  default:
+    return;
+  }
+
 
 
+}
+
 void ats_solve_problem (struct ATS_Handle * ats,
     unsigned int max_it,
     unsigned int  max_dur,
@@ -1646,9 +1678,6 @@ void ats_shutdown (struct ATS_Handle * ats)
 #if DEBUG_ATS
   GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "ATS shutdown\n");
 #endif
-  if (ats->ats_task != GNUNET_SCHEDULER_NO_TASK)
-    GNUNET_SCHEDULER_cancel(ats->ats_task);
-  ats->ats_task = GNUNET_SCHEDULER_NO_TASK;
   ats_delete_problem (ats);
   _lp_free_env();
 
@@ -1864,15 +1893,15 @@ ats_calculate_bandwidth_distribution (struct ATS_Handle * ats,
           GNUNET_STATISTICS_set (stats, "ATS state",ATS_NEW, GNUNET_NO);
       else if ((ats->stat.modified_resources == GNUNET_YES) &&
               (ats->stat.modified_quality == GNUNET_NO))
-        GNUNET_STATISTICS_set (stats, "ATS state", ATS_C_UPDATED, GNUNET_NO);
+        GNUNET_STATISTICS_set (stats, "ATS state", ATS_COST_UPDATED, GNUNET_NO);
       else if ((ats->stat.modified_resources == GNUNET_NO) &&
               (ats->stat.modified_quality == GNUNET_YES) &&
               (ats->stat.simplex_rerun_required == GNUNET_NO))
-        GNUNET_STATISTICS_set (stats, "ATS state", ATS_Q_UPDATED, GNUNET_NO);
+        GNUNET_STATISTICS_set (stats, "ATS state", ATS_QUALITY_UPDATED, GNUNET_NO);
       else if ((ats->stat.modified_resources == GNUNET_YES) &&
               (ats->stat.modified_quality == GNUNET_YES) &&
               (ats->stat.simplex_rerun_required == GNUNET_NO))
-        GNUNET_STATISTICS_set (stats, "ATS state", ATS_QC_UPDATED, GNUNET_NO);
+        GNUNET_STATISTICS_set (stats, "ATS state", ATS_QUALITY_COST_UPDATED, GNUNET_NO);
       else if (ats->stat.simplex_rerun_required == GNUNET_NO)
         GNUNET_STATISTICS_set (stats, "ATS state", ATS_UNMODIFIED, GNUNET_NO);
     }
index 9c45a6fb6b4871c8c02226c3cf1d0c26e6ab5f4e..49f8d73752ca46d971f04c61da2cb3ee69fad588 100644 (file)
 
 #define VERY_BIG_DOUBLE_VALUE 100000000000LL
 
-#define ATS_NEW 0
-#define ATS_Q_UPDATED 1
-#define ATS_C_UPDATED 2
-#define ATS_QC_UPDATED 3
-#define ATS_UNMODIFIED 4
+enum ATS_problem_state
+{
+  /**
+   * Problem is new / unmodified
+   */
+  ATS_NEW = 0,
+
+  /**
+   * Problem quality properties were modified
+   */
+  ATS_QUALITY_UPDATED = 1,
+
+  /**
+   * Problem ressource properties were modified
+   */
+  ATS_COST_UPDATED = 2,
+
+  /**
+   * Problem quality and ressource properties were modified
+   */
+  ATS_QUALITY_COST_UPDATED = 3,
+
+  /**
+   * Problem is modified and needs to be completely recalculated
+   * due to e.g. connecting or disconnecting peers
+   */
+  ATS_MODIFIED = 4,
+
+  /**
+   * Problem is modified and needs to be completely recalculated
+   * due to e.g. connecting or disconnecting peers
+   */
+  ATS_UNMODIFIED = 8
+};
 
 /*
 *  ATS data structures
@@ -162,11 +191,6 @@ struct ATS_Handle
     void * prob;
 #endif
 
-    /**
-     * task to recalculate the bandwidth assignment
-     */
-    GNUNET_SCHEDULER_TaskIdentifier ats_task;
-
     /**
      * Current state of the GLPK problem
      */
@@ -378,6 +402,9 @@ ats_create_problem (struct ATS_Handle * ats,
                     int v_n_min,
                     struct ATS_stat *stat);
 
+void ats_modify_problem_state (struct ATS_Handle * ats,
+    enum ATS_problem_state s);
+
 void
 ats_calculate_bandwidth_distribution (struct ATS_Handle * ats,
     struct GNUNET_STATISTICS_Handle *stats,