gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r26938 - in gnunet/src: include testbed


From: gnunet
Subject: [GNUnet-SVN] r26938 - in gnunet/src: include testbed
Date: Thu, 18 Apr 2013 17:52:22 +0200

Author: harsha
Date: 2013-04-18 17:52:22 +0200 (Thu, 18 Apr 2013)
New Revision: 26938

Added:
   gnunet/src/testbed/gnunet-service-testbed-logger.c
Modified:
   gnunet/src/include/gnunet_protocols.h
   gnunet/src/testbed/Makefile.am
   gnunet/src/testbed/gnunet-service-testbed.c
Log:
- logger service for aggregating stat data from testbed peers


Modified: gnunet/src/include/gnunet_protocols.h
===================================================================
--- gnunet/src/include/gnunet_protocols.h       2013-04-18 15:51:31 UTC (rev 
26937)
+++ gnunet/src/include/gnunet_protocols.h       2013-04-18 15:52:22 UTC (rev 
26938)
@@ -1811,17 +1811,24 @@
  */
 #define GNUNET_MESSAGE_TYPE_SET_REQUEST 578
 
-
 /**
  * Evaluate a set operation
  */
 #define GNUNET_MESSAGE_TYPE_SET_CREATE 579
 
 
+/*******************************************************************************
+ * TESTBED LOGGER message types
+ 
******************************************************************************/
+
 /**
- *  Next available: 600
+ * Message for TESTBED LOGGER
  */
+#define GNUNET_MESSAGE_TYPE_TESTBED_LOGGER_MSG 600
 
+/**
+ *  Next available: 605
+ */
 
 
/*******************************************************************************
  * TODO: we need a way to register message types centrally (via some webpage).

Modified: gnunet/src/testbed/Makefile.am
===================================================================
--- gnunet/src/testbed/Makefile.am      2013-04-18 15:51:31 UTC (rev 26937)
+++ gnunet/src/testbed/Makefile.am      2013-04-18 15:52:22 UTC (rev 26938)
@@ -23,7 +23,8 @@
 
 libexec_PROGRAMS = \
   gnunet-service-testbed \
-  gnunet-helper-testbed
+  gnunet-helper-testbed \
+  gnunet-service-testbed-logger
 
 bin_PROGRAMS = \
   $(ll_binaries) \
@@ -49,6 +50,11 @@
 gnunet_service_testbed_DEPENDENCIES = \
  libgnunettestbed.la
 
+gnunet_service_testbed_logger_SOURCES = \
+  gnunet-service-testbed-logger.c
+gnunet_service_testbed_logger_LDADD = \
+ $(top_builddir)/src/util/libgnunetutil.la
+
 gnunet_testbed_profiler_SOURCES = \
   gnunet-testbed-profiler.c
 gnunet_testbed_profiler_LDADD = $(XLIB) \

Added: gnunet/src/testbed/gnunet-service-testbed-logger.c
===================================================================
--- gnunet/src/testbed/gnunet-service-testbed-logger.c                          
(rev 0)
+++ gnunet/src/testbed/gnunet-service-testbed-logger.c  2013-04-18 15:52:22 UTC 
(rev 26938)
@@ -0,0 +1,264 @@
+/*
+  This file is part of GNUnet.
+  (C) 2008--2013 Christian Grothoff (and other contributing authors)
+
+  GNUnet is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2, or (at your
+  option) any later version.
+
+  GNUnet is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with GNUnet; see the file COPYING.  If not, write to the
+  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+  Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file testbed/gnunet-service-testbed-logger.c
+ * @brief service for collecting messages and writing to a file
+ * @author Sree Harsha Totakura
+ */
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+/**
+ * Generic logging shorthand
+ */
+#define LOG(type, ...)                         \
+  GNUNET_log (type, __VA_ARGS__)
+
+/**
+ * Debug logging shorthand
+ */
+#define LOG_DEBUG(...)                          \
+  LOG (GNUNET_ERROR_TYPE_DEBUG, __VA_ARGS__)
+
+/**
+ * The message queue for sending messages to clients
+ */
+struct MessageQueue
+{
+  /**
+   * The message to be sent
+   */
+  struct GNUNET_MessageHeader *msg;
+
+  /**
+   * The client to send the message to
+   */
+  struct GNUNET_SERVER_Client *client;
+
+  /**
+   * next pointer for DLL
+   */
+  struct MessageQueue *next;
+
+  /**
+   * prev pointer for DLL
+   */
+  struct MessageQueue *prev;
+};
+
+/**
+ * Current Transmit Handle; NULL if no notify transmit exists currently
+ */
+static struct GNUNET_SERVER_TransmitHandle *transmit_handle;
+
+/**
+ * The message queue head
+ */
+static struct MessageQueue *mq_head;
+
+/**
+ * The message queue tail
+ */
+static struct MessageQueue *mq_tail;
+
+/**
+ * Handle for buffered writing.
+ */
+struct GNUNET_BIO_WriteHandle *bio;
+
+/**
+ * The shutdown task handle
+ */
+static GNUNET_SCHEDULER_TaskIdentifier shutdown_task_id;
+
+
+/**
+ * Function called to notify a client about the connection begin ready to queue
+ * more data.  "buf" will be NULL and "size" zero if the connection was closed
+ * for writing in the meantime.
+ *
+ * @param cls NULL
+ * @param size number of bytes available in buf
+ * @param buf where the callee should write the message
+ * @return number of bytes written to buf
+ */
+static size_t
+transmit_ready_notify (void *cls, size_t size, void *buf)
+{
+  struct MessageQueue *mq_entry;
+
+  transmit_handle = NULL;
+  mq_entry = mq_head;
+  GNUNET_assert (NULL != mq_entry);
+  if (0 == size)
+    return 0;
+  GNUNET_assert (ntohs (mq_entry->msg->size) <= size);
+  size = ntohs (mq_entry->msg->size);
+  memcpy (buf, mq_entry->msg, size);
+  GNUNET_free (mq_entry->msg);
+  GNUNET_SERVER_client_drop (mq_entry->client);
+  GNUNET_CONTAINER_DLL_remove (mq_head, mq_tail, mq_entry);
+  GNUNET_free (mq_entry);
+  mq_entry = mq_head;
+  if (NULL != mq_entry)
+    transmit_handle =
+        GNUNET_SERVER_notify_transmit_ready (mq_entry->client,
+                                             ntohs (mq_entry->msg->size),
+                                             GNUNET_TIME_UNIT_FOREVER_REL,
+                                             &transmit_ready_notify, NULL);
+  return size;
+}
+
+
+/**
+ * Queues a message in send queue for sending to the service
+ *
+ * @param client the client to whom the queued message has to be sent
+ * @param msg the message to queue
+ */
+void
+queue_message (struct GNUNET_SERVER_Client *client,
+                   struct GNUNET_MessageHeader *msg)
+{
+  struct MessageQueue *mq_entry;
+  uint16_t type;
+  uint16_t size;
+
+  type = ntohs (msg->type);
+  size = ntohs (msg->size);
+  mq_entry = GNUNET_malloc (sizeof (struct MessageQueue));
+  mq_entry->msg = msg;
+  mq_entry->client = client;
+  GNUNET_SERVER_client_keep (client);
+  LOG_DEBUG ("Queueing message of type %u, size %u for sending\n", type,
+             ntohs (msg->size));
+  GNUNET_CONTAINER_DLL_insert_tail (mq_head, mq_tail, mq_entry);
+  if (NULL == transmit_handle)
+    transmit_handle =
+        GNUNET_SERVER_notify_transmit_ready (client, size,
+                                             GNUNET_TIME_UNIT_FOREVER_REL,
+                                             &transmit_ready_notify, NULL);
+}
+
+
+/**
+ * Message handler for GNUNET_MESSAGE_TYPE_TESTBED_ADDHOST messages
+ *
+ * @param cls NULL
+ * @param client identification of the client
+ * @param message the actual message
+ */
+static void
+handle_log_msg (void *cls, struct GNUNET_SERVER_Client *client,
+                const struct GNUNET_MessageHeader *msg)
+{
+  uint16_t ms;
+
+  ms = ntohs (msg->size);
+  ms -= sizeof (struct GNUNET_MessageHeader);
+  GNUNET_BIO_write (bio, &msg[1], ms);
+  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+}
+
+
+/**
+ * Task to clean up and shutdown nicely
+ *
+ * @param cls NULL
+ * @param tc the TaskContext from scheduler
+ */
+static void
+shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct MessageQueue *mq_entry;
+
+  shutdown_task_id = GNUNET_SCHEDULER_NO_TASK;
+  if (NULL != transmit_handle)
+    GNUNET_SERVER_notify_transmit_ready_cancel (transmit_handle);
+  while (NULL != (mq_entry = mq_head))
+  {
+    GNUNET_free (mq_entry->msg);
+    GNUNET_SERVER_client_drop (mq_entry->client);
+    GNUNET_CONTAINER_DLL_remove (mq_head, mq_tail, mq_entry);
+    GNUNET_free (mq_entry);
+  }
+  GNUNET_BIO_write_close (bio);
+}
+
+
+/**
+ * Testbed setup
+ *
+ * @param cls closure
+ * @param server the initialized server
+ * @param cfg configuration to use
+ */
+static void
+logger_run (void *cls, struct GNUNET_SERVER_Handle *server,
+             const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+  static const struct GNUNET_SERVER_MessageHandler message_handlers[] = {
+    {&handle_log_msg, NULL, GNUNET_MESSAGE_TYPE_TESTBED_LOGGER_MSG, 0},
+    {NULL, NULL, 0, 0}
+  };
+  char *dir;
+  char *fn;
+  pid_t pid;
+
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_filename (cfg, "TESTBED-LOGGER", "DIR",
+                                               &dir))
+  {
+    LOG (GNUNET_ERROR_TYPE_ERROR, "Not logging directory definied.  
Exiting\n");    
+    return;
+  }
+  pid = getpid ();
+  (void) GNUNET_asprintf (&fn, "%s/%jd.dat", dir, (intmax_t) pid);
+  GNUNET_free (dir);
+  if (NULL == (bio = GNUNET_BIO_write_open (fn)))
+  {
+    GNUNET_free (fn);
+    return;
+  }
+  GNUNET_free (fn);
+  GNUNET_SERVER_add_handlers (server, message_handlers);
+  shutdown_task_id =
+      GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
+                                    &shutdown_task, NULL);
+  LOG_DEBUG ("TESTBED-LOGGER startup complete\n");
+}
+
+
+/**
+ * The starting point of execution
+ */
+int
+main (int argc, char *const *argv)
+{
+  //sleep (15);                 /* Debugging */
+  return (GNUNET_OK ==
+          GNUNET_SERVICE_run (argc, argv, "testbed-logger", 
+                              GNUNET_SERVICE_OPTION_NONE,
+                              &logger_run, NULL)) ? 0 : 1;
+}
+
+/* end of gnunet-service-testbed.c */

Modified: gnunet/src/testbed/gnunet-service-testbed.c
===================================================================
--- gnunet/src/testbed/gnunet-service-testbed.c 2013-04-18 15:51:31 UTC (rev 
26937)
+++ gnunet/src/testbed/gnunet-service-testbed.c 2013-04-18 15:52:22 UTC (rev 
26938)
@@ -953,7 +953,7 @@
      sizeof (struct GNUNET_TESTBED_SlaveGetConfigurationMessage)},
     {&GST_handle_shutdown_peers, NULL, 
GNUNET_MESSAGE_TYPE_TESTBED_SHUTDOWN_PEERS,
      sizeof (struct GNUNET_TESTBED_ShutdownPeersMessage)},
-    {NULL}
+    {NULL, NULL, 0, 0}
   };
   char *logfile;
   unsigned long long num;




reply via email to

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