From e96e9584f2ca6797552fc46bb83e3d10827fad49 Mon Sep 17 00:00:00 2001 From: Christian Grothoff <christian@grothoff.org> Date: Sat, 29 Jun 2019 10:18:44 +0200 Subject: [PATCH] use mmap() instead of malloc, rename heap->flat as database is persisted in flat file --- src/namestore/.gitignore | 36 +-- src/namestore/Makefile.am | 124 ++++---- ...heap.conf => perf_namestore_api_flat.conf} | 2 +- ...mestore_heap.c => plugin_namestore_flat.c} | 273 ++++++++++-------- ...heap.conf => test_namestore_api_flat.conf} | 2 +- ...p.conf => test_plugin_namestore_flat.conf} | 2 +- src/util/disk.c | 2 +- 7 files changed, 230 insertions(+), 211 deletions(-) rename src/namestore/{perf_namestore_api_heap.conf => perf_namestore_api_flat.conf} (89%) rename src/namestore/{plugin_namestore_heap.c => plugin_namestore_flat.c} (78%) rename src/namestore/{test_namestore_api_heap.conf => test_namestore_api_flat.conf} (87%) rename src/namestore/{test_plugin_namestore_heap.conf => test_plugin_namestore_flat.conf} (79%) diff --git a/src/namestore/.gitignore b/src/namestore/.gitignore index 5a59afd24..f159cdaff 100644 --- a/src/namestore/.gitignore +++ b/src/namestore/.gitignore @@ -68,21 +68,21 @@ test_namestore_api_zone_iteration_stop_sqlite test_namestore_api_zone_to_name_flat test_namestore_api_zone_to_name_postgres test_namestore_api_zone_to_name_sqlite -test_namestore_api_lookup_nick_heap -test_namestore_api_lookup_private_heap -test_namestore_api_lookup_public_heap -test_namestore_api_lookup_shadow_filter_heap -test_namestore_api_lookup_shadow_heap -test_namestore_api_monitoring_existing_heap -test_namestore_api_monitoring_heap -test_namestore_api_remove_heap -test_namestore_api_remove_not_existing_record_heap -test_namestore_api_store_heap -test_namestore_api_store_update_heap -test_namestore_api_zone_iteration_heap -test_namestore_api_zone_iteration_nick_heap -test_namestore_api_zone_iteration_specific_zone_heap -test_namestore_api_zone_iteration_stop_heap -test_namestore_api_zone_to_name_heap -test_plugin_namestore_heap -perf_namestore_api_zone_iteration_heap +test_namestore_api_lookup_nick_flat +test_namestore_api_lookup_private_flat +test_namestore_api_lookup_public_flat +test_namestore_api_lookup_shadow_filter_flat +test_namestore_api_lookup_shadow_flat +test_namestore_api_monitoring_existing_flat +test_namestore_api_monitoring_flat +test_namestore_api_remove_flat +test_namestore_api_remove_not_existing_record_flat +test_namestore_api_store_flat +test_namestore_api_store_update_flat +test_namestore_api_zone_iteration_flat +test_namestore_api_zone_iteration_nick_flat +test_namestore_api_zone_iteration_specific_zone_flat +test_namestore_api_zone_iteration_stop_flat +test_namestore_api_zone_to_name_flat +test_plugin_namestore_flat +perf_namestore_api_zone_iteration_flat diff --git a/src/namestore/Makefile.am b/src/namestore/Makefile.am index 25941b4fb..e95add6c7 100644 --- a/src/namestore/Makefile.am +++ b/src/namestore/Makefile.am @@ -20,26 +20,26 @@ if USE_COVERAGE XLIBS = -lgcov endif -HEAP_PLUGIN = libgnunet_plugin_namestore_heap.la +HEAP_PLUGIN = libgnunet_plugin_namestore_flat.la if HAVE_TESTING -HEAP_TESTS = test_plugin_namestore_heap \ - test_namestore_api_store_heap \ - test_namestore_api_store_update_heap \ - test_namestore_api_remove_heap \ - test_namestore_api_zone_iteration_heap \ - test_namestore_api_lookup_nick_heap \ - test_namestore_api_monitoring_heap \ - test_namestore_api_lookup_public_heap \ - test_namestore_api_lookup_private_heap \ - test_namestore_api_lookup_shadow_heap \ - test_namestore_api_lookup_shadow_filter_heap \ - test_namestore_api_remove_not_existing_record_heap \ - test_namestore_api_zone_iteration_nick_heap \ - test_namestore_api_zone_iteration_specific_zone_heap \ - test_namestore_api_zone_iteration_stop_heap \ - test_namestore_api_monitoring_existing_heap \ - test_namestore_api_zone_to_name_heap \ - perf_namestore_api_zone_iteration_heap +HEAP_TESTS = test_plugin_namestore_flat \ + test_namestore_api_store_flat \ + test_namestore_api_store_update_flat \ + test_namestore_api_remove_flat \ + test_namestore_api_zone_iteration_flat \ + test_namestore_api_lookup_nick_flat \ + test_namestore_api_monitoring_flat \ + test_namestore_api_lookup_public_flat \ + test_namestore_api_lookup_private_flat \ + test_namestore_api_lookup_shadow_flat \ + test_namestore_api_lookup_shadow_filter_flat \ + test_namestore_api_remove_not_existing_record_flat \ + test_namestore_api_zone_iteration_nick_flat \ + test_namestore_api_zone_iteration_specific_zone_flat \ + test_namestore_api_zone_iteration_stop_flat \ + test_namestore_api_monitoring_existing_flat \ + test_namestore_api_zone_to_name_flat \ + perf_namestore_api_zone_iteration_flat endif if HAVE_SQLITE @@ -206,14 +206,14 @@ gnunet_service_namestore_LDADD = \ -libgnunet_plugin_namestore_heap_la_SOURCES = \ - plugin_namestore_heap.c -libgnunet_plugin_namestore_heap_la_LIBADD = \ +libgnunet_plugin_namestore_flat_la_SOURCES = \ + plugin_namestore_flat.c +libgnunet_plugin_namestore_flat_la_LIBADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ $(top_builddir)/src/statistics/libgnunetstatistics.la \ $(top_builddir)/src/util/libgnunetutil.la $(XLIBS) \ $(LTLIBINTL) -libgnunet_plugin_namestore_heap_la_LDFLAGS = \ +libgnunet_plugin_namestore_flat_la_LDFLAGS = \ $(GN_PLUGIN_LDFLAGS) @@ -239,9 +239,9 @@ libgnunet_plugin_namestore_postgres_la_LIBADD = \ libgnunet_plugin_namestore_postgres_la_LDFLAGS = \ $(GN_PLUGIN_LDFLAGS) $(POSTGRESQL_LDFLAGS) -test_namestore_api_store_heap_SOURCES = \ +test_namestore_api_store_flat_SOURCES = \ test_namestore_api_store.c -test_namestore_api_store_heap_LDADD = \ +test_namestore_api_store_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -263,9 +263,9 @@ test_namestore_api_store_postgres_LDADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ libgnunetnamestore.la -test_namestore_api_store_update_heap_SOURCES = \ +test_namestore_api_store_update_flat_SOURCES = \ test_namestore_api_store_update.c -test_namestore_api_store_update_heap_LDADD = \ +test_namestore_api_store_update_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -290,9 +290,9 @@ test_namestore_api_store_update_postgres_LDADD = \ $(top_builddir)/src/namecache/libgnunetnamecache.la \ libgnunetnamestore.la -test_namestore_api_lookup_public_heap_SOURCES = \ +test_namestore_api_lookup_public_flat_SOURCES = \ test_namestore_api_lookup_public.c -test_namestore_api_lookup_public_heap_LDADD = \ +test_namestore_api_lookup_public_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -335,18 +335,18 @@ test_namestore_api_lookup_nick_postgres_LDADD = \ $(top_builddir)/src/namecache/libgnunetnamecache.la \ libgnunetnamestore.la -test_namestore_api_lookup_nick_heap_SOURCES = \ +test_namestore_api_lookup_nick_flat_SOURCES = \ test_namestore_api_lookup_nick.c -test_namestore_api_lookup_nick_heap_LDADD = \ +test_namestore_api_lookup_nick_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ $(top_builddir)/src/namecache/libgnunetnamecache.la \ libgnunetnamestore.la -test_namestore_api_lookup_private_heap_SOURCES = \ +test_namestore_api_lookup_private_flat_SOURCES = \ test_namestore_api_lookup_private.c -test_namestore_api_lookup_private_heap_LDADD = \ +test_namestore_api_lookup_private_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -371,9 +371,9 @@ test_namestore_api_lookup_private_postgres_LDADD = \ $(top_builddir)/src/namecache/libgnunetnamecache.la \ libgnunetnamestore.la -test_namestore_api_lookup_shadow_heap_SOURCES = \ +test_namestore_api_lookup_shadow_flat_SOURCES = \ test_namestore_api_lookup_shadow.c -test_namestore_api_lookup_shadow_heap_LDADD = \ +test_namestore_api_lookup_shadow_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -398,9 +398,9 @@ test_namestore_api_lookup_shadow_postgres_LDADD = \ $(top_builddir)/src/namecache/libgnunetnamecache.la \ libgnunetnamestore.la -test_namestore_api_lookup_shadow_filter_heap_SOURCES = \ +test_namestore_api_lookup_shadow_filter_flat_SOURCES = \ test_namestore_api_lookup_shadow_filter.c -test_namestore_api_lookup_shadow_filter_heap_LDADD = \ +test_namestore_api_lookup_shadow_filter_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -440,17 +440,17 @@ test_namestore_api_remove_postgres_LDADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ libgnunetnamestore.la -test_namestore_api_remove_heap_SOURCES = \ +test_namestore_api_remove_flat_SOURCES = \ test_namestore_api_remove.c -test_namestore_api_remove_heap_LDADD = \ +test_namestore_api_remove_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ libgnunetnamestore.la -test_namestore_api_remove_not_existing_record_heap_SOURCES = \ +test_namestore_api_remove_not_existing_record_flat_SOURCES = \ test_namestore_api_remove_not_existing_record.c -test_namestore_api_remove_not_existing_record_heap_LDADD = \ +test_namestore_api_remove_not_existing_record_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -472,9 +472,9 @@ test_namestore_api_remove_not_existing_record_postgres_LDADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ libgnunetnamestore.la -test_namestore_api_zone_to_name_heap_SOURCES = \ +test_namestore_api_zone_to_name_flat_SOURCES = \ test_namestore_api_zone_to_name.c -test_namestore_api_zone_to_name_heap_LDADD = \ +test_namestore_api_zone_to_name_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ libgnunetnamestore.la @@ -493,9 +493,9 @@ test_namestore_api_zone_to_name_postgres_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ libgnunetnamestore.la -test_namestore_api_monitoring_heap_SOURCES = \ +test_namestore_api_monitoring_flat_SOURCES = \ test_namestore_api_monitoring.c -test_namestore_api_monitoring_heap_LDADD = \ +test_namestore_api_monitoring_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ libgnunetnamestore.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -517,9 +517,9 @@ test_namestore_api_monitoring_postgres_LDADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ $(top_builddir)/src/util/libgnunetutil.la -test_namestore_api_monitoring_existing_heap_SOURCES = \ +test_namestore_api_monitoring_existing_flat_SOURCES = \ test_namestore_api_monitoring_existing.c -test_namestore_api_monitoring_existing_heap_LDADD = \ +test_namestore_api_monitoring_existing_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ libgnunetnamestore.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -541,9 +541,9 @@ test_namestore_api_monitoring_existing_postgres_LDADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ $(top_builddir)/src/util/libgnunetutil.la -test_namestore_api_zone_iteration_heap_SOURCES = \ +test_namestore_api_zone_iteration_flat_SOURCES = \ test_namestore_api_zone_iteration.c -test_namestore_api_zone_iteration_heap_LDADD = \ +test_namestore_api_zone_iteration_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -581,17 +581,17 @@ perf_namestore_api_zone_iteration_sqlite_LDADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ libgnunetnamestore.la -perf_namestore_api_zone_iteration_heap_SOURCES = \ +perf_namestore_api_zone_iteration_flat_SOURCES = \ perf_namestore_api_zone_iteration.c -perf_namestore_api_zone_iteration_heap_LDADD = \ +perf_namestore_api_zone_iteration_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ libgnunetnamestore.la -test_namestore_api_zone_iteration_nick_heap_SOURCES = \ +test_namestore_api_zone_iteration_nick_flat_SOURCES = \ test_namestore_api_zone_iteration_nick.c -test_namestore_api_zone_iteration_nick_heap_LDADD = \ +test_namestore_api_zone_iteration_nick_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -613,9 +613,9 @@ test_namestore_api_zone_iteration_nick_postgres_LDADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ libgnunetnamestore.la -test_namestore_api_zone_iteration_specific_zone_heap_SOURCES = \ +test_namestore_api_zone_iteration_specific_zone_flat_SOURCES = \ test_namestore_api_zone_iteration_specific_zone.c -test_namestore_api_zone_iteration_specific_zone_heap_LDADD = \ +test_namestore_api_zone_iteration_specific_zone_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -637,9 +637,9 @@ test_namestore_api_zone_iteration_specific_zone_postgres_LDADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ libgnunetnamestore.la -test_namestore_api_zone_iteration_stop_heap_SOURCES = \ +test_namestore_api_zone_iteration_stop_flat_SOURCES = \ test_namestore_api_zone_iteration_stop.c -test_namestore_api_zone_iteration_stop_heap_LDADD = \ +test_namestore_api_zone_iteration_stop_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ @@ -661,9 +661,9 @@ test_namestore_api_zone_iteration_stop_postgres_LDADD = \ $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \ libgnunetnamestore.la -test_plugin_namestore_heap_SOURCES = \ +test_plugin_namestore_flat_SOURCES = \ test_plugin_namestore.c -test_plugin_namestore_heap_LDADD = \ +test_plugin_namestore_flat_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la @@ -689,13 +689,13 @@ EXTRA_DIST = \ test_namestore_api.conf \ test_namestore_api_postgres.conf \ test_namestore_api_sqlite.conf \ - test_namestore_api_heap.conf \ + test_namestore_api_flat.conf \ perf_namestore_api_postgres.conf \ perf_namestore_api_sqlite.conf \ - perf_namestore_api_heap.conf \ + perf_namestore_api_flat.conf \ test_plugin_namestore_sqlite.conf \ test_plugin_namestore_postgres.conf \ - test_plugin_namestore_heap.conf \ + test_plugin_namestore_flat.conf \ test_hostkey \ zonefiles/S5I9DSGQVAB5FVV16T3B3CC5H1B2JGL3Q412JBKURME8EKU0600G.zkey \ zonefiles/AQ835GVL939H4O8QJQ7GBLPTQC0QAAO91BN7QK01BA63MDSK6I4G.zkey \ diff --git a/src/namestore/perf_namestore_api_heap.conf b/src/namestore/perf_namestore_api_flat.conf similarity index 89% rename from src/namestore/perf_namestore_api_heap.conf rename to src/namestore/perf_namestore_api_flat.conf index a12761a7f..30759ce7a 100644 --- a/src/namestore/perf_namestore_api_heap.conf +++ b/src/namestore/perf_namestore_api_flat.conf @@ -1,7 +1,7 @@ @INLINE@ test_namestore_api.conf [namestore] -DATABASE = heap +DATABASE = flat [namecache] DISABLE = YES diff --git a/src/namestore/plugin_namestore_heap.c b/src/namestore/plugin_namestore_flat.c similarity index 78% rename from src/namestore/plugin_namestore_heap.c rename to src/namestore/plugin_namestore_flat.c index 2a72c0e51..4e1d33907 100644 --- a/src/namestore/plugin_namestore_heap.c +++ b/src/namestore/plugin_namestore_flat.c @@ -1,6 +1,6 @@ /* * This file is part of GNUnet - * Copyright (C) 2009-2015, 2018 GNUnet e.V. + * Copyright (C) 2009-2015, 2018, 2019 GNUnet e.V. * * GNUnet is free software: you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License as published @@ -17,9 +17,8 @@ SPDX-License-Identifier: AGPL3.0-or-later */ - /** - * @file namestore/plugin_namestore_heap.c + * @file namestore/plugin_namestore_flat.c * @brief file-based namestore backend * @author Martin Schanzenbach * @author Christian Grothoff @@ -125,7 +124,7 @@ hash_pkey_and_label (const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey, static int database_setup (struct Plugin *plugin) { - char *afsdir; + char *flatdbfile; char *record_data; char *zone_private_key; char *record_data_b64; @@ -139,36 +138,37 @@ database_setup (struct Plugin *plugin) struct GNUNET_HashCode hkey; struct GNUNET_DISK_FileHandle *fh; struct FlatFileEntry *entry; + struct GNUNET_DISK_MapHandle *mh; if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (plugin->cfg, - "namestore-heap", + "namestore-flat", "FILENAME", - &afsdir)) + &flatdbfile)) { GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, - "namestore-heap", + "namestore-flat", "FILENAME"); return GNUNET_SYSERR; } if (GNUNET_OK != - GNUNET_DISK_file_test (afsdir)) + GNUNET_DISK_file_test (flatdbfile)) { if (GNUNET_OK != - GNUNET_DISK_directory_create_for_file (afsdir)) + GNUNET_DISK_directory_create_for_file (flatdbfile)) { GNUNET_break (0); - GNUNET_free (afsdir); + GNUNET_free (flatdbfile); return GNUNET_SYSERR; } } - /* afsdir should be UTF-8-encoded. If it isn't, it's a bug */ - plugin->fn = afsdir; + /* flatdbfile should be UTF-8-encoded. If it isn't, it's a bug */ + plugin->fn = flatdbfile; /* Load data from file into hashmap */ plugin->hm = GNUNET_CONTAINER_multihashmap_create (10, GNUNET_NO); - fh = GNUNET_DISK_file_open (afsdir, + fh = GNUNET_DISK_file_open (flatdbfile, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_READWRITE, GNUNET_DISK_PERM_USER_WRITE | @@ -177,137 +177,152 @@ database_setup (struct Plugin *plugin) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Unable to initialize file: %s.\n"), - afsdir); + flatdbfile); return GNUNET_SYSERR; } if (GNUNET_SYSERR == - GNUNET_DISK_file_size (afsdir, + GNUNET_DISK_file_size (flatdbfile, &size, GNUNET_YES, GNUNET_YES)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Unable to get filesize: %s.\n"), - afsdir); + flatdbfile); GNUNET_DISK_file_close (fh); return GNUNET_SYSERR; } - - buffer = GNUNET_malloc_large (size + 1); - if (GNUNET_SYSERR == - GNUNET_DISK_file_read (fh, - buffer, - size)) + if (size > SIZE_MAX) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Unable to read file: %s.\n"), - afsdir); - GNUNET_free (buffer); + _("File too big to map: %llu bytes.\n"), + (unsigned long long) size); + GNUNET_DISK_file_close (fh); + return GNUNET_SYSERR; + } + if (0 == size) + { + GNUNET_DISK_file_close (fh); + return GNUNET_OK; + } + buffer = GNUNET_DISK_file_map (fh, + &mh, + GNUNET_DISK_MAP_TYPE_READ, + size); + if (NULL == buffer) + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, + "mmap"); + GNUNET_DISK_file_close (fh); + return GNUNET_SYSERR; + } + if ('\0' != buffer[size-1]) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Namestore database file `%s' malformed\n"), + flatdbfile); + GNUNET_DISK_file_unmap (mh); GNUNET_DISK_file_close (fh); return GNUNET_SYSERR; } - buffer[size] = '\0'; - GNUNET_DISK_file_close (fh); - if (0 < size) + line = strtok (buffer, "\n"); + while (NULL != line) { - line = strtok (buffer, "\n"); - while (line != NULL) + zone_private_key = strtok (line, ","); + if (NULL == zone_private_key) + break; + rvalue = strtok (NULL, ","); + if (NULL == rvalue) + break; + record_count = strtok (NULL, ","); + if (NULL == record_count) + break; + record_data_b64 = strtok (NULL, ","); + if (NULL == record_data_b64) + break; + label = strtok (NULL, ","); + if (NULL == label) + break; + line = strtok (NULL, "\n"); + entry = GNUNET_new (struct FlatFileEntry); { - zone_private_key = strtok (line, ","); - if (NULL == zone_private_key) - break; - rvalue = strtok (NULL, ","); - if (NULL == rvalue) - break; - record_count = strtok (NULL, ","); - if (NULL == record_count) - break; - record_data_b64 = strtok (NULL, ","); - if (NULL == record_data_b64) - break; - label = strtok (NULL, ","); - if (NULL == label) - break; - line = strtok (NULL, "\n"); - entry = GNUNET_new (struct FlatFileEntry); - { - unsigned long long ll; - - if (1 != sscanf (rvalue, - "%llu", - &ll)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Error parsing entry\n"); - GNUNET_free (entry); - break; - } - entry->rvalue = (uint64_t) ll; - } - { - unsigned int ui; - - if (1 != sscanf (record_count, - "%u", - &ui)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Error parsing entry\n"); - GNUNET_free (entry); - break; - } - entry->record_count = (uint32_t) ui; - } - entry->label = GNUNET_strdup (label); - record_data_size - = GNUNET_STRINGS_base64_decode (record_data_b64, - strlen (record_data_b64), - (void **) &record_data); - entry->record_data = - GNUNET_new_array (entry->record_count, - struct GNUNET_GNSRECORD_Data); - if (GNUNET_OK != - GNUNET_GNSRECORD_records_deserialize (record_data_size, - record_data, - entry->record_count, - entry->record_data)) + unsigned long long ll; + + if (1 != sscanf (rvalue, + "%llu", + &ll)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Unable to deserialize record %s\n", - label); - GNUNET_free (entry->label); + "Error parsing entry\n"); GNUNET_free (entry); - GNUNET_free (record_data); break; } - GNUNET_free (record_data); - - { - struct GNUNET_CRYPTO_EcdsaPrivateKey *private_key; - - GNUNET_STRINGS_base64_decode (zone_private_key, - strlen (zone_private_key), - (void**)&private_key); - entry->private_key = *private_key; - GNUNET_free (private_key); - } + entry->rvalue = (uint64_t) ll; + } + { + unsigned int ui; - hash_pkey_and_label (&entry->private_key, - label, - &hkey); - if (GNUNET_OK != - GNUNET_CONTAINER_multihashmap_put (plugin->hm, - &hkey, - entry, - GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)) + if (1 != sscanf (record_count, + "%u", + &ui)) { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Error parsing entry\n"); GNUNET_free (entry); - GNUNET_break (0); + break; } + entry->record_count = (uint32_t) ui; + } + entry->label = GNUNET_strdup (label); + record_data_size + = GNUNET_STRINGS_base64_decode (record_data_b64, + strlen (record_data_b64), + (void **) &record_data); + entry->record_data = + GNUNET_new_array (entry->record_count, + struct GNUNET_GNSRECORD_Data); + if (GNUNET_OK != + GNUNET_GNSRECORD_records_deserialize (record_data_size, + record_data, + entry->record_count, + entry->record_data)) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + "Unable to deserialize record %s\n", + label); + GNUNET_free (entry->label); + GNUNET_free (entry); + GNUNET_free (record_data); + break; + } + GNUNET_free (record_data); + + { + struct GNUNET_CRYPTO_EcdsaPrivateKey *private_key; + + GNUNET_STRINGS_base64_decode (zone_private_key, + strlen (zone_private_key), + (void**)&private_key); + entry->private_key = *private_key; + GNUNET_free (private_key); + } + + hash_pkey_and_label (&entry->private_key, + label, + &hkey); + if (GNUNET_OK != + GNUNET_CONTAINER_multihashmap_put (plugin->hm, + &hkey, + entry, + GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY)) + { + GNUNET_free (entry); + GNUNET_break (0); } } - GNUNET_free (buffer); + GNUNET_DISK_file_unmap (mh); + GNUNET_DISK_file_close (fh); return GNUNET_OK; } @@ -418,6 +433,10 @@ database_shutdown (struct Plugin *plugin) &store_and_free_entries, fh); GNUNET_CONTAINER_multihashmap_destroy (plugin->hm); + /* append 0-terminator */ + GNUNET_DISK_file_write (fh, + "", + 1); GNUNET_DISK_file_close (fh); } @@ -434,7 +453,7 @@ database_shutdown (struct Plugin *plugin) * @return #GNUNET_OK on success, else #GNUNET_SYSERR */ static int -namestore_heap_store_records (void *cls, +namestore_flat_store_records (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, const char *label, unsigned int rd_count, @@ -499,7 +518,7 @@ namestore_heap_store_records (void *cls, * @return #GNUNET_OK on success, #GNUNET_NO for no results, else #GNUNET_SYSERR */ static int -namestore_heap_lookup_records (void *cls, +namestore_flat_lookup_records (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, @@ -573,7 +592,7 @@ struct IterateContext /** - * Helper function for #namestore_heap_iterate_records(). + * Helper function for #namestore_flat_iterate_records(). * * @param cls a `struct IterateContext` * @param key unused @@ -629,7 +648,7 @@ iterate_zones (void *cls, * @return #GNUNET_OK on success, #GNUNET_NO if there were no more results, #GNUNET_SYSERR on error */ static int -namestore_heap_iterate_records (void *cls, +namestore_flat_iterate_records (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, uint64_t serial, uint64_t limit, @@ -712,7 +731,7 @@ zone_to_name (void *cls, * @return #GNUNET_OK on success, #GNUNET_NO if there were no results, #GNUNET_SYSERR on error */ static int -namestore_heap_zone_to_name (void *cls, +namestore_flat_zone_to_name (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const struct GNUNET_CRYPTO_EcdsaPublicKey *value_zone, GNUNET_NAMESTORE_RecordIterator iter, @@ -744,7 +763,7 @@ namestore_heap_zone_to_name (void *cls, * @return NULL on error, otherwise the plugin context */ void * -libgnunet_plugin_namestore_heap_init (void *cls) +libgnunet_plugin_namestore_flat_init (void *cls) { static struct Plugin plugin; const struct GNUNET_CONFIGURATION_Handle *cfg = cls; @@ -763,12 +782,12 @@ libgnunet_plugin_namestore_heap_init (void *cls) } api = GNUNET_new (struct GNUNET_NAMESTORE_PluginFunctions); api->cls = &plugin; - api->store_records = &namestore_heap_store_records; - api->iterate_records = &namestore_heap_iterate_records; - api->zone_to_name = &namestore_heap_zone_to_name; - api->lookup_records = &namestore_heap_lookup_records; + api->store_records = &namestore_flat_store_records; + api->iterate_records = &namestore_flat_iterate_records; + api->zone_to_name = &namestore_flat_zone_to_name; + api->lookup_records = &namestore_flat_lookup_records; GNUNET_log (GNUNET_ERROR_TYPE_INFO, - _("heap file database running\n")); + _("Flat file database running\n")); return api; } @@ -780,7 +799,7 @@ libgnunet_plugin_namestore_heap_init (void *cls) * @return always NULL */ void * -libgnunet_plugin_namestore_heap_done (void *cls) +libgnunet_plugin_namestore_flat_done (void *cls) { struct GNUNET_NAMESTORE_PluginFunctions *api = cls; struct Plugin *plugin = api->cls; @@ -789,8 +808,8 @@ libgnunet_plugin_namestore_heap_done (void *cls) plugin->cfg = NULL; GNUNET_free (api); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "heap file plugin is finished\n"); + "Flat file plugin is finished\n"); return NULL; } -/* end of plugin_namestore_heap.c */ +/* end of plugin_namestore_flat.c */ diff --git a/src/namestore/test_namestore_api_heap.conf b/src/namestore/test_namestore_api_flat.conf similarity index 87% rename from src/namestore/test_namestore_api_heap.conf rename to src/namestore/test_namestore_api_flat.conf index 1d6173e74..8460d143c 100644 --- a/src/namestore/test_namestore_api_heap.conf +++ b/src/namestore/test_namestore_api_flat.conf @@ -1,7 +1,7 @@ @INLINE@ test_namestore_api.conf [namestore] -DATABASE = heap +DATABASE = flat [namestore-heap] FILENAME = $GNUNET_TEST_HOME/namestore/flat.db diff --git a/src/namestore/test_plugin_namestore_heap.conf b/src/namestore/test_plugin_namestore_flat.conf similarity index 79% rename from src/namestore/test_plugin_namestore_heap.conf rename to src/namestore/test_plugin_namestore_flat.conf index 94f79b9aa..5c632f0d1 100644 --- a/src/namestore/test_plugin_namestore_heap.conf +++ b/src/namestore/test_plugin_namestore_flat.conf @@ -1,2 +1,2 @@ -[namestore-heap] +[namestore-flat] FILENAME = $GNUNET_TMP/gnunet-test-plugin-namestore-flat/flatdb diff --git a/src/util/disk.c b/src/util/disk.c index 4f78c7747..f395a375e 100644 --- a/src/util/disk.c +++ b/src/util/disk.c @@ -2021,7 +2021,7 @@ GNUNET_DISK_file_map (const struct GNUNET_DISK_FileHandle *h, struct GNUNET_DISK_MapHandle **m, enum GNUNET_DISK_MapType access, size_t len) { - if (h == NULL) + if (NULL == h) { errno = EINVAL; return NULL; -- 2.25.1