stats for datacache
authorChristian Grothoff <christian@grothoff.org>
Wed, 28 Apr 2010 11:33:29 +0000 (11:33 +0000)
committerChristian Grothoff <christian@grothoff.org>
Wed, 28 Apr 2010 11:33:29 +0000 (11:33 +0000)
TODO
src/datacache/Makefile.am
src/datacache/datacache.c

diff --git a/TODO b/TODO
index 3db19b785c30503df68129055dbdbb6895940f92..40459713829f70bdf851a154fc405888a79f0dbd 100644 (file)
--- a/TODO
+++ b/TODO
@@ -169,7 +169,7 @@ Optimizations:
   - should use hash map to look up Neighbours (service AND plugins!)
 * HOSTLIST:
   - 'server' uses 'GNUNET_PEERINFO_iterate', should probably switch to notification API
-    (for more instant / up-to-date hostlists at lower cost)
+    (for more instant / up-to-date hostlists at lower cost) [done by MW?]
 * DATASTORE (?):
   - check for duplicates on insertion (currently, same content is frequently
     stored again [seen with KBLOCKS and SBLOCKS]!)
@@ -185,9 +185,5 @@ Minor features:
   - [./transport/plugin_transport_tcp.c:391]: (style) struct or union member 'Plugin::address_update_task' is never used (related to issue above)
 * TRANSPORT:
   - [./transport/gnunet-service-transport.c:173]: (style) struct or union member 'TransportPlugin::rebuild' is never used (related to TCP not refreshing external addresses?)
-* DATACACHE:
-  - add stats (# bytes available, # bytes used, # PUTs, # GETs, # GETs satisfied)
-* FS:
-  - support inline data in directories for recursive file downloads (fs_download)
 * BLOCKS:
   - testcase would be nice...
index 5e01fe03e9a0b4b012e041e11b817c0f387d6574..564af9f28343efe3ba9c821b95e9c85334daeae4 100644 (file)
@@ -18,6 +18,7 @@ lib_LTLIBRARIES = \
 libgnunetdatacache_la_SOURCES = \
   datacache.c plugin_datacache.h
 libgnunetdatacache_la_LIBADD = \
+  $(top_builddir)/src/statistics/libgnunetstatistics.la \
   $(top_builddir)/src/util/libgnunetutil.la \
   $(GN_LIBINTL) 
 libgnunetdatacache_la_LDFLAGS = \
index 4c474e9bade202020b4ba08387cb05eb07b62b5d..0ad9b9df4071a9eaed85f03028b28af1813d9743 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet
-     (C) 2004, 2005, 2006, 2007, 2009 Christian Grothoff (and other contributing authors)
+     (C) 2004, 2005, 2006, 2007, 2009, 2010 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
@@ -26,6 +26,7 @@
 #include "platform.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_datacache_lib.h"
+#include "gnunet_statistics_service.h"
 #include "plugin_datacache.h"
 
 /**
@@ -44,6 +45,11 @@ struct GNUNET_DATACACHE_Handle
    */
   const struct GNUNET_CONFIGURATION_Handle *cfg;
 
+  /**
+   * Opaque handle for the statistics service.
+   */
+  struct GNUNET_STATISTICS_Handle *stats;
+
   /**
    * Configuration section to use.
    */
@@ -100,6 +106,10 @@ env_delete_notify (void *cls,
   GNUNET_assert (h->utilization >= size);
   h->utilization -= size;
   GNUNET_CONTAINER_bloomfilter_remove (h->filter, key);
+  GNUNET_STATISTICS_update (h->stats,
+                           gettext_noop ("# bytes stored"),
+                           -size,
+                           GNUNET_NO);
 }
 
 
@@ -157,6 +167,9 @@ GNUNET_DATACACHE_create (struct GNUNET_SCHEDULER_Handle *sched,
     {
       ret->filter = GNUNET_CONTAINER_bloomfilter_load (NULL, bf_size, 5);  /* approx. 3% false positives at max use */  
     }
+  ret->stats = GNUNET_STATISTICS_create (sched,
+                                        "datacache",
+                                        cfg);
   ret->section = GNUNET_strdup (section);
   ret->env.sched = sched;
   ret->env.cfg = cfg;
@@ -204,6 +217,8 @@ void GNUNET_DATACACHE_destroy (struct GNUNET_DATACACHE_Handle *h)
                                  h->bloom_name);
       GNUNET_free (h->bloom_name);
     }
+  GNUNET_STATISTICS_destroy (h->stats,
+                            GNUNET_NO);
   GNUNET_free (h);
 }
 
@@ -237,6 +252,10 @@ GNUNET_DATACACHE_put (struct GNUNET_DATACACHE_Handle *h,
                      discard_time);
   if (used == 0)
     return GNUNET_SYSERR;
+  GNUNET_STATISTICS_update (h->stats,
+                           gettext_noop ("# bytes stored"),
+                           size,
+                           GNUNET_NO);
   GNUNET_CONTAINER_bloomfilter_add (h->filter, key);
   while (h->utilization + used > h->env.quota)
     GNUNET_assert (GNUNET_OK == h->api->del (h->api->cls));
@@ -263,9 +282,19 @@ GNUNET_DATACACHE_get (struct GNUNET_DATACACHE_Handle *h,
                      GNUNET_DATACACHE_Iterator iter,
                      void *iter_cls)
 {
+  GNUNET_STATISTICS_update (h->stats,
+                           gettext_noop ("# requests received"),
+                           1,
+                           GNUNET_NO);
   if (GNUNET_OK != GNUNET_CONTAINER_bloomfilter_test (h->filter,
                                                      key))
-    return 0; /* can not be present */
+    {
+      GNUNET_STATISTICS_update (h->stats,
+                               gettext_noop ("# requests filtered by bloom filter"),
+                               1,
+                               GNUNET_NO);
+      return 0; /* can not be present */
+    } 
   return h->api->get (h->api->cls,
                      key,
                      type,