gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r21005 - gnunet/src/statistics


From: gnunet
Subject: [GNUnet-SVN] r21005 - gnunet/src/statistics
Date: Wed, 18 Apr 2012 11:55:10 +0200

Author: wachs
Date: 2012-04-18 11:55:09 +0200 (Wed, 18 Apr 2012)
New Revision: 21005

Added:
   gnunet/src/statistics/test_statistics_api_watch_zero_value.c
Modified:
   gnunet/src/statistics/Makefile.am
   gnunet/src/statistics/gnunet-service-statistics.c
Log:
fixing bug 2272: added functionality for watch to notifz about fresh created 
entries with value 0


Modified: gnunet/src/statistics/Makefile.am
===================================================================
--- gnunet/src/statistics/Makefile.am   2012-04-18 09:30:06 UTC (rev 21004)
+++ gnunet/src/statistics/Makefile.am   2012-04-18 09:55:09 UTC (rev 21005)
@@ -51,7 +51,8 @@
 check_PROGRAMS = \
  test_statistics_api \
  test_statistics_api_loop \
- test_statistics_api_watch 
+ test_statistics_api_watch \
+ test_statistics_api_watch_zero_value 
 
 if ENABLE_TEST_RUN
 TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
@@ -75,6 +76,12 @@
   $(top_builddir)/src/statistics/libgnunetstatistics.la \
   $(top_builddir)/src/util/libgnunetutil.la  
 
+test_statistics_api_watch_zero_value_SOURCES = \
+ test_statistics_api_watch_zero_value.c
+test_statistics_api_watch_zero_value_LDADD = \
+  $(top_builddir)/src/statistics/libgnunetstatistics.la \
+  $(top_builddir)/src/util/libgnunetutil.la  
+
 check_SCRIPTS = \
   test_gnunet_statistics.sh
 

Modified: gnunet/src/statistics/gnunet-service-statistics.c
===================================================================
--- gnunet/src/statistics/gnunet-service-statistics.c   2012-04-18 09:30:06 UTC 
(rev 21004)
+++ gnunet/src/statistics/gnunet-service-statistics.c   2012-04-18 09:55:09 UTC 
(rev 21005)
@@ -66,6 +66,12 @@
    */
   uint32_t wid;
 
+  /**
+   * Is last_value valid
+   * GNUNET_NO : last_value is n/a, GNUNET_YES: last_value is valid
+   */
+  int last_value_set;
+
 };
 
 
@@ -152,6 +158,12 @@
    */
   int persistent;
 
+  /**
+   * Is this value set?
+   * GNUNET_NO : value is n/a, GNUNET_YES: value is valid
+   */
+  int set;
+
 };
 
 /**
@@ -462,8 +474,15 @@
 
   for (pos = se->we_head; NULL != pos; pos = pos->next)
   {
-    if (pos->last_value == se->value)
-      continue;
+    if (GNUNET_YES == pos->last_value_set)
+    {
+      if (pos->last_value == se->value)
+        continue;
+    }
+    else
+    {
+      pos->last_value_set = GNUNET_YES;
+    }
     wvm.header.type = htons (GNUNET_MESSAGE_TYPE_STATISTICS_WATCH_VALUE);
     wvm.header.size =
       htons (sizeof (struct GNUNET_STATISTICS_WatchValueMessage));
@@ -499,6 +518,7 @@
   uint64_t value;
   int64_t delta;
   int changed;
+  int initial_set;
 
   if ( (NULL != client) &&
        (NULL == make_client_entry (client)) )
@@ -532,6 +552,7 @@
   {
     if (matches (pos, service, name))
     {
+      initial_set = 0;
       if ((flags & GNUNET_STATISTICS_SETFLAG_RELATIVE) == 0)
       {
         changed = (pos->value != value);
@@ -552,6 +573,11 @@
           pos->value += delta;
         }
       }
+      if (GNUNET_NO == pos->set)
+      {
+        pos->set = GNUNET_YES;
+        initial_set = 1;
+      }
       pos->msg->value = GNUNET_htonll (pos->value);
       pos->msg->flags = msg->flags;
       pos->persistent = (0 != (flags & GNUNET_STATISTICS_SETFLAG_PERSISTENT));
@@ -565,7 +591,7 @@
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Statistic `%s:%s' updated to value %llu.\n", service, name,
                   pos->value);
-      if (changed)
+      if ((changed) || (1 == initial_set))
         notify_change (pos);
       GNUNET_SERVER_receive_done (client, GNUNET_OK);
       return;
@@ -577,7 +603,14 @@
   pos->next = start;
   if (((flags & GNUNET_STATISTICS_SETFLAG_RELATIVE) == 0) ||
       (0 < (int64_t) GNUNET_ntohll (msg->value)))
+  {
     pos->value = GNUNET_ntohll (msg->value);
+    pos->set = GNUNET_YES;
+  }
+  else
+  {
+    pos->set = GNUNET_NO;
+  }
   pos->uid = uidgen++;
   pos->persistent = (0 != (flags & GNUNET_STATISTICS_SETFLAG_PERSISTENT));
   pos->msg = (void *) &pos[1];
@@ -652,6 +685,7 @@
                        sizeof (struct GNUNET_STATISTICS_SetMessage) + size);
     pos->next = start;
     pos->uid = uidgen++;
+    pos->set = GNUNET_NO;
     pos->msg = (void *) &pos[1];
     pos->msg->header.size =
         htons (sizeof (struct GNUNET_STATISTICS_SetMessage) + size);
@@ -662,9 +696,13 @@
     pos->name = &pos->service[slen];
     memcpy ((void *) pos->name, name, strlen (name) + 1);
     start = pos;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "New statistic on `%s:%s' with value %llu created.\n", service,
+                name, pos->value);
   }
   we = GNUNET_malloc (sizeof (struct WatchEntry));
   we->client = client;
+  we->last_value_set = GNUNET_NO;
   GNUNET_SERVER_client_keep (client);
   we->wid = ce->max_wid++;
   GNUNET_CONTAINER_DLL_insert (pos->we_head, pos->we_tail, we);

Added: gnunet/src/statistics/test_statistics_api_watch_zero_value.c
===================================================================
--- gnunet/src/statistics/test_statistics_api_watch_zero_value.c                
                (rev 0)
+++ gnunet/src/statistics/test_statistics_api_watch_zero_value.c        
2012-04-18 09:55:09 UTC (rev 21005)
@@ -0,0 +1,196 @@
+/*
+     This file is part of GNUnet.
+     (C) 2009, 2011 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 3, 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 statistics/test_statistics_api_watch_zero_value.c
+ * @brief testcase for statistics_api.c watch functions with initial 0 value
+ */
+#include "platform.h"
+#include "gnunet_common.h"
+#include "gnunet_getopt_lib.h"
+#include "gnunet_os_lib.h"
+#include "gnunet_program_lib.h"
+#include "gnunet_scheduler_lib.h"
+#include "gnunet_statistics_service.h"
+
+#define VERBOSE GNUNET_NO
+
+#define START_SERVICE GNUNET_YES
+
+static int ok;
+static int ok2;
+
+static struct GNUNET_STATISTICS_Handle *h;
+static struct GNUNET_STATISTICS_Handle *h2;
+
+static GNUNET_SCHEDULER_TaskIdentifier shutdown_task;
+
+
+static void
+force_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  fprintf (stderr, "Timeout, failed to receive notifications: %d\n", ok);
+  GNUNET_STATISTICS_destroy (h, GNUNET_NO);
+  GNUNET_STATISTICS_destroy (h2, GNUNET_NO);
+  ok = 7;
+}
+
+
+static void
+normal_shutdown (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  GNUNET_STATISTICS_destroy (h, GNUNET_NO);
+  GNUNET_STATISTICS_destroy (h2, GNUNET_NO);
+}
+
+
+static int
+watch_1 (void *cls, const char *subsystem, const char *name, uint64_t value,
+         int is_persistent)
+{
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received value `%s' `%s' %llu\n",
+      subsystem, name, value);
+  GNUNET_assert (0 == strcmp (name, "test-1"));
+  if ((0 == value) && (3 == ok))
+  {
+    ok--;
+    GNUNET_STATISTICS_set (h, "test-1", 42, GNUNET_NO);
+  }
+
+  if ((42 == value) && (2 == ok))
+  {
+    ok--;
+    GNUNET_STATISTICS_set (h, "test-1", 0, GNUNET_NO);
+  }
+
+  if ((0 == value) && (1 == ok))
+  {
+    ok--;
+  }
+  if ((0 == ok) && (0 == ok2))
+  {
+    GNUNET_SCHEDULER_cancel (shutdown_task);
+    GNUNET_SCHEDULER_add_now (&normal_shutdown, NULL);
+  }
+
+  return GNUNET_OK;
+}
+
+static int
+watch_2 (void *cls, const char *subsystem, const char *name, uint64_t value,
+         int is_persistent)
+{
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received value `%s' `%s' %llu\n",
+      subsystem, name, value);
+
+  GNUNET_assert (0 == strcmp (name, "test-2"));
+  if ((42 == value) && (1 == ok2))
+  {
+    ok2 = 0;
+  }
+  else
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Received unexpected value %llu\n", 
value);
+
+    GNUNET_break (0);
+    GNUNET_SCHEDULER_cancel (shutdown_task);
+    GNUNET_SCHEDULER_add_now (&normal_shutdown, NULL);
+  }
+
+  return GNUNET_OK;
+}
+
+static void
+run (void *cls, char *const *args, const char *cfgfile,
+     const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+  h = GNUNET_STATISTICS_create ("dummy", cfg);
+  h2 = GNUNET_STATISTICS_create ("dummy-2", cfg);
+  GNUNET_assert (GNUNET_OK ==
+                 GNUNET_STATISTICS_watch (h, "dummy",
+                                          "test-1", &watch_1, NULL));
+
+  GNUNET_assert (GNUNET_OK ==
+                 GNUNET_STATISTICS_watch (h2, "dummy-2",
+                                          "test-2", &watch_2, NULL));
+
+  /* Set initial value to 0 */
+  GNUNET_STATISTICS_set (h, "test-1", 0, GNUNET_NO);
+  GNUNET_STATISTICS_set (h2, "test-2", 42, GNUNET_NO);
+
+  shutdown_task =
+      GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES, &force_shutdown,
+                                    NULL);
+}
+
+
+static int
+check ()
+{
+  char *const argv[] = { "test-statistics-api",
+    "-c",
+    "test_statistics_api_data.conf",
+    NULL
+  };
+  struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_OPTION_END
+  };
+#if START_SERVICE
+  struct GNUNET_OS_Process *proc;
+
+  proc =
+    GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, 
"gnunet-service-statistics",
+                               "gnunet-service-statistics",
+#if VERBOSE
+                               "-L", "DEBUG",
+#endif
+                               "-c", "test_statistics_api_data.conf", NULL);
+#endif
+  GNUNET_assert (NULL != proc);
+  ok = 3;
+  ok2 = 1;
+  GNUNET_PROGRAM_run (3, argv, "test-statistics-api", "nohelp", options, &run,
+                      NULL);
+#if START_SERVICE
+  if (0 != GNUNET_OS_process_kill (proc, SIGTERM))
+  {
+    GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
+    ok = 1;
+  }
+  GNUNET_OS_process_wait (proc);
+  GNUNET_OS_process_close (proc);
+  proc = NULL;
+#endif
+  if ((0 == ok) && (0 == ok2))
+    return 0;
+  else
+    return 1;
+}
+
+int
+main (int argc, char *argv[])
+{
+  int ret;
+
+  ret = check ();
+
+  return ret;
+}
+
+/* end of test_statistics_api_watch_zero_value.c */




reply via email to

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