gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r27254 - gnunet/src/experimentation


From: gnunet
Subject: [GNUnet-SVN] r27254 - gnunet/src/experimentation
Date: Wed, 22 May 2013 14:19:53 +0200

Author: wachs
Date: 2013-05-22 14:19:53 +0200 (Wed, 22 May 2013)
New Revision: 27254

Modified:
   gnunet/src/experimentation/gnunet-daemon-experimentation.c
Log:
changes


Modified: gnunet/src/experimentation/gnunet-daemon-experimentation.c
===================================================================
--- gnunet/src/experimentation/gnunet-daemon-experimentation.c  2013-05-22 
10:51:49 UTC (rev 27253)
+++ gnunet/src/experimentation/gnunet-daemon-experimentation.c  2013-05-22 
12:19:53 UTC (rev 27254)
@@ -26,16 +26,18 @@
  */
 #include "platform.h"
 #include "gnunet_getopt_lib.h"
-#include "gnunet_container_lib.h"
-#include "gnunet_program_lib.h"
+#include "gnunet_util_lib.h"
 #include "gnunet_core_service.h"
+#include "gnunet_statistics_service.h"
 
-#define EXP_RESPONSE_TIMEOUT GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 10)
+#define EXP_RESPONSE_TIMEOUT GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 2)
 
 static struct GNUNET_CORE_Handle *ch;
 
 static struct GNUNET_PeerIdentity me;
 
+static struct GNUNET_STATISTICS_Handle *stats;
+
 /**
  * A experimentation node
  */
@@ -44,8 +46,16 @@
        struct GNUNET_PeerIdentity id;
 
        GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+
+       struct GNUNET_CORE_TransmitHandle *cth;
 };
 
+
+struct Experimentation_Request
+{
+       struct GNUNET_MessageHeader msg;
+};
+
 /**
  * Nodes with a pending request
  */
@@ -64,6 +74,31 @@
 struct GNUNET_CONTAINER_MultiHashMap *nodes_inactive;
 
 
+static void update_stats (struct GNUNET_CONTAINER_MultiHashMap *m)
+{
+       GNUNET_assert (NULL != m);
+       GNUNET_assert (NULL != stats);
+
+       if (m == nodes_active)
+       {
+                       GNUNET_STATISTICS_set (stats, "# nodes active",
+                                       GNUNET_CONTAINER_multihashmap_size(m), 
GNUNET_NO);
+       }
+       else if (m == nodes_inactive)
+       {
+                       GNUNET_STATISTICS_set (stats, "# nodes inactive",
+                                       GNUNET_CONTAINER_multihashmap_size(m), 
GNUNET_NO);
+       }
+       else if (m == nodes_requested)
+       {
+                       GNUNET_STATISTICS_set (stats, "# nodes requested",
+                                       GNUNET_CONTAINER_multihashmap_size(m), 
GNUNET_NO);
+       }
+       else
+               GNUNET_break (0);
+
+}
+
 static int
 cleanup_nodes (void *cls,
                                                         const struct 
GNUNET_HashCode * key,
@@ -78,7 +113,13 @@
                GNUNET_SCHEDULER_cancel (n->timeout_task);
                n->timeout_task = GNUNET_SCHEDULER_NO_TASK;
        }
+       if (NULL != n->cth)
+       {
+               GNUNET_CORE_notify_transmit_ready_cancel (n->cth);
+               n->cth = NULL;
+       }
 
+
        GNUNET_CONTAINER_multihashmap_remove (cur, key, value);
        GNUNET_free (value);
        return GNUNET_OK;
@@ -105,6 +146,7 @@
                GNUNET_CONTAINER_multihashmap_iterate (nodes_requested,
                                                                                
                                                                                
         &cleanup_nodes,
                                                                                
                                                                                
         nodes_requested);
+               update_stats (nodes_requested);
                GNUNET_CONTAINER_multihashmap_destroy (nodes_requested);
                nodes_requested = NULL;
   }
@@ -114,6 +156,7 @@
                GNUNET_CONTAINER_multihashmap_iterate (nodes_active,
                                                                                
                                                                                
         &cleanup_nodes,
                                                                                
                                                                                
         nodes_active);
+               update_stats (nodes_active);
                GNUNET_CONTAINER_multihashmap_destroy (nodes_active);
                nodes_active = NULL;
   }
@@ -123,9 +166,16 @@
                GNUNET_CONTAINER_multihashmap_iterate (nodes_inactive,
                                                                                
                                                                                
         &cleanup_nodes,
                                                                                
                                                                                
         nodes_inactive);
+               update_stats (nodes_inactive);
                GNUNET_CONTAINER_multihashmap_destroy (nodes_inactive);
                nodes_inactive = NULL;
   }
+
+  if (NULL != stats)
+  {
+               GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
+               stats = NULL;
+  }
 }
 
 static int is_me (const struct GNUNET_PeerIdentity *id)
@@ -149,18 +199,74 @@
 {
        struct Node *n = cls;
 
+       GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Removing request for peer %s due 
to timeout\n"),
+                       GNUNET_i2s (&n->id));
+
        if (GNUNET_NO == GNUNET_CONTAINER_multihashmap_contains 
(nodes_requested, &n->id.hashPubKey))
                        GNUNET_break (0);
        else
        {
                        GNUNET_CONTAINER_multihashmap_remove (nodes_requested, 
&n->id.hashPubKey, n);
+                       update_stats (nodes_requested);
                        GNUNET_CONTAINER_multihashmap_put (nodes_inactive, 
&n->id.hashPubKey, n,
                                        
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
+                       update_stats (nodes_inactive);
                        n->timeout_task = GNUNET_SCHEDULER_NO_TASK;
+                       if (NULL != n->cth)
+                       {
+                               GNUNET_CORE_notify_transmit_ready_cancel 
(n->cth);
+                               n->cth = NULL;
+                       }
        }
 }
 
 
+size_t send_request_cb (void *cls, size_t bufsize, void *buf)
+{
+       struct Node *n = cls;
+       struct Experimentation_Request msg;
+       size_t size = sizeof (msg);
+
+       n->cth = NULL;
+  if (buf == NULL)
+  {
+    /* client disconnected */
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client disconnected\n");
+    if (GNUNET_SCHEDULER_NO_TASK != n->timeout_task)
+               GNUNET_SCHEDULER_cancel (n->timeout_task);
+    GNUNET_SCHEDULER_add_now (&remove_request, n);
+    return 0;
+  }
+  GNUNET_assert (bufsize >= size);
+
+       msg.msg.size = htons (size);
+       msg.msg.type = htons (GNUNET_MESSAGE_TYPE_EXPERIMENTATION_REQUEST);
+       memcpy (buf, &msg, size);
+
+       GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Sending request to peer %s\n"),
+                       GNUNET_i2s (&n->id));
+       return size;
+}
+
+static void send_request (const struct GNUNET_PeerIdentity *peer)
+{
+       struct Node *n;
+       size_t size;
+
+       size = sizeof (struct Experimentation_Request);
+       n = GNUNET_malloc (sizeof (struct Node));
+       n->id = *peer;
+       n->timeout_task = GNUNET_SCHEDULER_add_delayed (EXP_RESPONSE_TIMEOUT, 
&remove_request, n);
+       n->cth = GNUNET_CORE_notify_transmit_ready(ch, GNUNET_NO, 0,
+                                                               
GNUNET_TIME_relative_get_forever_(),
+                                                               peer, size, 
send_request_cb, n);
+
+       GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put 
(nodes_requested,
+                       &peer->hashPubKey, n, 
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST));
+
+       update_stats (nodes_requested);
+}
+
 /**
  * Method called whenever a given peer connects.
  *
@@ -168,10 +274,8 @@
  * @param peer peer identity this notification is about
  */
 void core_connect_handler (void *cls,
-                           const struct GNUNET_PeerIdentity * peer)
+                           const struct GNUNET_PeerIdentity *peer)
 {
-       struct Node *n;
-
        if (GNUNET_YES == is_me(peer))
                return;
 
@@ -182,24 +286,13 @@
                return; /* We already sent a request */
 
        if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (nodes_active, 
&peer->hashPubKey))
-               return; /*This peer is known as active  */
+               return; /* This peer is known as active  */
 
        if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains 
(nodes_inactive, &peer->hashPubKey))
-               return; /*This peer is known as inactive  */
+               return; /* This peer is known as inactive  */
 
-       /* Send request */
-       GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Sending request to peer %s\n"),
-                       GNUNET_i2s (peer));
+       send_request (peer);
 
-       n = GNUNET_malloc (sizeof (struct Node));
-       n->id = *peer;
-       n->timeout_task = GNUNET_SCHEDULER_add_delayed (EXP_RESPONSE_TIMEOUT, 
&remove_request, n);
-
-       GNUNET_assert (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put 
(nodes_requested,
-                       &peer->hashPubKey, n, 
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST));
-
-
-
 }
 
 
@@ -232,9 +325,12 @@
 {
        GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Experimentation daemon starting 
...\n"));
 
-       nodes_requested = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
-       nodes_active = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
-       nodes_inactive = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
+       stats = GNUNET_STATISTICS_create ("experimentation", cfg);
+       if (NULL == stats)
+       {
+               GNUNET_log (GNUNET_ERROR_TYPE_WARNING, _("Failed to create 
statistics!\n"));
+               return;
+       }
 
        /* Connecting to core service to find partners */
        ch = GNUNET_CORE_connect (cfg, NULL,
@@ -248,6 +344,10 @@
                        return;
        }
 
+       nodes_requested = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
+       nodes_active = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
+       nodes_inactive = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO);
+
   GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &cleanup_task,
                                 NULL);
 




reply via email to

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