gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r25835 - gnunet/src/ats


From: gnunet
Subject: [GNUnet-SVN] r25835 - gnunet/src/ats
Date: Fri, 18 Jan 2013 17:52:13 +0100

Author: wachs
Date: 2013-01-18 17:52:13 +0100 (Fri, 18 Jan 2013)
New Revision: 25835

Modified:
   gnunet/src/ats/gnunet-service-ats_addresses_simplistic.c
Log:
preference aging + improved quota recalculation due to pref change


Modified: gnunet/src/ats/gnunet-service-ats_addresses_simplistic.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses_simplistic.c    2013-01-18 
16:21:42 UTC (rev 25834)
+++ gnunet/src/ats/gnunet-service-ats_addresses_simplistic.c    2013-01-18 
16:52:13 UTC (rev 25835)
@@ -55,7 +55,7 @@
  *
  */
 
-#define PREF_AGING_INTERVAL GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 1)
+#define PREF_AGING_INTERVAL GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 10)
 #define PREF_AGING_FACTOR 0.95
 
 #define DEFAULT_PREFERENCE 1.0
@@ -165,10 +165,25 @@
 };
 
 
+struct PreferenceClient
+{
+  struct PreferenceClient *prev;
+  struct PreferenceClient *next;
+  void *client;
+
+  double f_total[GNUNET_ATS_PreferenceCount];
+
+  struct PreferencePeer *p_head;
+  struct PreferencePeer *p_tail;
+};
+
+
 struct PreferencePeer
 {
   struct PreferencePeer *next;
   struct PreferencePeer *prev;
+  struct PreferenceClient *client;
+  struct GAS_SIMPLISTIC_Handle *s;
   struct GNUNET_PeerIdentity id;
 
   double f[GNUNET_ATS_PreferenceCount];
@@ -178,19 +193,6 @@
   GNUNET_SCHEDULER_TaskIdentifier aging_task;
 };
 
-struct PreferenceClient
-{
-  struct PreferenceClient *prev;
-  struct PreferenceClient *next;
-  void *client;
-
-  double f_total[GNUNET_ATS_PreferenceCount];
-
-  struct PreferencePeer *p_head;
-  struct PreferencePeer *p_tail;
-};
-
-
 /**
  * Get the prefered address for a specific peer
  *
@@ -399,6 +401,7 @@
   return GNUNET_NO;
 }
 
+
 /**
  * Update the quotas for a network type
  *
@@ -536,6 +539,15 @@
 }
 
 static void
+update_all_networks (struct GAS_SIMPLISTIC_Handle *s)
+{
+       int i;
+       for (i = 0; i < s->networks; i++)
+               update_quota_per_network (s, &s->network_entries[i], NULL);
+
+}
+
+static void
 addresse_increment (struct GAS_SIMPLISTIC_Handle *s,
                                 struct Network *net,
                                 int total,
@@ -1076,72 +1088,99 @@
 }
 
 static void
-update_preference (struct GAS_SIMPLISTIC_Handle *s,
-                                                                        struct 
PreferenceClient *cur,
-                                                                        struct 
PreferencePeer *p,
-                                                                        enum 
GNUNET_ATS_PreferenceKind kind,
-                                                        float score_f)
+recalculate_preferences (struct PreferencePeer *p)
 {
-  double p_rel_global;
+       struct GAS_SIMPLISTIC_Handle *s = p->s;
+       struct PreferencePeer *p_cur;
+       struct PreferenceClient *c_cur = p->client;
+       double p_rel_global;
   double *dest;
-  double score = score_f;
-  struct PreferencePeer *p_cur;
-  int i;
+  int kind;
+  int rkind;
   int clients;
 
-  /* Update preference value according to type */
-  switch (kind) {
-    case GNUNET_ATS_PREFERENCE_BANDWIDTH:
-    case GNUNET_ATS_PREFERENCE_LATENCY:
-      p->f[kind] = (p->f[kind] + score) / 2;
-      break;
-    case GNUNET_ATS_PREFERENCE_END:
-      break;
-    default:
-      break;
-  }
+  /**
+   * Idea:
+   *
+   * We have:
+   * Set of clients c
+   * Set of peers p_i in P
+   * Set of preference kinds k
+   * A preference value f_k_p_i with an unknown range
+   *
+   * We get:
+   * A client specific relative preference f_p_i_rel [1..2] for all peers
+   *
+   * For every client c
+   * {
+   *   For every preference kind k:
+   *   {
+   *     We remember for the preference f_p_i for each peer p_i.
+   *     We have a default preference value f_p_i = 0
+   *     We have a sum of all preferences f_t = sum (f_p_i)
+   *     So we can calculate a relative preference value fr_p_i:
+   *
+   *     f_k_p_i_rel = (f_t + f_p_i) / f_t
+   *     f_k_p_i_rel = [1..2], default 1.0
+   *    }
+   *    f_p_i_rel = sum (f_k_p_i_rel) / #k
+   * }
+   *
+   **/
 
-  /* Recalcalculate total preference for this quality kind over all peers*/
-  cur->f_total[kind] = 0;
-  for (p_cur = cur->p_head; NULL != p_cur; p_cur = p_cur->next)
-    cur->f_total[kind] += p_cur->f[kind];
+  /* For this client: for all preferences, except TERMINATOR */
+  for (kind = GNUNET_ATS_PREFERENCE_END + 1 ; kind < 
GNUNET_ATS_PreferenceCount; kind ++)
+  {
+         /* Recalcalculate total preference for this quality kind over all 
peers*/
+         c_cur->f_total[kind] = 0;
+         for (p_cur = c_cur->p_head; NULL != p_cur; p_cur = p_cur->next)
+               c_cur->f_total[kind] += p_cur->f[kind];
 
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "Client %p has total preference for %s of 
%.3f\n",
-      cur->client,
-      GNUNET_ATS_print_preference_type (kind),
-      cur->f_total[kind]);
+         LOG (GNUNET_ERROR_TYPE_DEBUG, "Client %p has total preference for %s 
of %.3f\n",
+                       c_cur->client,
+             GNUNET_ATS_print_preference_type (kind),
+             c_cur->f_total[kind]);
 
-  /* Recalcalculate relative preference for all peers */
-  for (p_cur = cur->p_head; NULL != p_cur; p_cur = p_cur->next)
-  {
-    /* Calculate relative preference for specific kind */
-    p_cur->f_rel[kind] = (cur->f_total[kind] + p_cur->f[kind]) / 
cur->f_total[kind];
-    LOG (GNUNET_ERROR_TYPE_DEBUG, "Client %p: peer `%s' has relative 
preference for %s of %.3f\n",
-        cur->client,
-        GNUNET_i2s (&p_cur->id),
-        GNUNET_ATS_print_preference_type (kind),
-        p_cur->f_rel[kind]);
+         /* Recalcalculate relative preference for all peers */
+         for (p_cur = c_cur->p_head; NULL != p_cur; p_cur = p_cur->next)
+         {
+           /* Calculate relative preference for specific kind */
+               if (0.0 == c_cur->f_total[kind])
+               {
+                               /* No one has preference, so set default 
preference */
+                               p_cur->f_rel[kind] = DEFAULT_PREFERENCE;
+               }
+               else
+               {
+                               p_cur->f_rel[kind] = (c_cur->f_total[kind] + 
p_cur->f[kind]) / c_cur->f_total[kind];
+               }
+           LOG (GNUNET_ERROR_TYPE_DEBUG, "Client %p: peer `%s' has relative 
preference for %s of %.3f\n",
+                       c_cur->client,
+               GNUNET_i2s (&p_cur->id),
+               GNUNET_ATS_print_preference_type (kind),
+               p_cur->f_rel[kind]);
 
-    /* Calculate peer relative preference
-     * Start with i = 1 to exclude terminator */
-    p_cur->f_rel_total = 0;
-    for (i = 1; i < GNUNET_ATS_PreferenceCount; i ++)
-    {
-        p_cur->f_rel_total += p_cur->f_rel[i];
-    }
-    p_cur->f_rel_total /=  (GNUNET_ATS_PreferenceCount - 1.0); /* -1 due to 
terminator */
-    LOG (GNUNET_ERROR_TYPE_DEBUG, "Client %p: peer `%s' has total relative 
preference of %.3f\n",
-        cur->client,
-        GNUNET_i2s (&p_cur->id),
-        p_cur->f_rel_total);
+           /* Calculate peer relative preference */
+           /* Start with kind = 1 to exclude terminator */
+           p_cur->f_rel_total = 0;
+           for (rkind = GNUNET_ATS_PREFERENCE_END + 1; rkind < 
GNUNET_ATS_PreferenceCount; rkind ++)
+           {
+               p_cur->f_rel_total += p_cur->f_rel[rkind];
+           }
+           p_cur->f_rel_total /=  (GNUNET_ATS_PreferenceCount - 1.0); /* -1 
due to terminator */
+           LOG (GNUNET_ERROR_TYPE_DEBUG, "Client %p: peer `%s' has total 
relative preference of %.3f\n",
+                       c_cur->client,
+               GNUNET_i2s (&p_cur->id),
+               p_cur->f_rel_total);
+         }
   }
 
   /* Calculcate global total relative peer preference over all clients */
   p_rel_global = 0.0;
   clients = 0;
-  for (cur = s->pc_head; NULL != cur; cur = cur->next)
+  for (c_cur = s->pc_head; NULL != c_cur; c_cur = c_cur->next)
   {
-      for (p_cur = cur->p_head; NULL != p_cur; p_cur = p_cur->next)
+      for (p_cur = c_cur->p_head; NULL != p_cur; p_cur = p_cur->next)
           if (0 == memcmp (&p_cur->id, &p->id, sizeof (p_cur->id)))
               break;
       if (NULL != p_cur)
@@ -1169,17 +1208,57 @@
   }
 }
 
+static void
+update_preference (struct PreferencePeer *p,
+                                                                        enum 
GNUNET_ATS_PreferenceKind kind,
+                                                        float score_f)
+{
+       double score = score_f;
 
+  /* Update preference value according to type */
+  switch (kind) {
+    case GNUNET_ATS_PREFERENCE_BANDWIDTH:
+    case GNUNET_ATS_PREFERENCE_LATENCY:
+      p->f[kind] = (p->f[kind] + score) / 2;
+      break;
+    case GNUNET_ATS_PREFERENCE_END:
+      break;
+    default:
+      break;
+  }
+  recalculate_preferences(p);
+  update_all_networks (p->s);
+}
+
+
 static void
 preference_aging (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
+       int i;
+       double backup;
        struct PreferencePeer *p = cls;
        GNUNET_assert (NULL != p);
+
+
        p->aging_task = GNUNET_SCHEDULER_NO_TASK;
 
-/*  LOG (GNUNET_ERROR_TYPE_ERROR, "Aging preferences for peer `%s'\n",
-               GNUNET_i2s (&p->id));*/
+  LOG (GNUNET_ERROR_TYPE_ERROR, "Aging preferences for peer `%s'\n",
+               GNUNET_i2s (&p->id));
 
+  for (i = 0; i < GNUNET_ATS_PreferenceCount; i++)
+  {
+               if (p->f[1] > 1.0)
+               {
+                       backup = p->f[i];
+                       p->f[i] *= PREF_AGING_FACTOR;
+                       LOG (GNUNET_ERROR_TYPE_ERROR, "Aged preference for peer 
`%s' from %.3f to %.3f\n",
+                       GNUNET_i2s (&p->id), backup, p->f[i]);
+               }
+  }
+
+  recalculate_preferences (p);
+  update_all_networks (p->s);
+
   p->aging_task = GNUNET_SCHEDULER_add_delayed (PREF_AGING_INTERVAL,
                &preference_aging, p);
 }
@@ -1203,8 +1282,8 @@
 {
   static struct GNUNET_TIME_Absolute next_update;
   struct GAS_SIMPLISTIC_Handle *s = solver;
-  struct PreferenceClient *cur;
-  struct PreferencePeer *p;
+  struct PreferenceClient *c_cur;
+  struct PreferencePeer *p_cur;
   int i;
 
   GNUNET_assert (NULL != solver);
@@ -1223,72 +1302,45 @@
       return;
   }
 
-  /**
-   * Idea:
-   *
-   * We have:
-   * Set of clients c
-   * Set of peers p_i in P
-   * Set of preference kinds k
-   * A preference value f_k_p_i with an unknown range
-   *
-   * We get:
-   * A client specific relative preference f_p_i_rel [1..2] for all peers
-   *
-   * For every client c
-   * {
-   *   For every preference kind k:
-   *   {
-   *     We remember for the preference f_p_i for each peer p_i.
-   *     We have a default preference value f_p_i = 0
-   *     We have a sum of all preferences f_t = sum (f_p_i)
-   *     So we can calculate a relative preference value fr_p_i:
-   *
-   *     f_k_p_i_rel = (f_t + f_p_i) / f_t
-   *     f_k_p_i_rel = [1..2], default 1.0
-   *    }
-   *    f_p_i_rel = sum (f_k_p_i_rel) / #k
-   * }
-   *
-   **/
-
   /* Find preference client */
-  for (cur = s->pc_head; NULL != cur; cur = cur->next)
+  for (c_cur = s->pc_head; NULL != c_cur; c_cur = c_cur->next)
   {
-      if (client == cur->client)
+      if (client == c_cur->client)
         break;
   }
   /* Not found: create new preference client */
-  if (NULL == cur)
+  if (NULL == c_cur)
   {
-    cur = GNUNET_malloc (sizeof (struct PreferenceClient));
-    cur->client = client;
-    GNUNET_CONTAINER_DLL_insert (s->pc_head, s->pc_tail, cur);
+    c_cur = GNUNET_malloc (sizeof (struct PreferenceClient));
+    c_cur->client = client;
+    GNUNET_CONTAINER_DLL_insert (s->pc_head, s->pc_tail, c_cur);
   }
 
   /* Find entry for peer */
-  for (p = cur->p_head; NULL != p; p = p->next)
-    if (0 == memcmp (&p->id, peer, sizeof (p->id)))
+  for (p_cur = c_cur->p_head; NULL != p_cur; p_cur = p_cur->next)
+    if (0 == memcmp (&p_cur->id, peer, sizeof (p_cur->id)))
         break;
 
   /* Not found: create new peer entry */
-  if (NULL == p)
+  if (NULL == p_cur)
   {
-      p = GNUNET_malloc (sizeof (struct PreferencePeer));
-      p->id = (*peer);
+      p_cur = GNUNET_malloc (sizeof (struct PreferencePeer));
+      p_cur->s = s;
+      p_cur->client = c_cur;
+      p_cur->id = (*peer);
       for (i = 0; i < GNUNET_ATS_PreferenceCount; i++)
       {
         /* Default value per peer absolut preference for a quality:
          * No value set, so absolute preference 0 */
-        p->f[i] = 0.0;
+        p_cur->f[i] = 0.0;
         /* Default value per peer relative preference for a quality: 1.0 */
-        p->f_rel[i] = DEFAULT_PREFERENCE;
+        p_cur->f_rel[i] = DEFAULT_PREFERENCE;
       }
-      p->aging_task = GNUNET_SCHEDULER_add_delayed (PREF_AGING_INTERVAL, 
&preference_aging, p);
-      GNUNET_CONTAINER_DLL_insert (cur->p_head, cur->p_tail, p);
+      p_cur->aging_task = GNUNET_SCHEDULER_add_delayed (PREF_AGING_INTERVAL, 
&preference_aging, p_cur);
+      GNUNET_CONTAINER_DLL_insert (c_cur->p_head, c_cur->p_tail, p_cur);
   }
 
-  update_preference (s, cur, p, kind, score_f);
+  update_preference (p_cur, kind, score_f);
 
   /* FIXME: We should update quotas if UPDATE_INTERVAL is reached */
   if (GNUNET_TIME_absolute_get().abs_value > next_update.abs_value)




reply via email to

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