[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r26938 - in gnunet/src: include testbed,
gnunet <=