GNUnet 0.22.2
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 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
79{
85
90
94 char *lib_name;
95
101};
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;
636 if (reservation_gen < 0)
637 reservation_gen = 0; /* wrap around */
638 transmit_status (client, e->rid, NULL);
640}
641
642
649static void
651{
652 struct GNUNET_SERVICE_Client *client = cls;
653 struct ReservationList *pos;
654 struct ReservationList *prev;
655 struct ReservationList *next;
656 int rid = ntohl (msg->rid);
657 unsigned long long rem;
658
659 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing RELEASE_RESERVE request\n");
661 prev = NULL;
662 while (NULL != (pos = next))
663 {
664 next = pos->next;
665 if (rid == pos->rid)
666 {
667 if (prev == NULL)
669 else
670 prev->next = next;
671 rem =
672 pos->amount
673 + ((unsigned long long) GNUNET_DATASTORE_ENTRY_OVERHEAD) * pos->entries;
674 GNUNET_assert (reserved >= rem);
675 reserved -= rem;
677 gettext_noop ("# reserved"),
678 reserved,
679 GNUNET_NO);
681 "Returning %llu remaining reserved bytes to storage pool\n",
682 rem);
683 GNUNET_free (pos);
686 return;
687 }
688 prev = pos;
689 }
690 GNUNET_break (0);
693 gettext_noop ("Could not find matching reservation"));
695}
696
697
704static int
705check_data (const struct DataMessage *dm)
706{
707 uint16_t size;
708 uint32_t dsize;
709
710 size = ntohs (dm->header.size);
711 dsize = ntohl (dm->size);
712 if (size != dsize + sizeof(struct DataMessage))
713 {
714 GNUNET_break (0);
715 return GNUNET_SYSERR;
716 }
717 return GNUNET_OK;
718}
719
720
731static void
733 const struct GNUNET_HashCode *key,
734 uint32_t size,
735 int status,
736 const char *msg)
737{
738 struct GNUNET_SERVICE_Client *client = cls;
739
740 if (GNUNET_OK == status)
741 {
743 gettext_noop ("# bytes stored"),
744 size,
745 GNUNET_YES);
748 "Successfully stored %u bytes under key `%s'\n",
749 size,
750 GNUNET_h2s (key));
751 }
752 transmit_status (client,
754 msg);
756 {
758 _ ("Need %llu bytes more space (%llu allowed, using %llu)\n"),
759 (unsigned long long) size + GNUNET_DATASTORE_ENTRY_OVERHEAD,
760 (unsigned long long) (quota - reserved - cache_size),
761 (unsigned long long) payload);
763 }
764}
765
766
774static int
775check_put (void *cls, const struct DataMessage *dm)
776{
777 if (GNUNET_OK != check_data (dm))
778 {
779 GNUNET_break (0);
780 return GNUNET_SYSERR;
781 }
782 return GNUNET_OK;
783}
784
785
792static void
793handle_put (void *cls, const struct DataMessage *dm)
794{
795 struct GNUNET_SERVICE_Client *client = cls;
796 int rid;
797 struct ReservationList *pos;
798 uint32_t size;
799
801 "Processing PUT request for `%s' of type %u\n",
802 GNUNET_h2s (&dm->key),
803 (uint32_t) ntohl (dm->type));
804 rid = ntohl (dm->rid);
805 size = ntohl (dm->size);
806 if (rid > 0)
807 {
808 pos = reservations;
809 while ((NULL != pos) && (rid != pos->rid))
810 pos = pos->next;
811 GNUNET_break (pos != NULL);
812 if (NULL != pos)
813 {
814 GNUNET_break (pos->entries > 0);
815 GNUNET_break (pos->amount >= size);
816 pos->entries--;
817 pos->amount -= size;
820 gettext_noop ("# reserved"),
821 reserved,
822 GNUNET_NO);
823 }
824 }
825 {
826 bool absent =
828 plugin->api->put (plugin->api->cls,
829 &dm->key,
830 absent,
831 ntohl (dm->size),
832 &dm[1],
833 ntohl (dm->type),
834 ntohl (dm->priority),
835 ntohl (dm->anonymity),
836 ntohl (dm->replication),
839 client);
840 }
842}
843
844
851static void
852handle_get (void *cls, const struct GetMessage *msg)
853{
854 struct GNUNET_SERVICE_Client *client = cls;
855
857 "Processing GET request of type %u\n",
858 (uint32_t) ntohl (msg->type));
860 gettext_noop ("# GET requests received"),
861 1,
862 GNUNET_NO);
864 GNUNET_ntohll (msg->next_uid),
865 msg->random,
866 NULL,
867 ntohl (msg->type),
869 client);
871}
872
873
880static void
881handle_get_key (void *cls, const struct GetKeyMessage *msg)
882{
883 struct GNUNET_SERVICE_Client *client = cls;
884
886 "Processing GET request for `%s' of type %u\n",
887 GNUNET_h2s (&msg->key),
888 (uint32_t) ntohl (msg->type));
890 gettext_noop ("# GET KEY requests received"),
891 1,
892 GNUNET_NO);
894 {
895 /* don't bother database... */
897 "Empty result set for GET request for `%s' (bloomfilter).\n",
898 GNUNET_h2s (&msg->key));
901 "# requests filtered by bloomfilter"),
902 1,
903 GNUNET_NO);
904 transmit_item (client,
905 NULL,
906 0,
907 NULL,
908 0,
909 0,
910 0,
911 0,
913 0);
915 return;
916 }
918 GNUNET_ntohll (msg->next_uid),
919 msg->random,
920 &msg->key,
921 ntohl (msg->type),
923 client);
925}
926
927
934static void
935handle_get_replication (void *cls, const struct GNUNET_MessageHeader *message)
936{
937 struct GNUNET_SERVICE_Client *client = cls;
938
939 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing GET_REPLICATION request\n");
942 "# GET REPLICATION requests received"),
943 1,
944 GNUNET_NO);
947}
948
949
956static void
958{
959 struct GNUNET_SERVICE_Client *client = cls;
961
962 type = ntohl (msg->type);
964 {
965 GNUNET_break (0);
967 return;
968 }
970 "Processing GET_ZERO_ANONYMITY request\n");
973 "# GET ZERO ANONYMITY requests received"),
974 1,
975 GNUNET_NO);
977 GNUNET_ntohll (msg->next_uid),
978 type,
980 client);
982}
983
984
995static void
997 const struct GNUNET_HashCode *key,
998 uint32_t size,
999 int status,
1000 const char *msg)
1001{
1002 struct GNUNET_SERVICE_Client *client = cls;
1003
1004 if (GNUNET_SYSERR == status)
1005 {
1006 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "REMOVE request failed: %s.\n", msg);
1007 transmit_status (client, GNUNET_NO, msg);
1008 return;
1009 }
1010 if (GNUNET_NO == status)
1011 {
1013 "Content not found for REMOVE request.\n");
1014 transmit_status (client, GNUNET_NO, _ ("Content not found"));
1015 return;
1016 }
1018 "Item matches REMOVE request for key `%s'.\n",
1019 GNUNET_h2s (key));
1021 gettext_noop ("# bytes removed (explicit request)"),
1022 size,
1023 GNUNET_YES);
1025 transmit_status (client, GNUNET_OK, NULL);
1026}
1027
1028
1036static int
1037check_remove (void *cls, const struct DataMessage *dm)
1038{
1039 if (GNUNET_OK != check_data (dm))
1040 {
1041 GNUNET_break (0);
1042 return GNUNET_SYSERR;
1043 }
1044 return GNUNET_OK;
1045}
1046
1047
1054static void
1055handle_remove (void *cls, const struct DataMessage *dm)
1056{
1057 struct GNUNET_SERVICE_Client *client = cls;
1058
1060 gettext_noop ("# REMOVE requests received"),
1061 1,
1062 GNUNET_NO);
1064 "Processing REMOVE request for `%s'\n",
1065 GNUNET_h2s (&dm->key));
1067 &dm->key,
1068 ntohl (dm->size),
1069 &dm[1],
1071 client);
1073}
1074
1075
1082static void
1083handle_drop (void *cls,
1084 const struct GNUNET_MessageHeader *message)
1085{
1086 struct GNUNET_SERVICE_Client *client = cls;
1087
1089 "Processing DROP request\n");
1092}
1093
1094
1103static void
1105{
1106 if ((delta < 0) && (payload < -delta))
1107 {
1108 GNUNET_log (
1110 _ (
1111 "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"),
1112 (long long) payload,
1113 (long long) -delta);
1116 _ ("New payload: %lld\n"),
1117 (long long) payload);
1118 sync_stats ();
1119 return;
1120 }
1121 payload += delta;
1122 last_sync++;
1124 sync_stats ();
1125}
1126
1127
1138static int
1140 const char *subsystem,
1141 const char *name,
1142 uint64_t value,
1143 int is_persistent)
1144{
1147 payload += value;
1148 GNUNET_log (
1150 "Notification from statistics about existing payload (%llu), new payload is %llu\n",
1151 (unsigned long long) value,
1152 (unsigned long long) payload);
1153 return GNUNET_OK;
1154}
1155
1156
1160static struct DatastorePlugin *
1162{
1163 struct DatastorePlugin *ret;
1164 char *libname;
1165
1166 ret = GNUNET_new (struct DatastorePlugin);
1167 ret->env.cfg = cfg;
1168 ret->env.duc = &disk_utilization_change_cb;
1169 ret->env.cls = NULL;
1171 _ ("Loading `%s' datastore plugin\n"),
1172 plugin_name);
1173 GNUNET_asprintf (&libname,
1174 "libgnunet_plugin_datastore_%s",
1175 plugin_name);
1176 ret->short_name = GNUNET_strdup (plugin_name);
1177 ret->lib_name = libname;
1179 libname,
1180 &ret->env);
1181 if (NULL == ret->api)
1182 {
1184 _ ("Failed to load datastore plugin for `%s'\n"),
1185 plugin_name);
1186 GNUNET_free (ret->short_name);
1187 GNUNET_free (libname);
1188 GNUNET_free (ret);
1189 return NULL;
1190 }
1191 return ret;
1192}
1193
1194
1201static void
1203{
1205 "Datastore service is unloading plugin...\n");
1206 GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
1207 GNUNET_free (plug->lib_name);
1208 GNUNET_free (plug->short_name);
1209 GNUNET_free (plug);
1210}
1211
1212
1216static void
1218{
1223 NULL);
1224}
1225
1226
1234static void
1236 const struct GNUNET_HashCode *key,
1237 unsigned int count)
1238{
1239 struct GNUNET_CONTAINER_BloomFilter *bf = cls;
1240
1241 if (NULL == key)
1242 {
1244 _ ("Bloomfilter construction complete.\n"));
1245 begin_service ();
1246 return;
1247 }
1248
1249 while (0 < count--)
1251}
1252
1253
1261static void
1262process_stat_done (void *cls, int success)
1263{
1264 stat_get = NULL;
1265 if (NULL != stat_timeout_task)
1266 {
1268 stat_timeout_task = NULL;
1269 }
1270 plugin = load_plugin ();
1271 if (NULL == plugin)
1272 {
1274 filter = NULL;
1275 if (NULL != stats)
1276 {
1278 stats = NULL;
1279 }
1280 return;
1281 }
1282
1283 if (GNUNET_NO == stats_worked)
1284 {
1286 "Failed to obtain value from statistics service, recomputing it\n");
1289 _ ("New payload: %lld\n"),
1290 (long long) payload);
1291 }
1292
1293 if (GNUNET_YES == refresh_bf)
1294 {
1296 _ ("Rebuilding bloomfilter. Please be patient.\n"));
1297 if (NULL != plugin->api->get_keys)
1298 {
1300 return;
1301 }
1302 else
1303 {
1305 _ (
1306 "Plugin does not support get_keys function. Please fix!\n"))
1307 ;
1308 }
1309 }
1310 begin_service ();
1311}
1312
1313
1319static void
1320stat_timeout (void *cls)
1321{
1322 stat_timeout_task = NULL;
1325}
1326
1327
1331static void
1332cleaning_task (void *cls)
1333{
1335 if (NULL != expired_kill_task)
1336 {
1338 expired_kill_task = NULL;
1339 }
1340 if (GNUNET_YES == do_drop)
1341 {
1343 "Dropping database!\n");
1344 plugin->api->drop (plugin->api->cls);
1345 payload = 0;
1346 last_sync++;
1347 }
1348 if (NULL != plugin)
1349 {
1351 plugin = NULL;
1352 }
1353 if (NULL != filter)
1354 {
1356 filter = NULL;
1357 }
1358 if (NULL != stat_get)
1359 {
1361 stat_get = NULL;
1362 }
1363 if (NULL != stat_timeout_task)
1364 {
1366 stat_timeout_task = NULL;
1367 }
1369 plugin_name = NULL;
1370 if (last_sync > 0)
1371 sync_stats ();
1372 if (NULL != stats)
1373 {
1375 stats = NULL;
1376 }
1378 quota_stat_name = NULL;
1379}
1380
1381
1390static void *
1392 struct GNUNET_SERVICE_Client *client,
1393 struct GNUNET_MQ_Handle *mq)
1394{
1395 return client;
1396}
1397
1398
1407static void
1409 struct GNUNET_SERVICE_Client *client,
1410 void *app_ctx)
1411{
1412 struct ReservationList *pos;
1413 struct ReservationList *prev;
1414 struct ReservationList *next;
1415
1416 GNUNET_assert (app_ctx == client);
1417 prev = NULL;
1418 pos = reservations;
1419 while (NULL != pos)
1420 {
1421 next = pos->next;
1422 if (pos->client == client)
1423 {
1424 if (NULL == prev)
1426 else
1427 prev->next = next;
1429 GNUNET_free (pos);
1430 }
1431 else
1432 {
1433 prev = pos;
1434 }
1435 pos = next;
1436 }
1438 gettext_noop ("# reserved"),
1439 reserved,
1440 GNUNET_NO);
1441}
1442
1443
1451static void
1452run (void *cls,
1453 const struct GNUNET_CONFIGURATION_Handle *c,
1454 struct GNUNET_SERVICE_Handle *serv)
1455{
1456 char *fn;
1457 char *pfn;
1458 unsigned int bf_size;
1459
1460 service = serv;
1461 cfg = c;
1463 "DATASTORE",
1464 "DATABASE",
1465 &plugin_name))
1466 {
1468 "DATABASE",
1469 "DATASTORE");
1470 return;
1471 }
1473 _ ("# bytes used in file-sharing datastore `%s'"),
1474 plugin_name);
1475 if (GNUNET_OK !=
1476 GNUNET_CONFIGURATION_get_value_size (cfg, "DATASTORE", "QUOTA", &quota))
1477 {
1478 GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "QUOTA", "DATASTORE");
1479 return;
1480 }
1481 stats = GNUNET_STATISTICS_create ("datastore", cfg);
1483 cache_size = quota / 8; /* Or should we make this an option? */
1485 gettext_noop ("# cache size"),
1486 cache_size,
1487 GNUNET_NO);
1488 if (quota / (32 * 1024LL) > MAX_BF_SIZE)
1489 bf_size = MAX_BF_SIZE;
1490 else
1491 bf_size =
1492 quota / (32 * 1024LL); /* 8 bit per entry, 1 bit per 32 kb in DB */
1493 fn = NULL;
1495 "DATASTORE",
1496 "BLOOMFILTER",
1497 &fn)) ||
1499 {
1501 _ ("Could not use specified filename `%s' for bloomfilter.\n"),
1502 NULL != fn ? fn : "");
1503 GNUNET_free (fn);
1504 fn = NULL;
1505 }
1506 if (NULL != fn)
1507 {
1508 GNUNET_asprintf (&pfn, "%s.%s", fn, plugin_name);
1509 if (GNUNET_YES == GNUNET_DISK_file_test (pfn))
1510 {
1511 filter =
1513 bf_size,
1514 5); /* approx. 3% false positives at max use */
1515 if (NULL == filter)
1516 {
1517 /* file exists but not valid, remove and try again, but refresh */
1518 if (0 != unlink (pfn))
1519 {
1520 /* failed to remove, run without file */
1522 _ ("Failed to remove bogus bloomfilter file `%s'\n"),
1523 pfn);
1524 GNUNET_free (pfn);
1525 pfn = NULL;
1527 NULL,
1528 bf_size,
1529 5); /* approx. 3% false positives at max use */
1531 }
1532 else
1533 {
1534 /* try again after remove */
1536 pfn,
1537 bf_size,
1538 5); /* approx. 3% false positives at max use */
1540 if (NULL == filter)
1541 {
1542 /* failed yet again, give up on using file */
1544 _ ("Failed to remove bogus bloomfilter file `%s'\n"),
1545 pfn);
1546 GNUNET_free (pfn);
1547 pfn = NULL;
1549 NULL,
1550 bf_size,
1551 5); /* approx. 3% false positives at max use */
1552 }
1553 }
1554 }
1555 else
1556 {
1557 /* normal case: have an existing valid bf file, no need to refresh */
1559 }
1560 }
1561 else
1562 {
1563 filter =
1565 bf_size,
1566 5); /* approx. 3% false positives at max use */
1568 }
1569 GNUNET_free (pfn);
1570 }
1571 else
1572 {
1573 filter =
1575 bf_size,
1576 5); /* approx. 3% false positives at max use */
1578 }
1579 GNUNET_free (fn);
1580 if (NULL == filter)
1581 {
1583 _ ("Failed to initialize bloomfilter.\n"));
1584 if (NULL != stats)
1585 {
1587 stats = NULL;
1588 }
1589 return;
1590 }
1593 "datastore",
1597 NULL);
1598 if (NULL == stat_get)
1600 else
1602 &stat_timeout,
1603 NULL);
1605}
1606
1607
1613 "datastore",
1615 &run,
1618 NULL,
1619 GNUNET_MQ_hd_fixed_size (reserve,
1621 struct ReserveMessage,
1622 NULL),
1623 GNUNET_MQ_hd_fixed_size (release_reserve,
1625 struct ReleaseReserveMessage,
1626 NULL),
1629 struct DataMessage,
1630 NULL),
1633 struct GetMessage,
1634 NULL),
1635 GNUNET_MQ_hd_fixed_size (get_key,
1637 struct GetKeyMessage,
1638 NULL),
1639 GNUNET_MQ_hd_fixed_size (get_replication,
1641 struct GNUNET_MessageHeader,
1642 NULL),
1643 GNUNET_MQ_hd_fixed_size (get_zero_anonymity,
1646 NULL),
1647 GNUNET_MQ_hd_var_size (remove,
1649 struct DataMessage,
1650 NULL),
1653 struct GNUNET_MessageHeader,
1654 NULL),
1656
1657
1658/* end of gnunet-service-datastore.c */
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
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.
GNUNET_SERVICE_MAIN(GNUNET_OS_project_data_gnunet(), "datastore", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_fixed_size(reserve, GNUNET_MESSAGE_TYPE_DATASTORE_RESERVE, struct ReserveMessage, NULL), GNUNET_MQ_hd_fixed_size(release_reserve, GNUNET_MESSAGE_TYPE_DATASTORE_RELEASE_RESERVE, struct ReleaseReserveMessage, NULL), GNUNET_MQ_hd_var_size(put, GNUNET_MESSAGE_TYPE_DATASTORE_PUT, struct DataMessage, NULL), GNUNET_MQ_hd_fixed_size(get, GNUNET_MESSAGE_TYPE_DATASTORE_GET, struct GetMessage, NULL), GNUNET_MQ_hd_fixed_size(get_key, GNUNET_MESSAGE_TYPE_DATASTORE_GET_KEY, struct GetKeyMessage, NULL), GNUNET_MQ_hd_fixed_size(get_replication, GNUNET_MESSAGE_TYPE_DATASTORE_GET_REPLICATION, struct GNUNET_MessageHeader, NULL), GNUNET_MQ_hd_fixed_size(get_zero_anonymity, GNUNET_MESSAGE_TYPE_DATASTORE_GET_ZERO_ANONYMITY, struct GetZeroAnonymityMessage, NULL), GNUNET_MQ_hd_var_size(remove, GNUNET_MESSAGE_TYPE_DATASTORE_REMOVE, struct DataMessage, NULL), GNUNET_MQ_hd_fixed_size(drop, GNUNET_MESSAGE_TYPE_DATASTORE_DROP, struct GNUNET_MessageHeader, NULL), GNUNET_MQ_handler_end())
Define "main" method using service macro.
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:520
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_create_for_file(const char *filename)
Create the directory structure for storing a file.
Definition: disk.c:620
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.
Definition: common_endian.c:54
uint64_t GNUNET_htonll(uint64_t n)
Convert unsigned 64-bit integer to network byte order.
Definition: common_endian.c:37
#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.
Definition: gnunet_mq_lib.h:61
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:76
#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:1339
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:980
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:1277
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:1207
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:1231
void GNUNET_SERVICE_suspend(struct GNUNET_SERVICE_Handle *sh)
Suspend accepting connections from the listen socket temporarily.
Definition: service.c:2336
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2418
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2500
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2389
void GNUNET_SERVICE_resume(struct GNUNET_SERVICE_Handle *sh)
Resume accepting connections from the listen socket.
Definition: service.c:2344
@ 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:579
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:741
#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:640
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition: strings.c:640
#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_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:136
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