[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r33946 - in gnunet/src: include peerstore sensor sensordashboard,
gnunet <=