[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [gnunet] 21/75: avoid looping on listing of zone
From: |
gnunet |
Subject: |
[GNUnet-SVN] [gnunet] 21/75: avoid looping on listing of zone |
Date: |
Thu, 09 Aug 2018 23:58:18 +0200 |
This is an automated email from the git hooks/post-receive script.
martin-schanzenbach pushed a commit to branch master
in repository gnunet.
commit 3eedf50775f5857416e1943901ffcef5f0504815
Author: Christian Grothoff <address@hidden>
AuthorDate: Thu Jun 7 16:55:11 2018 +0200
avoid looping on listing of zone
---
src/namestore/gnunet-namestore-fcfsd.c | 105 ++++++++++++++++++++-------------
1 file changed, 65 insertions(+), 40 deletions(-)
diff --git a/src/namestore/gnunet-namestore-fcfsd.c
b/src/namestore/gnunet-namestore-fcfsd.c
index 89e42ddac..b4f8a7b26 100644
--- a/src/namestore/gnunet-namestore-fcfsd.c
+++ b/src/namestore/gnunet-namestore-fcfsd.c
@@ -156,11 +156,6 @@ struct Request
struct ZoneinfoRequest
{
/**
- * Connection
- */
- struct MHD_Connection *connection;
-
- /**
* List iterator
*/
struct GNUNET_NAMESTORE_ZoneIterator *list_it;
@@ -207,6 +202,16 @@ static struct GNUNET_CRYPTO_EcdsaPrivateKey fcfs_zone_pkey;
static struct GNUNET_IDENTITY_Handle *identity;
/**
+ * Zoneinfo page we currently use.
+ */
+static struct MHD_Response *info_page;
+
+/**
+ * Task that runs #update_zoneinfo_page peridicially.
+ */
+static struct GNUNET_SCHEDULER_Task *uzp_task;
+
+/**
* Request for our ego.
*/
static struct GNUNET_IDENTITY_Operation *id_op;
@@ -247,25 +252,26 @@ run_httpd_now ()
/**
+ * Create fresh version of zone information.
+ */
+static void
+update_zoneinfo_page (void *cls);
+
+
+/**
* Function called on error in zone iteration.
*/
static void
zone_iteration_error (void *cls)
{
struct ZoneinfoRequest *zr = cls;
- struct MHD_Response *response;
zr->list_it = NULL;
- response = MHD_create_response_from_buffer (strlen ("internal error"),
- (void *) "internal error",
- MHD_RESPMEM_PERSISTENT);
- MHD_queue_response (zr->connection,
- MHD_HTTP_INTERNAL_SERVER_ERROR,
- response);
- MHD_destroy_response (response);
GNUNET_free (zr->zoneinfo);
GNUNET_free (zr);
- run_httpd_now ();
+ GNUNET_SCHEDULER_cancel (uzp_task);
+ uzp_task = GNUNET_SCHEDULER_add_now (&update_zoneinfo_page,
+ NULL);
}
@@ -292,13 +298,10 @@ zone_iteration_end (void *cls)
MHD_add_response_header (response,
MHD_HTTP_HEADER_CONTENT_TYPE,
MIME_HTML);
- MHD_queue_response (zr->connection,
- MHD_HTTP_OK,
- response);
- MHD_destroy_response (response);
+ MHD_destroy_response (info_page);
+ info_page = response;
GNUNET_free (zr->zoneinfo);
GNUNET_free (zr);
- run_httpd_now ();
}
@@ -373,27 +376,41 @@ iterate_cb (void *cls,
* Handler that returns FCFS zoneinfo page.
*
* @param connection connection to use
- * @return MHD_YES on success
*/
-static int
+static int
serve_zoneinfo_page (struct MHD_Connection *connection)
{
- struct ZoneinfoRequest *zr;
-
- zr = GNUNET_new (struct ZoneinfoRequest);
- zr->zoneinfo = GNUNET_malloc (DEFAULT_ZONEINFO_BUFSIZE);
- zr->buf_len = DEFAULT_ZONEINFO_BUFSIZE;
- zr->connection = connection;
- zr->write_offset = 0;
- zr->list_it = GNUNET_NAMESTORE_zone_iteration_start (ns,
- &fcfs_zone_pkey,
- &zone_iteration_error,
- zr,
- &iterate_cb,
- zr,
- &zone_iteration_end,
- zr);
- return MHD_YES;
+ return MHD_queue_response (connection,
+ MHD_HTTP_OK,
+ info_page);
+}
+
+
+/**
+ * Create fresh version of zone information.
+ */
+static void
+update_zoneinfo_page (void *cls)
+{
+ static struct ZoneinfoRequest zr;
+
+ (void) cls;
+ uzp_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
+ &update_zoneinfo_page,
+ NULL);
+ if (NULL != zr.list_it)
+ return;
+ zr.zoneinfo = GNUNET_malloc (DEFAULT_ZONEINFO_BUFSIZE);
+ zr.buf_len = DEFAULT_ZONEINFO_BUFSIZE;
+ zr.write_offset = 0;
+ zr.list_it = GNUNET_NAMESTORE_zone_iteration_start (ns,
+ &fcfs_zone_pkey,
+ &zone_iteration_error,
+ &zr,
+ &iterate_cb,
+ &zr,
+ &zone_iteration_end,
+ &zr);
}
@@ -401,7 +418,7 @@ serve_zoneinfo_page (struct MHD_Connection *connection)
* Handler that returns a simple static HTTP page.
*
* @param connection connection to use
- * @return MHD_YES on success
+ * @return #MHD_YES on success
*/
static int
serve_main_page (struct MHD_Connection *connection)
@@ -703,8 +720,8 @@ lookup_block_processor (void *cls,
* @a upload_data provided; the method must update this
* value to the number of bytes NOT processed;
* @param ptr pointer to location where we store the 'struct Request'
- * @return MHD_YES if the connection was handled successfully,
- * MHD_NO if the socket must be closed due to a serious
+ * @return #MHD_YES if the connection was handled successfully,
+ * #MHD_NO if the socket must be closed due to a serious
* error while handling the request
*/
static int
@@ -959,6 +976,11 @@ do_shutdown (void *cls)
GNUNET_SCHEDULER_cancel (httpd_task);
httpd_task = NULL;
}
+ if (NULL != uzp_task)
+ {
+ GNUNET_SCHEDULER_cancel (uzp_task);
+ uzp_task = NULL;
+ }
if (NULL != ns)
{
GNUNET_NAMESTORE_disconnect (ns);
@@ -1045,6 +1067,7 @@ identity_cb (void *cls,
while (NULL == httpd);
if (NULL == httpd)
{
+
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
_("Failed to start HTTP server\n"));
GNUNET_SCHEDULER_shutdown ();
@@ -1097,6 +1120,8 @@ run (void *cls,
_("Failed to connect to identity\n"));
return;
}
+ uzp_task = GNUNET_SCHEDULER_add_now (&update_zoneinfo_page,
+ NULL);
GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
NULL);
}
--
To stop receiving notification emails like this one, please contact
address@hidden
- [GNUnet-SVN] [gnunet] 11/75: README rework part 1, (continued)
- [GNUnet-SVN] [gnunet] 11/75: README rework part 1, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 29/75: Fix the link to the preliminary documentation, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 23/75: config: file name expansion in all -f cases, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 26/75: doc: create system specific folder and move files into it, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 25/75: rps profiler: add correct make rule, util, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 37/75: ensure DHT never accepts or passes along expired blocks, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 39/75: rps profiler: cleaned debug output, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 30/75: remove crypto_bug.c, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 28/75: README: Mention further reading material, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 34/75: complain if datacache returns expired values, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 21/75: avoid looping on listing of zone,
gnunet <=
- [GNUnet-SVN] [gnunet] 31/75: -wip error gns, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 36/75: tell mysql that our integers are unsigned, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 40/75: doc: Add new files to Makefile., gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 38/75: rps profiler: generate output for randomness tests, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 45/75: fix, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 41/75: some changes and work in user handbook., gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 46/75: mariadb, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 51/75: -Merge branch 'master' of ssh://gnunet.org/gnunet into gsoc2018/rest_api, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 47/75: remove dead file, gnunet, 2018/08/09
- [GNUnet-SVN] [gnunet] 56/75: -Merge branch 'master' of ssh://gnunet.org/gnunet into gsoc2018/rest_api, gnunet, 2018/08/09