GNUnet 0.26.2-106-g126384b46
 
Loading...
Searching...
No Matches
gnunet-service-datastore.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet
3 Copyright (C) 2004-2014, 2016, 2026 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20
27#include "platform.h"
28#include "gnunet_util_lib.h"
29#include "gnunet_protocols.h"
32#include "datastore.h"
33
37#define MAX_PENDING 1024
38
42#define MAX_BF_SIZE ((uint32_t) (1LL << 31))
43
48#define MAX_EXPIRE_DELAY \
49 GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
50
55#define MIN_EXPIRE_DELAY \
56 GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)
57
61static char *quota_stat_name;
62
67
72#define MAX_STAT_SYNC_LAG 50
73
74
102
103
108{
113
118
122 uint64_t amount;
123
127 uint64_t entries;
128
132 int32_t rid;
133};
134
135
139static struct DatastorePlugin *plugin;
140
145
150
154static char *plugin_name;
155
159static const struct GNUNET_CONFIGURATION_Handle *cfg;
160
165
172static unsigned long long cache_size;
173
177static unsigned long long reserved;
178
183static unsigned long long payload;
184
190
198
202static unsigned long long quota;
203
207static int do_drop;
208
212static int refresh_bf;
213
219static unsigned int last_sync;
220
224static int stats_worked;
225
226
231static void
233{
236 "# utilization by current datastore",
237 payload,
238 GNUNET_NO);
239 last_sync = 0;
240}
241
242
247static int cleaning_done;
248
253
258
267static void
268delete_expired (void *cls);
269
270
292static int
294 const struct GNUNET_HashCode *key,
295 uint32_t size,
296 const void *data,
298 uint32_t priority,
299 uint32_t anonymity,
300 uint32_t replication,
302 uint64_t uid)
303{
304 struct GNUNET_TIME_Absolute now;
305
306 if (NULL == key)
307 {
312 NULL);
313 return GNUNET_SYSERR;
314 }
316 if (expiration.abs_value_us > now.abs_value_us)
317 {
318 /* finished processing */
323 NULL);
324 return GNUNET_SYSERR;
325 }
327 "Deleting content `%s' of type %u that expired %s ago\n",
328 GNUNET_h2s (key),
329 type,
332 GNUNET_YES));
333 min_expiration = now;
335 gettext_noop ("# bytes expired"),
336 size,
337 GNUNET_YES);
343 NULL);
344 return GNUNET_NO;
345}
346
347
356static void
357delete_expired (void *cls)
358{
359 expired_kill_task = NULL;
361}
362
363
383static int
385 const struct GNUNET_HashCode *key,
386 uint32_t size,
387 const void *data,
389 uint32_t priority,
390 uint32_t anonymity,
391 uint32_t replication,
393 uint64_t uid)
394{
395 unsigned long long *need = cls;
396
397 if (NULL == key)
398 return GNUNET_SYSERR;
399 GNUNET_log (
401 "Deleting %llu bytes of low-priority (%u) content `%s' of type %u at %s prior to expiration (still trying to free another %llu bytes)\n",
402 (unsigned long long) (size + GNUNET_DATASTORE_ENTRY_OVERHEAD),
403 (unsigned int) priority,
404 GNUNET_h2s (key),
405 type,
407 expiration),
408 GNUNET_YES),
409 *need);
411 *need = 0;
412 else
414 if (priority > 0)
416 else
419 gettext_noop ("# bytes purged (low-priority)"),
420 size,
421 GNUNET_YES);
423 return GNUNET_NO;
424}
425
426
439static void
440manage_space (unsigned long long need)
441{
442 unsigned long long last;
443
445 "Asked to free up %llu bytes of cache space\n",
446 need);
447 last = 0;
448 while ((need > 0) && (last != need))
449 {
450 last = need;
452 }
453}
454
455
463static void
465 int code,
466 const char *msg)
467{
468 struct GNUNET_MQ_Envelope *env;
469 struct StatusMessage *sm;
470 size_t slen;
471
473 "Transmitting `%s' message with value %d and message `%s'\n",
474 "STATUS",
475 code,
476 msg != NULL ? msg : "(none)");
477 slen = (msg == NULL) ? 0 : strlen (msg) + 1;
479 sm->status = htonl (code);
481 GNUNET_memcpy (&sm[1], msg, slen);
483}
484
485
504static int
505transmit_item (void *cls,
506 const struct GNUNET_HashCode *key,
507 uint32_t size,
508 const void *data,
510 uint32_t priority,
511 uint32_t anonymity,
512 uint32_t replication,
514 uint64_t uid)
515{
516 struct GNUNET_SERVICE_Client *client = cls;
517 struct GNUNET_MQ_Envelope *env;
519 struct DataMessage *dm;
520
521 if (NULL == key)
522 {
523 /* transmit 'DATA_END' */
524 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transmitting DATA_END message\n");
527 return GNUNET_OK;
528 }
531 dm->rid = htonl (0);
532 dm->size = htonl (size);
533 dm->type = htonl (type);
534 dm->priority = htonl (priority);
535 dm->anonymity = htonl (anonymity);
536 dm->replication = htonl (replication);
538 dm->uid = GNUNET_htonll (uid);
539 dm->key = *key;
540 GNUNET_memcpy (&dm[1], data, size);
541 GNUNET_log (
543 "Transmitting DATA message for `%s' of type %u with expiration %s (in: %s)\n",
544 GNUNET_h2s (key),
545 type,
548 expiration),
549 GNUNET_YES));
551 gettext_noop ("# results found"),
552 1,
553 GNUNET_NO);
555 return GNUNET_OK;
556}
557
558
565static void
566handle_reserve (void *cls, const struct ReserveMessage *msg)
567{
571 static int reservation_gen;
572 struct GNUNET_SERVICE_Client *client = cls;
573 struct ReservationList *e;
574 unsigned long long used;
575 unsigned long long req;
576 uint64_t amount;
577 uint32_t entries;
578
579 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing RESERVE request\n");
580 amount = GNUNET_ntohll (msg->amount);
581 entries = ntohl (msg->entries);
582 used = payload + reserved;
583 req =
584 amount + ((unsigned long long) GNUNET_DATASTORE_ENTRY_OVERHEAD) * entries;
585 if (used + req > quota)
586 {
587 if (quota < used)
588 used =
589 quota; /* cheat a bit for error message (to avoid negative numbers) */
590 GNUNET_log (
592 _ (
593 "Insufficient space (%llu bytes are available) to satisfy RESERVE request for %llu bytes\n"),
594 quota - used,
595 req);
596 if (cache_size < req)
597 {
598 /* TODO: document this in the FAQ; essentially, if this
599 * message happens, the insertion request could be blocked
600 * by less-important content from migration because it is
601 * larger than 1/8th of the overall available space, and
602 * we only reserve 1/8th for "fresh" insertions */
603 GNUNET_log (
605 _ (
606 "The requested amount (%llu bytes) is larger than the cache size (%llu bytes)\n"),
607 req,
608 cache_size);
610 0,
612 "Insufficient space to satisfy request and "
613 "requested amount is larger than cache size"));
614 }
615 else
616 {
618 0,
619 gettext_noop ("Insufficient space to satisfy request"));
620 }
622 return;
623 }
624 reserved += req;
626 gettext_noop ("# reserved"),
627 reserved,
628 GNUNET_NO);
629 e = GNUNET_new (struct ReservationList);
630 e->next = reservations;
631 reservations = e;
632 e->client = client;
633 e->amount = amount;
634 e->entries = entries;
635 e->rid = ++reservation_gen;
637 "Reserve space for %u entries with up to %lu bytes under rid %u\n",
638 entries,
639 amount,
640 e->rid);
641 if (reservation_gen < 0)
642 reservation_gen = 0; /* wrap around */
643 transmit_status (client, e->rid, NULL);
645}
646
647
654static void
656{
657 struct GNUNET_SERVICE_Client *client = cls;
658 struct ReservationList *pos;
659 struct ReservationList *prev;
660 struct ReservationList *next;
661 int rid = ntohl (msg->rid);
662 unsigned long long rem;
663
664 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing RELEASE_RESERVE request\n");
666 prev = NULL;
667 while (NULL != (pos = next))
668 {
669 next = pos->next;
670 if (rid == pos->rid)
671 {
672 if (prev == NULL)
674 else
675 prev->next = next;
676 rem =
677 pos->amount
678 + ((unsigned long long) GNUNET_DATASTORE_ENTRY_OVERHEAD) * pos->entries;
679 GNUNET_assert (reserved >= rem);
680 reserved -= rem;
682 gettext_noop ("# reserved"),
683 reserved,
684 GNUNET_NO);
686 "Returning %llu remaining reserved bytes to storage pool\n",
687 rem);
688 GNUNET_free (pos);
691 return;
692 }
693 prev = pos;
694 }
695 GNUNET_break (0);
698 gettext_noop ("Could not find matching reservation"));
700}
701
702
709static int
710check_data (const struct DataMessage *dm)
711{
712 uint16_t size;
713 uint32_t dsize;
714
715 size = ntohs (dm->header.size);
716 dsize = ntohl (dm->size);
717 if (size != dsize + sizeof(struct DataMessage))
718 {
719 GNUNET_break (0);
720 return GNUNET_SYSERR;
721 }
722 return GNUNET_OK;
723}
724
725
736static void
738 const struct GNUNET_HashCode *key,
739 uint32_t size,
740 int status,
741 const char *msg)
742{
743 struct GNUNET_SERVICE_Client *client = cls;
744
745 if (GNUNET_OK == status)
746 {
748 gettext_noop ("# bytes stored"),
749 size,
750 GNUNET_YES);
753 "Successfully stored %u bytes under key `%s'\n",
754 size,
755 GNUNET_h2s (key));
756 }
757 transmit_status (client,
759 msg);
761 {
763 _ ("Need %llu bytes more space (%llu allowed, using %llu)\n"),
764 (unsigned long long) size + GNUNET_DATASTORE_ENTRY_OVERHEAD,
765 (unsigned long long) (quota - reserved - cache_size),
766 (unsigned long long) payload);
768 }
769}
770
771
779static int
780check_put (void *cls, const struct DataMessage *dm)
781{
782 if (GNUNET_OK != check_data (dm))
783 {
784 GNUNET_break (0);
785 return GNUNET_SYSERR;
786 }
787 return GNUNET_OK;
788}
789
790
797static void
798handle_put (void *cls, const struct DataMessage *dm)
799{
800 struct GNUNET_SERVICE_Client *client = cls;
801 int rid;
802 struct ReservationList *pos;
803 uint32_t size;
804
806 "Processing PUT request for `%s' of type %u\n",
807 GNUNET_h2s (&dm->key),
808 (uint32_t) ntohl (dm->type));
809 rid = ntohl (dm->rid);
810 size = ntohl (dm->size);
812 "Put entry into space with %u bytes under rid %u\n",
813 size,
814 rid);
815 if (rid > 0)
816 {
817 pos = reservations;
818 while ((NULL != pos) && (rid != pos->rid))
819 pos = pos->next;
820 GNUNET_break (pos != NULL);
821 if (NULL != pos)
822 {
823 GNUNET_break (pos->entries > 0);
824 GNUNET_break (pos->amount >= size);
825 pos->entries--;
826 pos->amount -= size;
829 gettext_noop ("# reserved"),
830 reserved,
831 GNUNET_NO);
832 }
833 }
834 {
835 bool absent =
837 plugin->api->put (plugin->api->cls,
838 &dm->key,
839 absent,
840 size,
841 &dm[1],
842 ntohl (dm->type),
843 ntohl (dm->priority),
844 ntohl (dm->anonymity),
845 ntohl (dm->replication),
848 client);
849 }
851}
852
853
860static void
861handle_get (void *cls, const struct GetMessage *msg)
862{
863 struct GNUNET_SERVICE_Client *client = cls;
864
866 "Processing GET request of type %u\n",
867 (uint32_t) ntohl (msg->type));
869 gettext_noop ("# GET requests received"),
870 1,
871 GNUNET_NO);
873 GNUNET_ntohll (msg->next_uid),
874 msg->random,
875 NULL,
876 ntohl (msg->type),
878 client);
880}
881
882
889static void
890handle_get_key (void *cls, const struct GetKeyMessage *msg)
891{
892 struct GNUNET_SERVICE_Client *client = cls;
893
895 "Processing GET request for `%s' of type %u\n",
896 GNUNET_h2s (&msg->key),
897 (uint32_t) ntohl (msg->type));
899 gettext_noop ("# GET KEY requests received"),
900 1,
901 GNUNET_NO);
903 {
904 /* don't bother database... */
906 "Empty result set for GET request for `%s' (bloomfilter).\n",
907 GNUNET_h2s (&msg->key));
910 "# requests filtered by bloomfilter"),
911 1,
912 GNUNET_NO);
913 transmit_item (client,
914 NULL,
915 0,
916 NULL,
917 0,
918 0,
919 0,
920 0,
922 0);
924 return;
925 }
927 GNUNET_ntohll (msg->next_uid),
928 msg->random,
929 &msg->key,
930 ntohl (msg->type),
932 client);
934}
935
936
943static void
944handle_get_replication (void *cls, const struct GNUNET_MessageHeader *message)
945{
946 struct GNUNET_SERVICE_Client *client = cls;
947
948 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing GET_REPLICATION request\n");
951 "# GET REPLICATION requests received"),
952 1,
953 GNUNET_NO);
956}
957
958
965static void
967{
968 struct GNUNET_SERVICE_Client *client = cls;
970
971 type = ntohl (msg->type);
973 {
974 GNUNET_break (0);
976 return;
977 }
979 "Processing GET_ZERO_ANONYMITY request\n");
982 "# GET ZERO ANONYMITY requests received"),
983 1,
984 GNUNET_NO);
986 GNUNET_ntohll (msg->next_uid),
987 type,
989 client);
991}
992
993
1004static void
1006 const struct GNUNET_HashCode *key,
1007 uint32_t size,
1008 int status,
1009 const char *msg)
1010{
1011 struct GNUNET_SERVICE_Client *client = cls;
1012
1013 if (GNUNET_SYSERR == status)
1014 {
1015 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "REMOVE request failed: %s.\n", msg);
1016 transmit_status (client, GNUNET_NO, msg);
1017 return;
1018 }
1019 if (GNUNET_NO == status)
1020 {
1022 "Content not found for REMOVE request.\n");
1023 transmit_status (client, GNUNET_NO, _ ("Content not found"));
1024 return;
1025 }
1027 "Item matches REMOVE request for key `%s'.\n",
1028 GNUNET_h2s (key));
1030 gettext_noop ("# bytes removed (explicit request)"),
1031 size,
1032 GNUNET_YES);
1034 transmit_status (client, GNUNET_OK, NULL);
1035}
1036
1037
1045static int
1046check_remove (void *cls, const struct DataMessage *dm)
1047{
1048 if (GNUNET_OK != check_data (dm))
1049 {
1050 GNUNET_break (0);
1051 return GNUNET_SYSERR;
1052 }
1053 return GNUNET_OK;
1054}
1055
1056
1063static void
1064handle_remove (void *cls, const struct DataMessage *dm)
1065{
1066 struct GNUNET_SERVICE_Client *client = cls;
1067
1069 gettext_noop ("# REMOVE requests received"),
1070 1,
1071 GNUNET_NO);
1073 "Processing REMOVE request for `%s'\n",
1074 GNUNET_h2s (&dm->key));
1076 &dm->key,
1077 ntohl (dm->size),
1078 &dm[1],
1080 client);
1082}
1083
1084
1091static void
1092handle_drop (void *cls,
1093 const struct GNUNET_MessageHeader *message)
1094{
1095 struct GNUNET_SERVICE_Client *client = cls;
1096
1098 "Processing DROP request\n");
1101}
1102
1103
1112static void
1114{
1115 if ((delta < 0) && (payload < -delta))
1116 {
1117 GNUNET_log (
1119 _ (
1120 "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"),
1121 (long long) payload,
1122 (long long) -delta);
1125 _ ("New payload: %lld\n"),
1126 (long long) payload);
1127 sync_stats ();
1128 return;
1129 }
1130 payload += delta;
1131 last_sync++;
1133 sync_stats ();
1134}
1135
1136
1147static int
1149 const char *subsystem,
1150 const char *name,
1151 uint64_t value,
1152 int is_persistent)
1153{
1156 payload += value;
1157 GNUNET_log (
1159 "Notification from statistics about existing payload (%llu), new payload is %llu\n",
1160 (unsigned long long) value,
1161 (unsigned long long) payload);
1162 return GNUNET_OK;
1163}
1164
1165
1169static struct DatastorePlugin *
1171{
1172 struct DatastorePlugin *ret;
1173 char *libname;
1174
1175 ret = GNUNET_new (struct DatastorePlugin);
1176 ret->env.cfg = cfg;
1177 ret->env.duc = &disk_utilization_change_cb;
1178 ret->env.cls = NULL;
1180 _ ("Loading `%s' datastore plugin\n"),
1181 plugin_name);
1182 GNUNET_asprintf (&libname,
1183 "libgnunet_plugin_datastore_%s",
1184 plugin_name);
1185 ret->short_name = GNUNET_strdup (plugin_name);
1186 ret->lib_name = libname;
1188 libname,
1189 &ret->env);
1190 if (NULL == ret->api)
1191 {
1193 _ ("Failed to load datastore plugin for `%s'\n"),
1194 plugin_name);
1195 GNUNET_free (ret->short_name);
1196 GNUNET_free (libname);
1197 GNUNET_free (ret);
1198 return NULL;
1199 }
1200 return ret;
1201}
1202
1203
1210static void
1212{
1214 "Datastore service is unloading plugin...\n");
1215 GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
1216 GNUNET_free (plug->lib_name);
1217 GNUNET_free (plug->short_name);
1218 GNUNET_free (plug);
1219}
1220
1221
1225static void
1234
1235
1243static void
1245 const struct GNUNET_HashCode *key,
1246 unsigned int count)
1247{
1248 struct GNUNET_CONTAINER_BloomFilter *bf = cls;
1249
1250 if (NULL == key)
1251 {
1253 _ ("Bloomfilter construction complete.\n"));
1254 begin_service ();
1255 return;
1256 }
1257
1258 while (0 < count--)
1260}
1261
1262
1270static void
1271process_stat_done (void *cls, int success)
1272{
1273 stat_get = NULL;
1274 if (NULL != stat_timeout_task)
1275 {
1277 stat_timeout_task = NULL;
1278 }
1279 plugin = load_plugin ();
1280 if (NULL == plugin)
1281 {
1283 filter = NULL;
1284 if (NULL != stats)
1285 {
1287 stats = NULL;
1288 }
1289 return;
1290 }
1291
1292 if (GNUNET_NO == stats_worked)
1293 {
1295 "Failed to obtain value from statistics service, recomputing it\n");
1298 _ ("New payload: %lld\n"),
1299 (long long) payload);
1300 }
1301
1302 if (GNUNET_YES == refresh_bf)
1303 {
1305 _ ("Rebuilding bloomfilter. Please be patient.\n"));
1306 if (NULL != plugin->api->get_keys)
1307 {
1309 return;
1310 }
1311 else
1312 {
1314 _ (
1315 "Plugin does not support get_keys function. Please fix!\n"))
1316 ;
1317 }
1318 }
1319 begin_service ();
1320}
1321
1322
1328static void
1329stat_timeout (void *cls)
1330{
1331 stat_timeout_task = NULL;
1334}
1335
1336
1340static void
1341cleaning_task (void *cls)
1342{
1344 if (NULL != expired_kill_task)
1345 {
1347 expired_kill_task = NULL;
1348 }
1349 if (GNUNET_YES == do_drop)
1350 {
1352 "Dropping database!\n");
1353 plugin->api->drop (plugin->api->cls);
1354 payload = 0;
1355 last_sync++;
1356 }
1357 if (NULL != plugin)
1358 {
1360 plugin = NULL;
1361 }
1362 if (NULL != filter)
1363 {
1365 filter = NULL;
1366 }
1367 if (NULL != stat_get)
1368 {
1370 stat_get = NULL;
1371 }
1372 if (NULL != stat_timeout_task)
1373 {
1375 stat_timeout_task = NULL;
1376 }
1378 plugin_name = NULL;
1379 if (last_sync > 0)
1380 sync_stats ();
1381 if (NULL != stats)
1382 {
1384 stats = NULL;
1385 }
1387 quota_stat_name = NULL;
1388}
1389
1390
1399static void *
1401 struct GNUNET_SERVICE_Client *client,
1402 struct GNUNET_MQ_Handle *mq)
1403{
1404 return client;
1405}
1406
1407
1416static void
1418 struct GNUNET_SERVICE_Client *client,
1419 void *app_ctx)
1420{
1421 struct ReservationList *pos;
1422 struct ReservationList *prev;
1423 struct ReservationList *next;
1424
1425 GNUNET_assert (app_ctx == client);
1426 prev = NULL;
1427 pos = reservations;
1428 while (NULL != pos)
1429 {
1430 next = pos->next;
1431 if (pos->client == client)
1432 {
1433 if (NULL == prev)
1435 else
1436 prev->next = next;
1438 GNUNET_free (pos);
1439 }
1440 else
1441 {
1442 prev = pos;
1443 }
1444 pos = next;
1445 }
1447 gettext_noop ("# reserved"),
1448 reserved,
1449 GNUNET_NO);
1450}
1451
1452
1460static void
1461run (void *cls,
1462 const struct GNUNET_CONFIGURATION_Handle *c,
1463 struct GNUNET_SERVICE_Handle *serv)
1464{
1465 char *fn;
1466 char *pfn;
1467 unsigned int bf_size;
1468
1469 service = serv;
1470 cfg = c;
1472 "DATASTORE",
1473 "DATABASE",
1474 &plugin_name))
1475 {
1477 "DATABASE",
1478 "DATASTORE");
1479 return;
1480 }
1482 _ ("# bytes used in file-sharing datastore `%s'"),
1483 plugin_name);
1484 if (GNUNET_OK !=
1485 GNUNET_CONFIGURATION_get_value_size (cfg, "DATASTORE", "QUOTA", &quota))
1486 {
1487 GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "QUOTA", "DATASTORE");
1488 return;
1489 }
1490 stats = GNUNET_STATISTICS_create ("datastore", cfg);
1492 cache_size = quota / 8; /* Or should we make this an option? */
1494 gettext_noop ("# cache size"),
1495 cache_size,
1496 GNUNET_NO);
1497 if (quota / (32 * 1024LL) > MAX_BF_SIZE)
1498 bf_size = MAX_BF_SIZE;
1499 else
1500 bf_size =
1501 quota / (32 * 1024LL); /* 8 bit per entry, 1 bit per 32 kb in DB */
1502 fn = NULL;
1504 "DATASTORE",
1505 "BLOOMFILTER",
1506 &fn)) ||
1508 {
1510 _ ("Could not use specified filename `%s' for bloomfilter.\n"),
1511 NULL != fn ? fn : "");
1512 GNUNET_free (fn);
1513 fn = NULL;
1514 }
1515 if (NULL != fn)
1516 {
1517 GNUNET_asprintf (&pfn, "%s.%s", fn, plugin_name);
1518 if (GNUNET_YES == GNUNET_DISK_file_test (pfn))
1519 {
1520 filter =
1522 bf_size,
1523 5); /* approx. 3% false positives at max use */
1524 if (NULL == filter)
1525 {
1526 /* file exists but not valid, remove and try again, but refresh */
1527 if (0 != unlink (pfn))
1528 {
1529 /* failed to remove, run without file */
1531 _ ("Failed to remove bogus bloomfilter file `%s'\n"),
1532 pfn);
1533 GNUNET_free (pfn);
1534 pfn = NULL;
1536 NULL,
1537 bf_size,
1538 5); /* approx. 3% false positives at max use */
1540 }
1541 else
1542 {
1543 /* try again after remove */
1545 pfn,
1546 bf_size,
1547 5); /* approx. 3% false positives at max use */
1549 if (NULL == filter)
1550 {
1551 /* failed yet again, give up on using file */
1553 _ ("Failed to remove bogus bloomfilter file `%s'\n"),
1554 pfn);
1555 GNUNET_free (pfn);
1556 pfn = NULL;
1558 NULL,
1559 bf_size,
1560 5); /* approx. 3% false positives at max use */
1561 }
1562 }
1563 }
1564 else
1565 {
1566 /* normal case: have an existing valid bf file, no need to refresh */
1568 }
1569 }
1570 else
1571 {
1572 filter =
1574 bf_size,
1575 5); /* approx. 3% false positives at max use */
1577 }
1578 GNUNET_free (pfn);
1579 }
1580 else
1581 {
1582 filter =
1584 bf_size,
1585 5); /* approx. 3% false positives at max use */
1587 }
1588 GNUNET_free (fn);
1589 if (NULL == filter)
1590 {
1592 _ ("Failed to initialize bloomfilter.\n"));
1593 if (NULL != stats)
1594 {
1596 stats = NULL;
1597 }
1598 return;
1599 }
1602 "datastore",
1606 NULL);
1607 if (NULL == stat_get)
1609 else
1611 &stat_timeout,
1612 NULL);
1614}
1615
1616
1622 "datastore",
1624 &run,
1627 NULL,
1628 GNUNET_MQ_hd_fixed_size (reserve,
1630 struct ReserveMessage,
1631 NULL),
1632 GNUNET_MQ_hd_fixed_size (release_reserve,
1634 struct ReleaseReserveMessage,
1635 NULL),
1638 struct DataMessage,
1639 NULL),
1642 struct GetMessage,
1643 NULL),
1644 GNUNET_MQ_hd_fixed_size (get_key,
1646 struct GetKeyMessage,
1647 NULL),
1648 GNUNET_MQ_hd_fixed_size (get_replication,
1650 struct GNUNET_MessageHeader,
1651 NULL),
1652 GNUNET_MQ_hd_fixed_size (get_zero_anonymity,
1655 NULL),
1656 GNUNET_MQ_hd_var_size (remove,
1658 struct DataMessage,
1659 NULL),
1662 struct GNUNET_MessageHeader,
1663 NULL),
1665
1666
1667/* end of gnunet-service-datastore.c */
struct GNUNET_MessageHeader * msg
Definition 005.c:2
struct GNUNET_MQ_Envelope * env
Definition 005.c:1
structs for communication between datastore service and API
#define gettext_noop(String)
Definition gettext.h:74
static int ret
Final status code.
Definition gnunet-arm.c:93
static int end
Set if we are to shutdown all services (including ARM).
Definition gnunet-arm.c:33
static unsigned int replication
Desired replication level.
static char * data
The data to insert into the dht.
struct GNUNET_HashCode key
The key used in the DHT.
static struct GNUNET_TIME_Relative expiration
User supplied expiration value.
static int get
Get DID Documement for DID Flag.
Definition gnunet-did.c:63
static unsigned int anonymity
static char * name
Name (label) of the records to list.
static char * value
Value of the record to add/remove.
static uint32_t type
Type string converted to DNS type value.
static int status
The program status; 0 for success.
Definition gnunet-nse.c:39
static int check_put(void *cls, const struct DataMessage *dm)
Verify PUT-message.
static struct GNUNET_STATISTICS_GetHandle * stat_get
Handle for pending get request.
static void run(void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *serv)
Process datastore requests.
static void stat_timeout(void *cls)
Fetching stats took to long, run without.
static void handle_drop(void *cls, const struct GNUNET_MessageHeader *message)
Handle DROP-message.
static void cleaning_task(void *cls)
Task run during shutdown.
static int expired_processor(void *cls, const struct GNUNET_HashCode *key, uint32_t size, const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority, uint32_t anonymity, uint32_t replication, struct GNUNET_TIME_Absolute expiration, uint64_t uid)
Iterate over the expired items stored in the datastore.
static char * plugin_name
Name of our plugin.
static void add_key_to_bloomfilter(void *cls, const struct GNUNET_HashCode *key, unsigned int count)
Adds a given key to the bloomfilter in cls count times.
static struct DatastorePlugin * plugin
Our datastore plugin (NULL if not available).
static int stats_worked
Did we get an answer from statistics?
static struct GNUNET_STATISTICS_Handle * stats
Handle for reporting statistics.
static const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
static struct GNUNET_SCHEDULER_Task * stat_timeout_task
Task to timeout stat GET.
static struct GNUNET_CONTAINER_BloomFilter * filter
Bloomfilter to quickly tell if we don't have the content.
static void delete_expired(void *cls)
Task that is used to remove expired entries from the datastore.
static struct GNUNET_TIME_Absolute min_expiration
Minimum time that content should have to not be discarded instantly (time stamp of any content that w...
static void handle_remove(void *cls, const struct DataMessage *dm)
Handle REMOVE-message.
static unsigned long long payload
How much data are we currently storing in the database?
static int check_remove(void *cls, const struct DataMessage *dm)
Verify REMOVE-message.
static void handle_reserve(void *cls, const struct ReserveMessage *msg)
Handle RESERVE-message.
#define MAX_BF_SIZE
Limit size of bloom filter to 2 GB.
static void put_continuation(void *cls, const struct GNUNET_HashCode *key, uint32_t size, int status, const char *msg)
Put continuation.
static char * quota_stat_name
Name under which we store current space consumption.
static void handle_get_key(void *cls, const struct GetKeyMessage *msg)
Handle GNUNET_MESSAGE_TYPE_DATASTORE_GET_KEY-message.
static int quota_processor(void *cls, const struct GNUNET_HashCode *key, uint32_t size, const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority, uint32_t anonymity, uint32_t replication, struct GNUNET_TIME_Absolute expiration, uint64_t uid)
An iterator over a set of items stored in the datastore that deletes until we're happy with respect t...
static void process_stat_done(void *cls, int success)
We finished receiving the statistic.
static void remove_continuation(void *cls, const struct GNUNET_HashCode *key, uint32_t size, int status, const char *msg)
Remove continuation.
#define MIN_EXPIRE_DELAY
How fast are we allowed to query the database for deleting expired content? (1 item per second).
static void * client_connect_cb(void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
Add a client to our list of active clients.
static void transmit_status(struct GNUNET_SERVICE_Client *client, int code, const char *msg)
Transmit a status code to the client.
static int check_data(const struct DataMessage *dm)
Check that the given message is a valid data message.
static int process_stat_in(void *cls, const char *subsystem, const char *name, uint64_t value, int is_persistent)
Callback function to process statistic values.
static int do_drop
Should the database be dropped on exit?
static int cleaning_done
Have we already cleaned up the TCCs and are hence no longer willing (or able) to transmit anything to...
static void handle_release_reserve(void *cls, const struct ReleaseReserveMessage *msg)
Handle RELEASE_RESERVE-message.
#define MAX_STAT_SYNC_LAG
After how many payload-changing operations do we sync our statistics?
static void manage_space(unsigned long long need)
Manage available disk space by running tasks that will discard content if necessary.
static struct GNUNET_SCHEDULER_Task * expired_kill_task
Identity of the task that is used to delete expired content.
static void begin_service()
Initialization complete, start operating the service.
static unsigned long long quota
How much space are we allowed to use?
static struct ReservationList * reservations
Linked list of space reservations made by clients.
static unsigned int last_sync
Number of updates that were made to the payload value since we last synchronized it with the statisti...
static void handle_get_replication(void *cls, const struct GNUNET_MessageHeader *message)
Handle GET_REPLICATION-message.
static void handle_get(void *cls, const struct GetMessage *msg)
Handle GNUNET_MESSAGE_TYPE_DATASTORE_GET-message.
static unsigned long long reserved
How much space have we currently reserved?
static void sync_stats()
Synchronize our utilization statistics with the statistics service.
static int transmit_item(void *cls, const struct GNUNET_HashCode *key, uint32_t size, const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority, uint32_t anonymity, uint32_t replication, struct GNUNET_TIME_Absolute expiration, uint64_t uid)
Function that will transmit the given datastore entry to the client.
static void handle_put(void *cls, const struct DataMessage *dm)
Handle PUT-message.
static void unload_plugin(struct DatastorePlugin *plug)
Function called when the service shuts down.
#define MAX_EXPIRE_DELAY
How long are we at most keeping "expired" content past the expiration date in the database?
static void disk_utilization_change_cb(void *cls, int delta)
Function called by plugins to notify us about a change in their disk utilization.
static void client_disconnect_cb(void *cls, struct GNUNET_SERVICE_Client *client, void *app_ctx)
Called whenever a client is disconnected.
static struct GNUNET_SERVICE_Handle * service
Handle to our server.
static int refresh_bf
Should we refresh the BF when the DB is loaded?
static struct DatastorePlugin * load_plugin()
Load the datastore plugin.
static unsigned long long cache_size
How much space are we using for the cache? (space available for insertions that will be instantly rec...
static void handle_get_zero_anonymity(void *cls, const struct GetZeroAnonymityMessage *msg)
Handle GET_ZERO_ANONYMITY-message.
static char * subsystem
Set to subsystem that we're going to get stats for (or NULL for all).
API for the database backend plugins.
GNUNET_BLOCK_Type
WARNING: This header is generated! In order to add DHT block types, you must register them in GANA,...
@ GNUNET_BLOCK_TYPE_ANY
Identifier for any block.
Constants for network protocols.
API to create, modify and access statistics.
#define GNUNET_MAX_MESSAGE_SIZE
Largest supported message (to be precise, one byte more than the largest possible message,...
struct GNUNET_CONTAINER_BloomFilter * GNUNET_CONTAINER_bloomfilter_init(const char *data, size_t size, unsigned int k)
Create a Bloom filter from raw bits.
void GNUNET_CONTAINER_bloomfilter_add(struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Add an element to the filter.
bool GNUNET_CONTAINER_bloomfilter_test(const struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Test if an element is in the filter.
struct GNUNET_CONTAINER_BloomFilter * GNUNET_CONTAINER_bloomfilter_load(const char *filename, size_t size, unsigned int k)
Load a Bloom filter from a file.
void GNUNET_CONTAINER_bloomfilter_remove(struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Remove an element from the filter.
void GNUNET_CONTAINER_bloomfilter_free(struct GNUNET_CONTAINER_BloomFilter *bf)
Free the space associated with a filter in memory, flush to drive if needed (do not free the space on...
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_filename(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be the name of a file or directory.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_size(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *size)
Get a configuration value that should be a size in bytes.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
#define GNUNET_DATASTORE_ENTRY_OVERHEAD
How many bytes of overhead will we assume per entry in any DB (for reservations)?
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory).
Definition disk.c:557
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_create_for_file(const char *filename)
Create the directory structure for storing a file.
Definition disk.c:664
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
#define GNUNET_log(kind,...)
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
uint64_t GNUNET_htonll(uint64_t n)
Convert unsigned 64-bit integer to network byte order.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
@ GNUNET_SCHEDULER_PRIORITY_IDLE
Run when otherwise idle.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_ERROR_TYPE_INFO
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition mq.c:305
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
void * GNUNET_PLUGIN_load(const struct GNUNET_OS_ProjectData *pd, const char *library_name, void *arg)
Setup plugin (runs the "init" callback and returns whatever "init" returned).
Definition plugin.c:221
void * GNUNET_PLUGIN_unload(const char *library_name, void *arg)
Unload plugin (runs the "done" callback and returns whatever "done" returned).
Definition plugin.c:277
#define GNUNET_MESSAGE_TYPE_DATASTORE_DROP
Message sent by datastore client to drop the database.
#define GNUNET_MESSAGE_TYPE_DATASTORE_RELEASE_RESERVE
Message sent by datastore client on join.
#define GNUNET_MESSAGE_TYPE_DATASTORE_DATA_END
Message sent by datastore to client signaling end of matching data.
#define GNUNET_MESSAGE_TYPE_DATASTORE_GET_KEY
Message sent by datastore client to get data by key.
#define GNUNET_MESSAGE_TYPE_DATASTORE_RESERVE
Message sent by datastore client on join.
#define GNUNET_MESSAGE_TYPE_DATASTORE_REMOVE
Message sent by datastore client to remove data.
#define GNUNET_MESSAGE_TYPE_DATASTORE_GET
Message sent by datastore client to get data.
#define GNUNET_MESSAGE_TYPE_DATASTORE_DATA
Message sent by datastore to client providing requested data (in response to GET or GET_RANDOM reques...
#define GNUNET_MESSAGE_TYPE_DATASTORE_PUT
Message sent by datastore client to store data.
#define GNUNET_MESSAGE_TYPE_DATASTORE_GET_REPLICATION
Message sent by datastore client to get random data.
#define GNUNET_MESSAGE_TYPE_DATASTORE_STATUS
Message sent by datastore to client informing about status processing a request (in response to RESER...
#define GNUNET_MESSAGE_TYPE_DATASTORE_GET_ZERO_ANONYMITY
Message sent by datastore client to get random data.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition scheduler.c:1345
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition scheduler.c:986
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition scheduler.c:1283
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed_with_priority(struct GNUNET_TIME_Relative delay, enum GNUNET_SCHEDULER_Priority priority, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition scheduler.c:1213
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_with_priority(enum GNUNET_SCHEDULER_Priority prio, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified priority.
Definition scheduler.c:1237
#define GNUNET_SERVICE_MAIN(pd, service_name, service_options, init_cb, connect_cb, disconnect_cb, cls,...)
Creates the "main" function for a GNUnet service.
void GNUNET_SERVICE_suspend(struct GNUNET_SERVICE_Handle *sh)
Suspend accepting connections from the listen socket temporarily.
Definition service.c:2381
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition service.c:2463
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition service.c:2545
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition service.c:2434
void GNUNET_SERVICE_resume(struct GNUNET_SERVICE_Handle *sh)
Resume accepting connections from the listen socket.
Definition service.c:2389
@ GNUNET_SERVICE_OPTION_NONE
Use defaults.
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
void GNUNET_STATISTICS_get_cancel(struct GNUNET_STATISTICS_GetHandle *gh)
Cancel a GNUNET_STATISTICS_get request.
void GNUNET_STATISTICS_set(struct GNUNET_STATISTICS_Handle *handle, const char *name, uint64_t value, int make_persistent)
Set statistic value for the peer.
struct GNUNET_STATISTICS_GetHandle * GNUNET_STATISTICS_get(struct GNUNET_STATISTICS_Handle *handle, const char *subsystem, const char *name, GNUNET_STATISTICS_Callback cont, GNUNET_STATISTICS_Iterator proc, void *cls)
Get statistic from the peer.
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).
#define GNUNET_TIME_UNIT_SECONDS
One second.
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition time.c:406
const char * GNUNET_STRINGS_relative_time_to_string(struct GNUNET_TIME_Relative delta, int do_round)
Give relative time in human-readable fancy format.
Definition strings.c:604
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition time.c:111
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition time.c:737
#define GNUNET_TIME_UNIT_ZERO_ABS
Absolute time zero.
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_difference(struct GNUNET_TIME_Absolute start, struct GNUNET_TIME_Absolute end)
Compute the time difference between the given start and end times.
Definition time.c:423
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition time.c:636
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition strings.c:665
#define GNUNET_TIME_UNIT_FOREVER_ABS
Constant used to specify "forever".
static unsigned int size
Size of the "table".
Definition peer.c:68
#define _(String)
GNU gettext support macro.
Definition platform.h:179
static struct GNUNET_MQ_Handle * mq
Our connection to the resolver service, created on-demand, but then persists until error or shutdown.
static struct GNUNET_TIME_Relative delta
Definition speedup.c:36
Message transmitting content from or to the datastore service.
Definition datastore.h:192
uint32_t priority
Priority of the item (NBO), zero for remove.
Definition datastore.h:219
struct GNUNET_HashCode key
Key under which the item can be found.
Definition datastore.h:252
uint64_t uid
Unique ID for the content (can be used for UPDATE); can be zero for remove (which indicates that the ...
Definition datastore.h:242
struct GNUNET_TIME_AbsoluteNBO expiration
Expiration time (NBO); zero for remove.
Definition datastore.h:247
struct GNUNET_MessageHeader header
Type is either GNUNET_MESSAGE_TYPE_DATASTORE_PUT, GNUNET_MESSAGE_TYPE_DATASTORE_REMOVE or GNUNET_MESS...
Definition datastore.h:199
uint32_t type
Type of the item (NBO), zero for remove, (actually an enum GNUNET_BLOCK_Type)
Definition datastore.h:214
uint32_t size
Number of bytes in the item (NBO).
Definition datastore.h:209
uint32_t replication
Desired replication level.
Definition datastore.h:229
uint32_t anonymity
Desired anonymity level (NBO), zero for remove.
Definition datastore.h:224
uint32_t rid
Reservation ID to use; use zero for none.
Definition datastore.h:204
Our datastore plugin.
char * lib_name
Name of the library (e.g.
struct GNUNET_DATASTORE_PluginFunctions * api
API of the transport as returned by the plugin's initialization function.
char * short_name
Short name for the plugin (e.g.
struct GNUNET_DATASTORE_PluginEnvironment env
Environment this transport service is using for this plugin.
The datastore service will pass a pointer to a struct of this type as the first and only argument to ...
Each plugin is required to return a pointer to a struct of this type as the return value from its ent...
PluginGetKey get_key
Get a particular datum matching a given hash from the datastore.
PluginGetRandom get_expiration
Function to get a random expired item or, if none are expired, either the oldest entry or one with a ...
PluginEstimateSize estimate_size
Calculate the current on-disk size of the SQ store.
PluginGetKeys get_keys
Iterate over all keys in the database.
PluginGetRandom get_replication
Function to get a random item with high replication score from the database, lowering the item's repl...
PluginPut put
Function to store an item in the datastore.
void * cls
Closure to use for all of the following callbacks (except "next_request").
PluginGetType get_zero_anonymity
Get datum (of the specified type) with anonymity level zero.
PluginDrop drop
Delete the database.
PluginRemoveKey remove_key
Function to remove an item from the database.
A 512-bit hashcode.
Handle to a message queue.
Definition mq.c:87
Header for all communications.
Entry in list of pending tasks.
Definition scheduler.c:141
Handle to a client that is connected to a service.
Definition service.c:249
Handle to a service.
Definition service.c:116
Linked list of things we still need to do.
Handle for the service.
Time for absolute times used by GNUnet, in microseconds.
uint64_t abs_value_us
The actual value.
Message to the datastore service asking about specific content.
Definition datastore.h:108
Message to the datastore service asking about specific content.
Definition datastore.h:141
Message to the datastore service asking about zero anonymity content.
Definition datastore.h:169
Message from datastore client informing service that the remainder of the reserved bytes can now be r...
Definition datastore.h:90
Linked list of active reservations.
uint64_t amount
Number of bytes (still) reserved.
struct GNUNET_SERVICE_Client * client
Client that made the reservation.
int32_t rid
Reservation identifier.
uint64_t entries
Number of items (still) reserved.
struct ReservationList * next
This is a linked list.
Message from datastore service informing client about the current size of the datastore.
Definition datastore.h:40
Message from datastore service informing client about the success or failure of a requested operation...
Definition datastore.h:65
struct GNUNET_TIME_AbsoluteNBO min_expiration
Minimum expiration time required for content to be stored by the datacache at this time,...
Definition datastore.h:80
int32_t status
Status code, -1 for errors.
Definition datastore.h:74