gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r33946 - in gnunet/src: include peerstore sensor sensordash


From: gnunet
Subject: [GNUnet-SVN] r33946 - in gnunet/src: include peerstore sensor sensordashboard
Date: Wed, 9 Jul 2014 16:46:56 +0200

Author: otarabai
Date: 2014-07-09 16:46:56 +0200 (Wed, 09 Jul 2014)
New Revision: 33946

Added:
   gnunet/src/peerstore/test_peerstore_api_sync.c
Modified:
   gnunet/src/include/gnunet_peerstore_service.h
   gnunet/src/peerstore/
   gnunet/src/peerstore/Makefile.am
   gnunet/src/peerstore/gnunet-peerstore.c
   gnunet/src/peerstore/peerstore_api.c
   gnunet/src/peerstore/perf_peerstore_store.c
   gnunet/src/peerstore/test_peerstore_api_iterate.c
   gnunet/src/peerstore/test_peerstore_api_store.c
   gnunet/src/peerstore/test_peerstore_api_watch.c
   gnunet/src/sensor/gnunet-service-sensor-analysis.c
   gnunet/src/sensor/gnunet-service-sensor-reporting.c
   gnunet/src/sensor/gnunet-service-sensor.c
   gnunet/src/sensordashboard/gnunet-service-sensordashboard.c
Log:
Added flag to API disconnect method to send pending store requests before 
disconnecting.
Added a test case for it.


Modified: gnunet/src/include/gnunet_peerstore_service.h
===================================================================
--- gnunet/src/include/gnunet_peerstore_service.h       2014-07-09 14:07:13 UTC 
(rev 33945)
+++ gnunet/src/include/gnunet_peerstore_service.h       2014-07-09 14:46:56 UTC 
(rev 33946)
@@ -133,12 +133,14 @@
 GNUNET_PEERSTORE_connect (const struct GNUNET_CONFIGURATION_Handle *cfg);
 
 /**
- * Disconnect from the PEERSTORE service
+ * Disconnect from the PEERSTORE service. Any pending ITERATE and WATCH 
requests
+ * will be canceled. Any pending STORE requests will depend on @snyc_first 
flag.
  *
  * @param h handle to disconnect
+ * @param sync_first send any pending STORE requests before disconnecting
  */
 void
-GNUNET_PEERSTORE_disconnect(struct GNUNET_PEERSTORE_Handle *h);
+GNUNET_PEERSTORE_disconnect (struct GNUNET_PEERSTORE_Handle *h, int 
sync_first);
 
 /**
  * Store a new entry in the PEERSTORE

Index: gnunet/src/peerstore
===================================================================
--- gnunet/src/peerstore        2014-07-09 14:07:13 UTC (rev 33945)
+++ gnunet/src/peerstore        2014-07-09 14:46:56 UTC (rev 33946)

Property changes on: gnunet/src/peerstore
___________________________________________________________________
Modified: svn:ignore
## -9,3 +9,4 ##
 test_peerstore_api_store
 test_peerstore_api_iterate
 perf_peerstore_store
+test_peerstore_api_sync
Modified: gnunet/src/peerstore/Makefile.am
===================================================================
--- gnunet/src/peerstore/Makefile.am    2014-07-09 14:07:13 UTC (rev 33945)
+++ gnunet/src/peerstore/Makefile.am    2014-07-09 14:46:56 UTC (rev 33946)
@@ -68,6 +68,7 @@
  test_peerstore_api_store \
  test_peerstore_api_iterate \
  test_peerstore_api_watch \
+ test_peerstore_api_sync \
  perf_peerstore_store
  
 if ENABLE_TEST_RUN
@@ -96,6 +97,13 @@
   $(top_builddir)/src/testing/libgnunettesting.la \
   $(top_builddir)/src/util/libgnunetutil.la
 
+test_peerstore_api_sync_SOURCES = \
+ test_peerstore_api_sync.c
+test_peerstore_api_sync_LDADD = \
+  $(top_builddir)/src/peerstore/libgnunetpeerstore.la  \
+  $(top_builddir)/src/testing/libgnunettesting.la \
+  $(top_builddir)/src/util/libgnunetutil.la
+
 perf_peerstore_store_SOURCES = \
  perf_peerstore_store.c
 perf_peerstore_store_LDADD = \

Modified: gnunet/src/peerstore/gnunet-peerstore.c
===================================================================
--- gnunet/src/peerstore/gnunet-peerstore.c     2014-07-09 14:07:13 UTC (rev 
33945)
+++ gnunet/src/peerstore/gnunet-peerstore.c     2014-07-09 14:46:56 UTC (rev 
33946)
@@ -46,7 +46,7 @@
 {
   if(NULL != peerstore_handle)
   {
-    GNUNET_PEERSTORE_disconnect(peerstore_handle);
+    GNUNET_PEERSTORE_disconnect(peerstore_handle, GNUNET_YES);
     peerstore_handle = NULL;
   }
 }

Modified: gnunet/src/peerstore/peerstore_api.c
===================================================================
--- gnunet/src/peerstore/peerstore_api.c        2014-07-09 14:07:13 UTC (rev 
33945)
+++ gnunet/src/peerstore/peerstore_api.c        2014-07-09 14:46:56 UTC (rev 
33946)
@@ -80,6 +80,11 @@
    */
   struct GNUNET_CONTAINER_MultiHashMap *watches;
 
+  /**
+   * Are we in the process of disconnecting but need to sync first?
+   */
+  int disconnecting;
+
 };
 
 /**
@@ -226,7 +231,8 @@
  * @param cls a 'struct GNUNET_PEERSTORE_Handle *'
  * @param msg message received, NULL on timeout or fatal error
  */
-void handle_iterate_result (void *cls, const struct GNUNET_MessageHeader *msg);
+static void
+handle_iterate_result (void *cls, const struct GNUNET_MessageHeader *msg);
 
 /**
  * When a watch record is received
@@ -234,7 +240,8 @@
  * @param cls a 'struct GNUNET_PEERSTORE_Handle *'
  * @param msg message received, NULL on timeout or fatal error
  */
-void handle_watch_result (void *cls, const struct GNUNET_MessageHeader *msg);
+static void
+handle_watch_result (void *cls, const struct GNUNET_MessageHeader *msg);
 
 /**
  * Close the existing connection to PEERSTORE and reconnect.
@@ -249,21 +256,21 @@
  *
  * @param cls a 'struct GNUNET_PEERSTORE_WatchContext *'
  */
-void watch_request_sent (void *cls);
+static void watch_request_sent (void *cls);
 
 /**
  * Callback after MQ envelope is sent
  *
  * @param cls a 'struct GNUNET_PEERSTORE_IterateContext *'
  */
-void iterate_request_sent (void *cls);
+static void iterate_request_sent (void *cls);
 
 /**
  * Callback after MQ envelope is sent
  *
  * @param cls a 'struct GNUNET_PEERSTORE_StoreContext *'
  */
-void store_request_sent (void *cls);
+static void store_request_sent (void *cls);
 
 /**
  * MQ message handlers
@@ -291,7 +298,7 @@
 /**
  * Iterator over previous watches to resend them
  */
-int rewatch_it(void *cls,
+static int rewatch_it(void *cls,
     const struct GNUNET_HashCode *key,
     void *value)
 {
@@ -375,6 +382,45 @@
 }
 
 /**
+ * Iterator over watch requests to cancel them.
+ *
+ * @param cls unsused
+ * @param key key to the watch request
+ * @param value watch context
+ * @return #GNUNET_YES to continue iteration
+ */
+static int
+destroy_watch (void *cls, const struct GNUNET_HashCode *key, void *value)
+{
+  struct GNUNET_PEERSTORE_WatchContext *wc = value;
+
+  GNUNET_PEERSTORE_watch_cancel (wc);
+  return GNUNET_YES;
+}
+
+/**
+ * Kill the connection to the service. This can be delayed in case of pending
+ * STORE requests and the user explicitly asked to sync first. Otherwise it is
+ * performed instantly.
+ *
+ * @param h Handle to the service.
+ */
+static void do_disconnect (struct GNUNET_PEERSTORE_Handle *h)
+{
+  if(NULL != h->mq)
+  {
+    GNUNET_MQ_destroy(h->mq);
+    h->mq = NULL;
+  }
+  if (NULL != h->client)
+  {
+    GNUNET_CLIENT_disconnect (h->client);
+    h->client = NULL;
+  }
+  GNUNET_free(h);
+}
+
+/**
  * Connect to the PEERSTORE service.
  *
  * @return NULL on error
@@ -392,6 +438,7 @@
     return NULL;
   }
   h->cfg = cfg;
+  h->disconnecting = GNUNET_NO;
   h->mq = GNUNET_MQ_queue_for_connection_client(h->client,
       mq_handlers,
       &handle_client_error,
@@ -406,32 +453,52 @@
 }
 
 /**
- * Disconnect from the PEERSTORE service
- * Do not call in case of pending requests
+ * Disconnect from the PEERSTORE service. Any pending ITERATE and WATCH 
requests
+ * will be canceled. Any pending STORE requests will depend on @snyc_first 
flag.
  *
  * @param h handle to disconnect
+ * @param sync_first send any pending STORE requests before disconnecting
  */
 void
-GNUNET_PEERSTORE_disconnect(struct GNUNET_PEERSTORE_Handle *h)
+GNUNET_PEERSTORE_disconnect (struct GNUNET_PEERSTORE_Handle *h, int sync_first)
 {
+  struct GNUNET_PEERSTORE_IterateContext *ic;
+  struct GNUNET_PEERSTORE_IterateContext *ic_iter;
+  struct GNUNET_PEERSTORE_StoreContext *sc;
+  struct GNUNET_PEERSTORE_StoreContext *sc_iter;
+
   LOG(GNUNET_ERROR_TYPE_DEBUG, "Disconnecting.\n");
   if(NULL != h->watches)
   {
+    GNUNET_CONTAINER_multihashmap_iterate (h->watches, &destroy_watch, NULL);
     GNUNET_CONTAINER_multihashmap_destroy(h->watches);
     h->watches = NULL;
   }
-  if(NULL != h->mq)
+  ic_iter = h->iterate_head;
+  while (NULL != ic_iter)
   {
-    GNUNET_MQ_destroy(h->mq);
-    h->mq = NULL;
+    ic = ic_iter;
+    ic_iter = ic_iter->next;
+    GNUNET_PEERSTORE_iterate_cancel (ic);
   }
-  if (NULL != h->client)
+  if (NULL != h->store_head)
   {
-    GNUNET_CLIENT_disconnect (h->client);
-    h->client = NULL;
+    if (GNUNET_YES == sync_first)
+    {
+      LOG (GNUNET_ERROR_TYPE_DEBUG,
+          "Delaying disconnection due to pending store requests.\n");
+      h->disconnecting = GNUNET_YES;
+      return;
+    }
+    sc_iter = h->store_head;
+    while (NULL != sc_iter)
+    {
+      sc = sc_iter;
+      sc_iter = sc_iter->next;
+      GNUNET_PEERSTORE_store_cancel (sc);
+    }
   }
-  GNUNET_free(h);
-  LOG(GNUNET_ERROR_TYPE_DEBUG, "Disconnected, BYE!\n");
+  do_disconnect (h);
 }
 
 
@@ -444,7 +511,7 @@
  *
  * @param cls a 'struct GNUNET_PEERSTORE_StoreContext *'
  */
-void store_request_sent (void *cls)
+static void store_request_sent (void *cls)
 {
   struct GNUNET_PEERSTORE_StoreContext *sc = cls;
   GNUNET_PEERSTORE_Continuation cont;
@@ -466,6 +533,8 @@
 void
 GNUNET_PEERSTORE_store_cancel (struct GNUNET_PEERSTORE_StoreContext *sc)
 {
+  struct GNUNET_PEERSTORE_Handle *h = sc->h;
+
   if(NULL != sc->ev)
   {
     GNUNET_MQ_send_cancel(sc->ev);
@@ -473,6 +542,8 @@
   }
   GNUNET_CONTAINER_DLL_remove(sc->h->store_head, sc->h->store_tail, sc);
   GNUNET_free(sc);
+  if (GNUNET_YES == h->disconnecting && NULL == h->store_head)
+    do_disconnect (h);
 }
 
 /**
@@ -538,7 +609,8 @@
  * @param cls a 'struct GNUNET_PEERSTORE_Handle *'
  * @param msg message received, NULL on timeout or fatal error
  */
-void handle_iterate_result (void *cls, const struct GNUNET_MessageHeader *msg)
+static void
+handle_iterate_result (void *cls, const struct GNUNET_MessageHeader *msg)
 {
   struct GNUNET_PEERSTORE_Handle *h = cls;
   struct GNUNET_PEERSTORE_IterateContext *ic;
@@ -596,7 +668,7 @@
  *
  * @param cls a 'struct GNUNET_PEERSTORE_IterateContext *'
  */
-void iterate_request_sent (void *cls)
+static void iterate_request_sent (void *cls)
 {
   struct GNUNET_PEERSTORE_IterateContext *ic = cls;
 
@@ -610,7 +682,8 @@
  *
  * @param cls a 'struct GNUNET_PEERSTORE_IterateContext *'
  */
-void iterate_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+static void
+iterate_timeout (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   struct GNUNET_PEERSTORE_IterateContext *ic = cls;
 
@@ -702,7 +775,8 @@
  * @param cls a 'struct GNUNET_PEERSTORE_Handle *'
  * @param msg message received, NULL on timeout or fatal error
  */
-void handle_watch_result (void *cls, const struct GNUNET_MessageHeader *msg)
+static void
+handle_watch_result (void *cls, const struct GNUNET_MessageHeader *msg)
 {
   struct GNUNET_PEERSTORE_Handle *h = cls;
   struct GNUNET_PEERSTORE_Record *record;
@@ -738,7 +812,7 @@
  *
  * @param cls a 'struct GNUNET_PEERSTORE_WatchContext *'
  */
-void watch_request_sent (void *cls)
+static void watch_request_sent (void *cls)
 {
   struct GNUNET_PEERSTORE_WatchContext *wc = cls;
 
@@ -762,6 +836,7 @@
   if(GNUNET_YES == wc->request_sent) /* If request already sent to service, 
send a cancel request. */
   {
     ev = GNUNET_MQ_msg(hm, GNUNET_MESSAGE_TYPE_PEERSTORE_WATCH_CANCEL);
+    hm->keyhash = wc->keyhash;
     GNUNET_MQ_send(h->mq, ev);
     wc->callback = NULL;
     wc->callback_cls = NULL;

Modified: gnunet/src/peerstore/perf_peerstore_store.c
===================================================================
--- gnunet/src/peerstore/perf_peerstore_store.c 2014-07-09 14:07:13 UTC (rev 
33945)
+++ gnunet/src/peerstore/perf_peerstore_store.c 2014-07-09 14:46:56 UTC (rev 
33946)
@@ -43,7 +43,7 @@
 disconnect()
 {
   if(NULL != h)
-    GNUNET_PEERSTORE_disconnect(h);
+    GNUNET_PEERSTORE_disconnect(h, GNUNET_YES);
   GNUNET_SCHEDULER_shutdown();
 }
 

Modified: gnunet/src/peerstore/test_peerstore_api_iterate.c
===================================================================
--- gnunet/src/peerstore/test_peerstore_api_iterate.c   2014-07-09 14:07:13 UTC 
(rev 33945)
+++ gnunet/src/peerstore/test_peerstore_api_iterate.c   2014-07-09 14:46:56 UTC 
(rev 33946)
@@ -53,7 +53,7 @@
   }
   GNUNET_assert(count == 3);
   ok = 0;
-  GNUNET_PEERSTORE_disconnect(h);
+  GNUNET_PEERSTORE_disconnect(h, GNUNET_NO);
   GNUNET_SCHEDULER_shutdown();
   return GNUNET_YES;
 }

Modified: gnunet/src/peerstore/test_peerstore_api_store.c
===================================================================
--- gnunet/src/peerstore/test_peerstore_api_store.c     2014-07-09 14:07:13 UTC 
(rev 33945)
+++ gnunet/src/peerstore/test_peerstore_api_store.c     2014-07-09 14:46:56 UTC 
(rev 33946)
@@ -54,7 +54,7 @@
   }
   GNUNET_assert(count == 1);
   ok = 0;
-  GNUNET_PEERSTORE_disconnect(h);
+  GNUNET_PEERSTORE_disconnect(h, GNUNET_YES);
   GNUNET_SCHEDULER_shutdown();
   return GNUNET_YES;
 }

Added: gnunet/src/peerstore/test_peerstore_api_sync.c
===================================================================
--- gnunet/src/peerstore/test_peerstore_api_sync.c                              
(rev 0)
+++ gnunet/src/peerstore/test_peerstore_api_sync.c      2014-07-09 14:46:56 UTC 
(rev 33946)
@@ -0,0 +1,92 @@
+/*
+     This file is part of GNUnet.
+     (C)
+
+     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 peerstore/test_peerstore_api_sync.c
+ * @brief testcase for peerstore sync before disconnect feature
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+#include "gnunet_testing_lib.h"
+#include "gnunet_peerstore_service.h"
+
+int ok = 1;
+
+const struct GNUNET_CONFIGURATION_Handle *cfg;
+
+static struct GNUNET_PEERSTORE_Handle *h;
+
+static char *subsystem = "test_peerstore_api_sync";
+static struct GNUNET_PeerIdentity pid;
+static char *key = "test_peerstore_api_store_key";
+static char *val = "test_peerstore_api_store_val";
+
+int iterate_cb (void *cls, struct GNUNET_PEERSTORE_Record *record, char *emsg)
+{
+  const char *rec_val;
+
+  GNUNET_break (NULL == emsg);
+  if (NULL == record)
+  {
+    GNUNET_PEERSTORE_disconnect (h, GNUNET_NO);
+    GNUNET_SCHEDULER_shutdown();
+    return GNUNET_YES;
+  }
+  rec_val = record->value;
+  GNUNET_break (0 == strcmp(rec_val, val));
+  ok = 0;
+  return GNUNET_YES;
+}
+
+static void
+test1()
+{
+  GNUNET_PEERSTORE_store (h, subsystem, &pid, key, val, strlen(val) + 1,
+      GNUNET_TIME_UNIT_FOREVER_ABS, GNUNET_PEERSTORE_STOREOPTION_REPLACE,
+      NULL, NULL);
+  GNUNET_PEERSTORE_disconnect (h, GNUNET_YES);
+  h = GNUNET_PEERSTORE_connect (cfg);
+  GNUNET_PEERSTORE_iterate (h, subsystem, &pid, key,
+      GNUNET_TIME_UNIT_FOREVER_REL, &iterate_cb, NULL);
+}
+
+static void
+run (void *cls,
+    const struct GNUNET_CONFIGURATION_Handle *c,
+    struct GNUNET_TESTING_Peer *peer)
+{
+  cfg = c;
+  h = GNUNET_PEERSTORE_connect(cfg);
+  GNUNET_assert(NULL != h);
+  memset (&pid, 1, sizeof (pid));
+  test1();
+}
+
+int
+main (int argc, char *argv[])
+{
+  if (0 != GNUNET_TESTING_service_run ("test-gnunet-peerstore",
+                 "peerstore",
+                 "test_peerstore_api_data.conf",
+                 &run, NULL))
+    return 1;
+  return ok;
+}
+
+/* end of test_peerstore_api_store.c */

Modified: gnunet/src/peerstore/test_peerstore_api_watch.c
===================================================================
--- gnunet/src/peerstore/test_peerstore_api_watch.c     2014-07-09 14:07:13 UTC 
(rev 33945)
+++ gnunet/src/peerstore/test_peerstore_api_watch.c     2014-07-09 14:46:56 UTC 
(rev 33946)
@@ -43,7 +43,7 @@
   GNUNET_assert(NULL == emsg);
   GNUNET_assert(0 == strcmp(val, (char *)record->value));
   ok = 0;
-  GNUNET_PEERSTORE_disconnect(h);
+  GNUNET_PEERSTORE_disconnect(h, GNUNET_NO);
   GNUNET_SCHEDULER_shutdown();
   return GNUNET_YES;
 }

Modified: gnunet/src/sensor/gnunet-service-sensor-analysis.c
===================================================================
--- gnunet/src/sensor/gnunet-service-sensor-analysis.c  2014-07-09 14:07:13 UTC 
(rev 33945)
+++ gnunet/src/sensor/gnunet-service-sensor-analysis.c  2014-07-09 14:46:56 UTC 
(rev 33946)
@@ -140,7 +140,7 @@
   }
   if (NULL != peerstore)
   {
-    GNUNET_PEERSTORE_disconnect(peerstore);
+    GNUNET_PEERSTORE_disconnect(peerstore, GNUNET_YES);
     peerstore = NULL;
   }
   if (NULL != model_api)

Modified: gnunet/src/sensor/gnunet-service-sensor-reporting.c
===================================================================
--- gnunet/src/sensor/gnunet-service-sensor-reporting.c 2014-07-09 14:07:13 UTC 
(rev 33945)
+++ gnunet/src/sensor/gnunet-service-sensor-reporting.c 2014-07-09 14:46:56 UTC 
(rev 33946)
@@ -255,7 +255,7 @@
   }
   if (NULL != peerstore)
   {
-    GNUNET_PEERSTORE_disconnect (peerstore);
+    GNUNET_PEERSTORE_disconnect (peerstore, GNUNET_YES);
     peerstore = NULL;
   }
   if (NULL != cadet)

Modified: gnunet/src/sensor/gnunet-service-sensor.c
===================================================================
--- gnunet/src/sensor/gnunet-service-sensor.c   2014-07-09 14:07:13 UTC (rev 
33945)
+++ gnunet/src/sensor/gnunet-service-sensor.c   2014-07-09 14:46:56 UTC (rev 
33946)
@@ -99,7 +99,7 @@
   }
   if(NULL != peerstore)
   {
-    GNUNET_PEERSTORE_disconnect(peerstore);
+    GNUNET_PEERSTORE_disconnect(peerstore, GNUNET_YES); /*FIXME: merge into a 
global peerstore connection */
     peerstore = NULL;
   }
   GNUNET_SCHEDULER_shutdown();

Modified: gnunet/src/sensordashboard/gnunet-service-sensordashboard.c
===================================================================
--- gnunet/src/sensordashboard/gnunet-service-sensordashboard.c 2014-07-09 
14:07:13 UTC (rev 33945)
+++ gnunet/src/sensordashboard/gnunet-service-sensordashboard.c 2014-07-09 
14:46:56 UTC (rev 33946)
@@ -68,7 +68,7 @@
   }
   if (NULL != peerstore)
   {
-    GNUNET_PEERSTORE_disconnect (peerstore);
+    GNUNET_PEERSTORE_disconnect (peerstore, GNUNET_YES);
     peerstore = NULL;
   }
   GNUNET_SENSOR_destroy_sensors (sensors);




reply via email to

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