GNUnet  0.16.x
Data Structures | Macros | Functions | Variables
gnunet-service-datastore.c File Reference

Management for the datastore for files stored on a GNUnet node. More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_protocols.h"
#include "gnunet_statistics_service.h"
#include "gnunet_datastore_plugin.h"
#include "datastore.h"
Include dependency graph for gnunet-service-datastore.c:

Go to the source code of this file.

Data Structures

struct  DatastorePlugin
 Our datastore plugin. More...
 
struct  ReservationList
 Linked list of active reservations. More...
 

Macros

#define MAX_PENDING   1024
 How many messages do we queue at most per client? More...
 
#define MAX_BF_SIZE   ((uint32_t) (1LL << 31))
 Limit size of bloom filter to 2 GB. More...
 
#define MAX_EXPIRE_DELAY    GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)
 How long are we at most keeping "expired" content past the expiration date in the database? More...
 
#define MIN_EXPIRE_DELAY    GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)
 How fast are we allowed to query the database for deleting expired content? (1 item per second). More...
 
#define MAX_STAT_SYNC_LAG   50
 After how many payload-changing operations do we sync our statistics? More...
 

Functions

static void sync_stats ()
 Synchronize our utilization statistics with the statistics service. More...
 
static void delete_expired (void *cls)
 Task that is used to remove expired entries from the datastore. More...
 
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. More...
 
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 to our quota. More...
 
static void manage_space (unsigned long long need)
 Manage available disk space by running tasks that will discard content if necessary. More...
 
static void transmit_status (struct GNUNET_SERVICE_Client *client, int code, const char *msg)
 Transmit a status code to the client. More...
 
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. More...
 
static void handle_reserve (void *cls, const struct ReserveMessage *msg)
 Handle RESERVE-message. More...
 
static void handle_release_reserve (void *cls, const struct ReleaseReserveMessage *msg)
 Handle RELEASE_RESERVE-message. More...
 
static int check_data (const struct DataMessage *dm)
 Check that the given message is a valid data message. More...
 
static void put_continuation (void *cls, const struct GNUNET_HashCode *key, uint32_t size, int status, const char *msg)
 Put continuation. More...
 
static int check_put (void *cls, const struct DataMessage *dm)
 Verify PUT-message. More...
 
static void handle_put (void *cls, const struct DataMessage *dm)
 Handle PUT-message. More...
 
static void handle_get (void *cls, const struct GetMessage *msg)
 Handle GNUNET_MESSAGE_TYPE_DATASTORE_GET-message. More...
 
static void handle_get_key (void *cls, const struct GetKeyMessage *msg)
 Handle GNUNET_MESSAGE_TYPE_DATASTORE_GET_KEY-message. More...
 
static void handle_get_replication (void *cls, const struct GNUNET_MessageHeader *message)
 Handle GET_REPLICATION-message. More...
 
static void handle_get_zero_anonymity (void *cls, const struct GetZeroAnonymityMessage *msg)
 Handle GET_ZERO_ANONYMITY-message. More...
 
static void remove_continuation (void *cls, const struct GNUNET_HashCode *key, uint32_t size, int status, const char *msg)
 Remove continuation. More...
 
static int check_remove (void *cls, const struct DataMessage *dm)
 Verify REMOVE-message. More...
 
static void handle_remove (void *cls, const struct DataMessage *dm)
 Handle REMOVE-message. More...
 
static void handle_drop (void *cls, const struct GNUNET_MessageHeader *message)
 Handle DROP-message. More...
 
static void disk_utilization_change_cb (void *cls, int delta)
 Function called by plugins to notify us about a change in their disk utilization. More...
 
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. More...
 
static struct DatastorePluginload_plugin ()
 Load the datastore plugin. More...
 
static void unload_plugin (struct DatastorePlugin *plug)
 Function called when the service shuts down. More...
 
static void begin_service ()
 Initialization complete, start operating the service. More...
 
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. More...
 
static void process_stat_done (void *cls, int success)
 We finished receiving the statistic. More...
 
static void stat_timeout (void *cls)
 Fetching stats took to long, run without. More...
 
static void cleaning_task (void *cls)
 Task run during shutdown. More...
 
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. More...
 
static void client_disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *client, void *app_ctx)
 Called whenever a client is disconnected. More...
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *serv)
 Process datastore requests. More...
 
 GNUNET_SERVICE_MAIN ("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. More...
 

Variables

static char * quota_stat_name
 Name under which we store current space consumption. More...
 
static struct GNUNET_SCHEDULER_Taskstat_timeout_task
 Task to timeout stat GET. More...
 
static struct DatastorePluginplugin
 Our datastore plugin (NULL if not available). More...
 
static struct ReservationListreservations
 Linked list of space reservations made by clients. More...
 
static struct GNUNET_CONTAINER_BloomFilterfilter
 Bloomfilter to quickly tell if we don't have the content. More...
 
static char * plugin_name
 Name of our plugin. More...
 
static const struct GNUNET_CONFIGURATION_Handlecfg
 Our configuration. More...
 
static struct GNUNET_STATISTICS_Handlestats
 Handle for reporting statistics. More...
 
static unsigned long long cache_size
 How much space are we using for the cache? (space available for insertions that will be instantly reclaimed by discarding less important content — or possibly whatever we just inserted into the "cache"). More...
 
static unsigned long long reserved
 How much space have we currently reserved? More...
 
static unsigned long long payload
 How much data are we currently storing in the database? More...
 
static struct GNUNET_SCHEDULER_Taskexpired_kill_task
 Identity of the task that is used to delete expired content. More...
 
static struct GNUNET_TIME_Absolute min_expiration
 Minimum time that content should have to not be discarded instantly (time stamp of any content that we've been discarding recently to stay below the quota). More...
 
static unsigned long long quota
 How much space are we allowed to use? More...
 
static int do_drop
 Should the database be dropped on exit? More...
 
static int refresh_bf
 Should we refresh the BF when the DB is loaded? More...
 
static unsigned int last_sync
 Number of updates that were made to the payload value since we last synchronized it with the statistics service. More...
 
static int stats_worked
 Did we get an answer from statistics? More...
 
static int cleaning_done
 Have we already cleaned up the TCCs and are hence no longer willing (or able) to transmit anything to anyone? More...
 
static struct GNUNET_STATISTICS_GetHandlestat_get
 Handle for pending get request. More...
 
static struct GNUNET_SERVICE_Handleservice
 Handle to our server. More...
 

Detailed Description

Management for the datastore for files stored on a GNUnet node.

Author
Christian Grothoff

Definition in file gnunet-service-datastore.c.

Macro Definition Documentation

◆ MAX_PENDING

#define MAX_PENDING   1024

How many messages do we queue at most per client?

Definition at line 37 of file gnunet-service-datastore.c.

◆ MAX_BF_SIZE

#define MAX_BF_SIZE   ((uint32_t) (1LL << 31))

Limit size of bloom filter to 2 GB.

Definition at line 42 of file gnunet-service-datastore.c.

◆ MAX_EXPIRE_DELAY

#define MAX_EXPIRE_DELAY    GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MINUTES, 15)

How long are we at most keeping "expired" content past the expiration date in the database?

Definition at line 48 of file gnunet-service-datastore.c.

◆ MIN_EXPIRE_DELAY

#define MIN_EXPIRE_DELAY    GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 1)

How fast are we allowed to query the database for deleting expired content? (1 item per second).

Definition at line 55 of file gnunet-service-datastore.c.

◆ MAX_STAT_SYNC_LAG

#define MAX_STAT_SYNC_LAG   50

After how many payload-changing operations do we sync our statistics?

Definition at line 72 of file gnunet-service-datastore.c.

Function Documentation

◆ sync_stats()

static void sync_stats ( )
static

Synchronize our utilization statistics with the statistics service.

Definition at line 232 of file gnunet-service-datastore.c.

233 {
236  "# utilization by current datastore",
237  payload,
238  GNUNET_NO);
239  last_sync = 0;
240 }
static struct GNUNET_STATISTICS_Handle * stats
Handle for reporting statistics.
static unsigned long long payload
How much data are we currently storing in the database?
static char * quota_stat_name
Name under which we store current space consumption.
static unsigned int last_sync
Number of updates that were made to the payload value since we last synchronized it with the statisti...
@ GNUNET_YES
Definition: gnunet_common.h:97
@ GNUNET_NO
Definition: gnunet_common.h:94
void GNUNET_STATISTICS_set(struct GNUNET_STATISTICS_Handle *handle, const char *name, uint64_t value, int make_persistent)
Set statistic value for the peer.

References GNUNET_NO, GNUNET_STATISTICS_set(), GNUNET_YES, last_sync, payload, quota_stat_name, and stats.

Referenced by cleaning_task(), and disk_utilization_change_cb().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ delete_expired()

static void delete_expired ( void *  cls)
static

Task that is used to remove expired entries from the datastore.

This task will schedule itself again automatically to always delete all expired content quickly.

Parameters
clsnot used

Definition at line 357 of file gnunet-service-datastore.c.

358 {
359  expired_kill_task = NULL;
361 }
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 struct DatastorePlugin * plugin
Our datastore plugin (NULL if not available).
static struct GNUNET_SCHEDULER_Task * expired_kill_task
Identity of the task that is used to delete expired content.
struct GNUNET_DATASTORE_PluginFunctions * api
API of the transport as returned by the plugin's initialization function.
PluginGetRandom get_expiration
Function to get a random expired item or, if none are expired, either the oldest entry or one with a ...
void * cls
Closure to use for all of the following callbacks (except "next_request").

References DatastorePlugin::api, GNUNET_DATASTORE_PluginFunctions::cls, expired_kill_task, expired_processor(), GNUNET_DATASTORE_PluginFunctions::get_expiration, and plugin.

Referenced by begin_service(), and expired_processor().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ expired_processor()

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 
)
static

Iterate over the expired items stored in the datastore.

Delete all expired items; once we have processed all expired items, re-schedule the "delete_expired" task.

Parameters
clsnot used
keykey for the content
sizenumber of bytes in data
datacontent stored
typetype of the content
prioritypriority of the content
anonymityanonymity-level for the content
replicationreplication-level for the content
expirationexpiration time for the content
uidunique identifier for the datum; maybe 0 if no unique identifier is available
Returns
GNUNET_SYSERR to abort the iteration, GNUNET_OK to continue (continue on call to "next", of course), GNUNET_NO to delete the item and continue (if supported)

Definition at line 293 of file gnunet-service-datastore.c.

303 {
304  struct GNUNET_TIME_Absolute now;
305 
306  if (NULL == key)
307  {
312  NULL);
313  return GNUNET_SYSERR;
314  }
315  now = GNUNET_TIME_absolute_get ();
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 }
#define gettext_noop(String)
Definition: gettext.h:69
static char * expiration
Credential TTL.
Definition: gnunet-abd.c:96
struct GNUNET_HashCode key
The key used in the DHT.
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...
#define MIN_EXPIRE_DELAY
How fast are we allowed to query the database for deleting expired content? (1 item per second).
#define MAX_EXPIRE_DELAY
How long are we at most keeping "expired" content past the expiration date in the database?
#define GNUNET_log(kind,...)
@ GNUNET_SCHEDULER_PRIORITY_IDLE
Run when otherwise idle.
@ GNUNET_SYSERR
Definition: gnunet_common.h:93
void GNUNET_CONTAINER_bloomfilter_remove(struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Remove an element from the filter.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
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:1184
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:110
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:570
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:420
static unsigned int size
Size of the "table".
Definition: peer.c:67
Time for absolute times used by GNUnet, in microseconds.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model

References GNUNET_TIME_Absolute::abs_value_us, delete_expired(), expiration, expired_kill_task, filter, gettext_noop, GNUNET_CONTAINER_bloomfilter_remove(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_NO, GNUNET_SCHEDULER_add_delayed_with_priority(), GNUNET_SCHEDULER_PRIORITY_IDLE, GNUNET_STATISTICS_update(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_SYSERR, GNUNET_TIME_absolute_get(), GNUNET_TIME_absolute_get_difference(), GNUNET_YES, key, MAX_EXPIRE_DELAY, min_expiration, MIN_EXPIRE_DELAY, size, stats, and type.

Referenced by delete_expired().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ quota_processor()

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 
)
static

An iterator over a set of items stored in the datastore that deletes until we're happy with respect to our quota.

Parameters
clsclosure
keykey for the content
sizenumber of bytes in data
datacontent stored
typetype of the content
prioritypriority of the content
anonymityanonymity-level for the content
replicationreplication-level for the content
expirationexpiration time for the content
uidunique identifier for the datum; maybe 0 if no unique identifier is available
Returns
GNUNET_SYSERR to abort the iteration, GNUNET_OK to continue (continue on call to "next", of course), GNUNET_NO to delete the item and continue (if supported)

Definition at line 384 of file gnunet-service-datastore.c.

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 }
#define GNUNET_DATASTORE_ENTRY_OVERHEAD
How many bytes of overhead will we assume per entry in any DB (for reservations)?
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:404
#define GNUNET_TIME_UNIT_FOREVER_ABS
Constant used to specify "forever".

References expiration, filter, gettext_noop, GNUNET_CONTAINER_bloomfilter_remove(), GNUNET_DATASTORE_ENTRY_OVERHEAD, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_NO, GNUNET_STATISTICS_update(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_SYSERR, GNUNET_TIME_absolute_get_remaining(), GNUNET_TIME_UNIT_FOREVER_ABS, GNUNET_YES, key, min_expiration, size, stats, and type.

Referenced by manage_space().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ manage_space()

static void manage_space ( unsigned long long  need)
static

Manage available disk space by running tasks that will discard content if necessary.

This function will be run whenever a request for "need" bytes of storage could only be satisfied by eating into the "cache" (and we want our cache space back).

Parameters
neednumber of bytes of content that were placed into the "cache" (and hence the number of bytes that should be removed).

Definition at line 440 of file gnunet-service-datastore.c.

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 }
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...

References DatastorePlugin::api, GNUNET_DATASTORE_PluginFunctions::cls, GNUNET_DATASTORE_PluginFunctions::get_expiration, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, plugin, and quota_processor().

Referenced by put_continuation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ transmit_status()

static void transmit_status ( struct GNUNET_SERVICE_Client client,
int  code,
const char *  msg 
)
static

Transmit a status code to the client.

Parameters
clientreceiver of the response
codestatus code
msgoptional error message (can be NULL)

Definition at line 464 of file gnunet-service-datastore.c.

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 }
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
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:302
#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:52
#define GNUNET_MESSAGE_TYPE_DATASTORE_STATUS
Message sent by datastore to client informing about status processing a request (in response to RESER...
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2442
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition: time.c:637
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

References env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_DATASTORE_STATUS, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_SERVICE_client_get_mq(), GNUNET_TIME_absolute_hton(), StatusMessage::min_expiration, min_expiration, msg, and StatusMessage::status.

Referenced by handle_release_reserve(), handle_reserve(), put_continuation(), and remove_continuation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ transmit_item()

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 
)
static

Function that will transmit the given datastore entry to the client.

Parameters
clsclosure, pointer to the client (of type struct GNUNET_SERVICE_Client).
keykey for the content
sizenumber of bytes in data
datacontent stored
typetype of the content
prioritypriority of the content
anonymityanonymity-level for the content
replicationreplication-level for the content
expirationexpiration time for the content
uidunique identifier for the datum; maybe 0 if no unique identifier is available
Returns
GNUNET_SYSERR to abort the iteration, GNUNET_OK to continue, GNUNET_NO to delete the item and continue (if supported)

Definition at line 505 of file gnunet-service-datastore.c.

515 {
516  struct GNUNET_SERVICE_Client *client = cls;
517  struct GNUNET_MQ_Envelope *env;
518  struct GNUNET_MessageHeader *end;
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 }
static int end
Set if we are to shutdown all services (including ARM).
Definition: gnunet-arm.c:34
static unsigned int replication
static unsigned int anonymity
uint32_t data
The data value.
uint64_t GNUNET_htonll(uint64_t n)
Convert unsigned 64-bit integer to network byte order.
Definition: common_endian.c:36
@ GNUNET_OK
Definition: gnunet_common.h:95
#define GNUNET_MAX_MESSAGE_SIZE
Largest supported message (to be precise, one byte more than the largest possible message,...
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
#define GNUNET_MESSAGE_TYPE_DATASTORE_DATA_END
Message sent by datastore to client signaling end of matching data.
#define GNUNET_MESSAGE_TYPE_DATASTORE_DATA
Message sent by datastore to client providing requested data (in response to GET or GET_RANDOM reques...
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition: strings.c:617
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
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
Header for all communications.
Handle to a client that is connected to a service.
Definition: service.c:251

References DataMessage::anonymity, anonymity, data, end, env, expiration, DataMessage::expiration, gettext_noop, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_htonll(), GNUNET_log, GNUNET_MAX_MESSAGE_SIZE, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_DATASTORE_DATA, GNUNET_MESSAGE_TYPE_DATASTORE_DATA_END, GNUNET_MQ_msg, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_NO, GNUNET_OK, GNUNET_SERVICE_client_get_mq(), GNUNET_STATISTICS_update(), GNUNET_STRINGS_absolute_time_to_string(), GNUNET_STRINGS_relative_time_to_string(), GNUNET_TIME_absolute_get_remaining(), GNUNET_TIME_absolute_hton(), GNUNET_YES, DataMessage::key, key, DataMessage::priority, replication, DataMessage::replication, DataMessage::rid, DataMessage::size, size, stats, DataMessage::type, type, and DataMessage::uid.

Referenced by handle_get(), handle_get_key(), handle_get_replication(), and handle_get_zero_anonymity().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_reserve()

static void handle_reserve ( void *  cls,
const struct ReserveMessage msg 
)
static

Handle RESERVE-message.

Parameters
clsidentification of the client
messagethe actual message

Static counter to produce reservation identifiers.

Definition at line 566 of file gnunet-service-datastore.c.

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,
611  gettext_noop (
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 }
static struct Experiment * e
static void transmit_status(struct GNUNET_SERVICE_Client *client, int code, const char *msg)
Transmit a status code to the client.
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 long long reserved
How much space have we currently reserved?
static unsigned long long cache_size
How much space are we using for the cache? (space available for insertions that will be instantly rec...
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
Definition: common_endian.c:53
@ GNUNET_ERROR_TYPE_WARNING
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2248
#define _(String)
GNU gettext support macro.
Definition: platform.h:177
Linked list of active reservations.
uint64_t amount
Number of bytes (still) reserved.
struct GNUNET_SERVICE_Client * client
Client that made the reservation.
struct ListEntry * entries
List of peers in the list.

References _, ReservationList::amount, cache_size, ReservationList::client, e, entries, gettext_noop, GNUNET_DATASTORE_ENTRY_OVERHEAD, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_log, GNUNET_new, GNUNET_NO, GNUNET_ntohll(), GNUNET_SERVICE_client_continue(), GNUNET_STATISTICS_set(), msg, payload, quota, reservations, reserved, stats, and transmit_status().

Here is the call graph for this function:

◆ handle_release_reserve()

static void handle_release_reserve ( void *  cls,
const struct ReleaseReserveMessage msg 
)
static

Handle RELEASE_RESERVE-message.

Parameters
clsidentification of the client
messagethe actual message

Definition at line 650 of file gnunet-service-datastore.c.

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");
660  next = reservations;
661  prev = NULL;
662  while (NULL != (pos = next))
663  {
664  next = pos->next;
665  if (rid == pos->rid)
666  {
667  if (prev == NULL)
668  reservations = next;
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 }
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_free(ptr)
Wrapper around free.
int32_t rid
Reservation identifier.
uint64_t entries
Number of items (still) reserved.
struct ReservationList * next
This is a linked list.

References ReservationList::amount, ReservationList::client, ReservationList::entries, gettext_noop, GNUNET_assert, GNUNET_break, GNUNET_DATASTORE_ENTRY_OVERHEAD, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_STATISTICS_set(), GNUNET_SYSERR, msg, ReservationList::next, reservations, reserved, ReservationList::rid, stats, and transmit_status().

Here is the call graph for this function:

◆ check_data()

static int check_data ( const struct DataMessage dm)
static

Check that the given message is a valid data message.

Parameters
dmmessage to check
Returns
GNUNET_SYSERR is not well-formed, otherwise GNUNET_OK

Definition at line 705 of file gnunet-service-datastore.c.

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 }
struct GNUNET_MessageHeader header
Type is either GNUNET_MESSAGE_TYPE_DATASTORE_PUT, GNUNET_MESSAGE_TYPE_DATASTORE_REMOVE or GNUNET_MESS...
Definition: datastore.h:199
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, DataMessage::header, DataMessage::size, GNUNET_MessageHeader::size, and size.

Referenced by check_put(), and check_remove().

Here is the caller graph for this function:

◆ put_continuation()

static void put_continuation ( void *  cls,
const struct GNUNET_HashCode key,
uint32_t  size,
int  status,
const char *  msg 
)
static

Put continuation.

Parameters
clsclosure
keykey for the item stored
sizesize of the item stored
statusGNUNET_OK if inserted, GNUNET_NO if updated, or #GNUNET_SYSERROR if error
msgerror message on error

Definition at line 732 of file gnunet-service-datastore.c.

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);
755  if (quota - reserved - cache_size < payload)
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 }
uint16_t status
See PRISM_STATUS_*-constants.
static void manage_space(unsigned long long need)
Manage available disk space by running tasks that will discard content if necessary.
void GNUNET_CONTAINER_bloomfilter_add(struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Add an element to the filter.
@ GNUNET_ERROR_TYPE_INFO

References _, cache_size, filter, gettext_noop, GNUNET_CONTAINER_bloomfilter_add(), GNUNET_DATASTORE_ENTRY_OVERHEAD, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_h2s(), GNUNET_log, GNUNET_OK, GNUNET_STATISTICS_update(), GNUNET_SYSERR, GNUNET_YES, key, manage_space(), msg, payload, quota, reserved, size, stats, status, and transmit_status().

Referenced by handle_put().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_put()

static int check_put ( void *  cls,
const struct DataMessage dm 
)
static

Verify PUT-message.

Parameters
clsidentification of the client
messagethe actual message
Returns
GNUNET_OK if dm is well-formed

Definition at line 775 of file gnunet-service-datastore.c.

776 {
777  if (GNUNET_OK != check_data (dm))
778  {
779  GNUNET_break (0);
780  return GNUNET_SYSERR;
781  }
782  return GNUNET_OK;
783 }
static int check_data(const struct DataMessage *dm)
Check that the given message is a valid data message.

References check_data(), GNUNET_break, GNUNET_OK, and GNUNET_SYSERR.

Here is the call graph for this function:

◆ handle_put()

static void handle_put ( void *  cls,
const struct DataMessage dm 
)
static

Handle PUT-message.

Parameters
clsidentification of the client
messagethe actual message

Definition at line 793 of file gnunet-service-datastore.c.

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  bool absent =
827  plugin->api->put (plugin->api->cls,
828  &dm->key,
829  absent,
830  ntohl (dm->size),
831  &dm[1],
832  ntohl (dm->type),
833  ntohl (dm->priority),
834  ntohl (dm->anonymity),
835  ntohl (dm->replication),
838  client);
840 }
static void put_continuation(void *cls, const struct GNUNET_HashCode *key, uint32_t size, int status, const char *msg)
Put continuation.
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_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:736
PluginPut put
Function to store an item in the datastore.

References ReservationList::amount, DataMessage::anonymity, DatastorePlugin::api, ReservationList::client, GNUNET_DATASTORE_PluginFunctions::cls, ReservationList::entries, DataMessage::expiration, filter, gettext_noop, GNUNET_break, GNUNET_CONTAINER_bloomfilter_test(), GNUNET_DATASTORE_ENTRY_OVERHEAD, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_NO, GNUNET_SERVICE_client_continue(), GNUNET_STATISTICS_set(), GNUNET_TIME_absolute_ntoh(), DataMessage::key, ReservationList::next, plugin, DataMessage::priority, GNUNET_DATASTORE_PluginFunctions::put, put_continuation(), DataMessage::replication, reservations, reserved, DataMessage::rid, ReservationList::rid, DataMessage::size, size, stats, and DataMessage::type.

Here is the call graph for this function:

◆ handle_get()

static void handle_get ( void *  cls,
const struct GetMessage msg 
)
static

Handle GNUNET_MESSAGE_TYPE_DATASTORE_GET-message.

Parameters
clsidentification of the client
msgthe actual message

Definition at line 850 of file gnunet-service-datastore.c.

851 {
852  struct GNUNET_SERVICE_Client *client = cls;
853 
855  "Processing GET request of type %u\n",
856  (uint32_t) ntohl (msg->type));
858  gettext_noop ("# GET requests received"),
859  1,
860  GNUNET_NO);
862  GNUNET_ntohll (msg->next_uid),
863  msg->random,
864  NULL,
865  ntohl (msg->type),
866  &transmit_item,
867  client);
869 }
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.
PluginGetKey get_key
Get a particular datum matching a given hash from the datastore.
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.

References DatastorePlugin::api, GNUNET_DATASTORE_PluginFunctions::cls, GNUNET_DATASTORE_PluginFunctions::get_key, gettext_noop, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NO, GNUNET_ntohll(), GNUNET_SERVICE_client_continue(), GNUNET_STATISTICS_update(), msg, plugin, stats, transmit_item(), and GNUNET_MessageHeader::type.

Here is the call graph for this function:

◆ handle_get_key()

static void handle_get_key ( void *  cls,
const struct GetKeyMessage msg 
)
static

Handle GNUNET_MESSAGE_TYPE_DATASTORE_GET_KEY-message.

Parameters
clsclosure
msgthe actual message

Definition at line 879 of file gnunet-service-datastore.c.

880 {
881  struct GNUNET_SERVICE_Client *client = cls;
882 
884  "Processing GET request for `%s' of type %u\n",
885  GNUNET_h2s (&msg->key),
886  (uint32_t) ntohl (msg->type));
888  gettext_noop ("# GET KEY requests received"),
889  1,
890  GNUNET_NO);
892  {
893  /* don't bother database... */
895  "Empty result set for GET request for `%s' (bloomfilter).\n",
896  GNUNET_h2s (&msg->key));
898  gettext_noop (
899  "# requests filtered by bloomfilter"),
900  1,
901  GNUNET_NO);
902  transmit_item (client,
903  NULL,
904  0,
905  NULL,
906  0,
907  0,
908  0,
909  0,
911  0);
913  return;
914  }
916  GNUNET_ntohll (msg->next_uid),
917  msg->random,
918  &msg->key,
919  ntohl (msg->type),
920  &transmit_item,
921  client);
923 }
#define GNUNET_TIME_UNIT_ZERO_ABS
Absolute time zero.

References DatastorePlugin::api, GNUNET_DATASTORE_PluginFunctions::cls, filter, GNUNET_DATASTORE_PluginFunctions::get_key, gettext_noop, GNUNET_CONTAINER_bloomfilter_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_NO, GNUNET_ntohll(), GNUNET_SERVICE_client_continue(), GNUNET_STATISTICS_update(), GNUNET_TIME_UNIT_ZERO_ABS, GNUNET_YES, msg, plugin, stats, transmit_item(), and GNUNET_MessageHeader::type.

Here is the call graph for this function:

◆ handle_get_replication()

static void handle_get_replication ( void *  cls,
const struct GNUNET_MessageHeader message 
)
static

Handle GET_REPLICATION-message.

Parameters
clsidentification of the client
messagethe actual message

Definition at line 933 of file gnunet-service-datastore.c.

934 {
935  struct GNUNET_SERVICE_Client *client = cls;
936 
937  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing GET_REPLICATION request\n");
939  gettext_noop (
940  "# GET REPLICATION requests received"),
941  1,
942  GNUNET_NO);
945 }
PluginGetRandom get_replication
Function to get a random item with high replication score from the database, lowering the item's repl...

References DatastorePlugin::api, GNUNET_DATASTORE_PluginFunctions::cls, GNUNET_DATASTORE_PluginFunctions::get_replication, gettext_noop, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NO, GNUNET_SERVICE_client_continue(), GNUNET_STATISTICS_update(), plugin, stats, and transmit_item().

Here is the call graph for this function:

◆ handle_get_zero_anonymity()

static void handle_get_zero_anonymity ( void *  cls,
const struct GetZeroAnonymityMessage msg 
)
static

Handle GET_ZERO_ANONYMITY-message.

Parameters
clsclient identification of the client
messagethe actual message

Definition at line 955 of file gnunet-service-datastore.c.

956 {
957  struct GNUNET_SERVICE_Client *client = cls;
958  enum GNUNET_BLOCK_Type type;
959 
960  type = (enum GNUNET_BLOCK_Type) ntohl (msg->type);
962  {
963  GNUNET_break (0);
965  return;
966  }
968  "Processing GET_ZERO_ANONYMITY request\n");
970  gettext_noop (
971  "# GET ZERO ANONYMITY requests received"),
972  1,
973  GNUNET_NO);
975  GNUNET_ntohll (msg->next_uid),
976  type,
977  &transmit_item,
978  client);
980 }
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.
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2329
PluginGetType get_zero_anonymity
Get datum (of the specified type) with anonymity level zero.

References DatastorePlugin::api, GNUNET_DATASTORE_PluginFunctions::cls, GNUNET_DATASTORE_PluginFunctions::get_zero_anonymity, gettext_noop, GNUNET_BLOCK_TYPE_ANY, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NO, GNUNET_ntohll(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_STATISTICS_update(), msg, plugin, stats, transmit_item(), GNUNET_MessageHeader::type, and type.

Here is the call graph for this function:

◆ remove_continuation()

static void remove_continuation ( void *  cls,
const struct GNUNET_HashCode key,
uint32_t  size,
int  status,
const char *  msg 
)
static

Remove continuation.

Parameters
clsclosure
keykey for the content
sizenumber of bytes in data
statusGNUNET_OK if removed, GNUNET_NO if not found, or #GNUNET_SYSERROR if error
msgerror message on error

Definition at line 994 of file gnunet-service-datastore.c.

999 {
1000  struct GNUNET_SERVICE_Client *client = cls;
1001 
1002  if (GNUNET_SYSERR == status)
1003  {
1004  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "REMOVE request failed: %s.\n", msg);
1005  transmit_status (client, GNUNET_NO, msg);
1006  return;
1007  }
1008  if (GNUNET_NO == status)
1009  {
1011  "Content not found for REMOVE request.\n");
1012  transmit_status (client, GNUNET_NO, _ ("Content not found"));
1013  return;
1014  }
1016  "Item matches REMOVE request for key `%s'.\n",
1017  GNUNET_h2s (key));
1019  gettext_noop ("# bytes removed (explicit request)"),
1020  size,
1021  GNUNET_YES);
1023  transmit_status (client, GNUNET_OK, NULL);
1024 }
@ GNUNET_ERROR_TYPE_ERROR

References _, filter, gettext_noop, GNUNET_CONTAINER_bloomfilter_remove(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_h2s(), GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_update(), GNUNET_SYSERR, GNUNET_YES, key, msg, size, stats, status, and transmit_status().

Referenced by handle_remove().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_remove()

static int check_remove ( void *  cls,
const struct DataMessage dm 
)
static

Verify REMOVE-message.

Parameters
clsidentification of the client
messagethe actual message
Returns
GNUNET_OK if dm is well-formed

Definition at line 1035 of file gnunet-service-datastore.c.

1036 {
1037  if (GNUNET_OK != check_data (dm))
1038  {
1039  GNUNET_break (0);
1040  return GNUNET_SYSERR;
1041  }
1042  return GNUNET_OK;
1043 }

References check_data(), GNUNET_break, GNUNET_OK, and GNUNET_SYSERR.

Here is the call graph for this function:

◆ handle_remove()

static void handle_remove ( void *  cls,
const struct DataMessage dm 
)
static

Handle REMOVE-message.

Parameters
clsclosure
clientidentification of the client
messagethe actual message

Definition at line 1054 of file gnunet-service-datastore.c.

1055 {
1056  struct GNUNET_SERVICE_Client *client = cls;
1057 
1059  gettext_noop ("# REMOVE requests received"),
1060  1,
1061  GNUNET_NO);
1063  "Processing REMOVE request for `%s'\n",
1064  GNUNET_h2s (&dm->key));
1066  &dm->key,
1067  ntohl (dm->size),
1068  &dm[1],
1070  client);
1072 }
static void remove_continuation(void *cls, const struct GNUNET_HashCode *key, uint32_t size, int status, const char *msg)
Remove continuation.
PluginRemoveKey remove_key
Function to remove an item from the database.

References DatastorePlugin::api, GNUNET_DATASTORE_PluginFunctions::cls, gettext_noop, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_NO, GNUNET_SERVICE_client_continue(), GNUNET_STATISTICS_update(), DataMessage::key, plugin, remove_continuation(), GNUNET_DATASTORE_PluginFunctions::remove_key, DataMessage::size, and stats.

Here is the call graph for this function:

◆ handle_drop()

static void handle_drop ( void *  cls,
const struct GNUNET_MessageHeader message 
)
static

Handle DROP-message.

Parameters
clsidentification of the client
messagethe actual message

Definition at line 1082 of file gnunet-service-datastore.c.

1083 {
1084  struct GNUNET_SERVICE_Client *client = cls;
1085 
1086  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Processing DROP request\n");
1087  do_drop = GNUNET_YES;
1089 }
static int do_drop
Should the database be dropped on exit?

References do_drop, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_SERVICE_client_continue(), and GNUNET_YES.

Here is the call graph for this function:

◆ disk_utilization_change_cb()

static void disk_utilization_change_cb ( void *  cls,
int  delta 
)
static

Function called by plugins to notify us about a change in their disk utilization.

Parameters
clsclosure (NULL)
deltachange in disk utilization, 0 for "reset to empty"

Definition at line 1101 of file gnunet-service-datastore.c.

1102 {
1103  if ((delta < 0) && (payload < -delta))
1104  {
1105  GNUNET_log (
1107  _ (
1108  "Datastore payload must have been inaccurate (%lld < %lld). Recomputing it.\n"),
1109  (long long) payload,
1110  (long long) -delta);
1113  _ ("New payload: %lld\n"),
1114  (long long) payload);
1115  sync_stats ();
1116  return;
1117  }
1118  payload += delta;
1119  last_sync++;
1121  sync_stats ();
1122 }
#define MAX_STAT_SYNC_LAG
After how many payload-changing operations do we sync our statistics?
static void sync_stats()
Synchronize our utilization statistics with the statistics service.
static struct GNUNET_TIME_Relative delta
Definition: speedup.c:35
PluginEstimateSize estimate_size
Calculate the current on-disk size of the SQ store.

References _, DatastorePlugin::api, GNUNET_DATASTORE_PluginFunctions::cls, delta, GNUNET_DATASTORE_PluginFunctions::estimate_size, GNUNET_ERROR_TYPE_INFO, GNUNET_ERROR_TYPE_WARNING, GNUNET_log, last_sync, MAX_STAT_SYNC_LAG, payload, plugin, and sync_stats().

Referenced by load_plugin().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_stat_in()

static int process_stat_in ( void *  cls,
const char *  subsystem,
const char *  name,
uint64_t  value,
int  is_persistent 
)
static

Callback function to process statistic values.

Parameters
clsclosure (struct Plugin*)
subsystemname of subsystem that created the statistic
namethe name of the datum
valuethe current value
is_persistentGNUNET_YES if the value is persistent, GNUNET_NO if not
Returns
GNUNET_OK to continue, GNUNET_SYSERR to abort iteration

Definition at line 1136 of file gnunet-service-datastore.c.

1141 {
1144  payload += value;
1145  GNUNET_log (
1147  "Notification from statistics about existing payload (%llu), new payload is %llu\n",
1148  (unsigned long long) value,
1149  (unsigned long long) payload);
1150  return GNUNET_OK;
1151 }
static char * value
Value of the record to add/remove.
static int stats_worked
Did we get an answer from statistics?

References GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_YES, payload, stats_worked, and value.

Referenced by run().

Here is the caller graph for this function:

◆ load_plugin()

static struct DatastorePlugin* load_plugin ( )
static

Load the datastore plugin.

Definition at line 1158 of file gnunet-service-datastore.c.

1159 {
1160  struct DatastorePlugin *ret;
1161  char *libname;
1162 
1163  ret = GNUNET_new (struct DatastorePlugin);
1164  ret->env.cfg = cfg;
1165  ret->env.duc = &disk_utilization_change_cb;
1166  ret->env.cls = NULL;
1168  _ ("Loading `%s' datastore plugin\n"),
1169  plugin_name);
1170  GNUNET_asprintf (&libname, "libgnunet_plugin_datastore_%s", plugin_name);
1171  ret->short_name = GNUNET_strdup (plugin_name);
1172  ret->lib_name = libname;
1173  ret->api = GNUNET_PLUGIN_load (libname, &ret->env);
1174  if (NULL == ret->api)
1175  {
1177  _ ("Failed to load datastore plugin for `%s'\n"),
1178  plugin_name);
1179  GNUNET_free (ret->short_name);
1180  GNUNET_free (libname);
1181  GNUNET_free (ret);
1182  return NULL;
1183  }
1184  return ret;
1185 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
static char * plugin_name
Name of our plugin.
static const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
static void disk_utilization_change_cb(void *cls, int delta)
Function called by plugins to notify us about a change in their disk utilization.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * GNUNET_PLUGIN_load(const char *library_name, void *arg)
Setup plugin (runs the "init" callback and returns whatever "init" returned).
Definition: plugin.c:217
Our datastore plugin.

References _, cfg, disk_utilization_change_cb(), GNUNET_asprintf(), GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_log, GNUNET_new, GNUNET_PLUGIN_load(), GNUNET_strdup, plugin_name, and ret.

Referenced by process_stat_done().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ unload_plugin()

static void unload_plugin ( struct DatastorePlugin plug)
static

Function called when the service shuts down.

Unloads our datastore plugin.

Parameters
plugplugin to unload

Definition at line 1195 of file gnunet-service-datastore.c.

1196 {
1198  "Datastore service is unloading plugin...\n");
1199  GNUNET_break (NULL == GNUNET_PLUGIN_unload (plug->lib_name, plug->api));
1200  GNUNET_free (plug->lib_name);
1201  GNUNET_free (plug->short_name);
1202  GNUNET_free (plug);
1203 }
void * GNUNET_PLUGIN_unload(const char *library_name, void *arg)
Unload plugin (runs the "done" callback and returns whatever "done" returned).
Definition: plugin.c:269
char * lib_name
Name of the library (e.g.
char * short_name
Short name for the plugin (e.g.

References DatastorePlugin::api, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_PLUGIN_unload(), DatastorePlugin::lib_name, and DatastorePlugin::short_name.

Referenced by cleaning_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ begin_service()

static void begin_service ( )
static

Initialization complete, start operating the service.

Definition at line 1210 of file gnunet-service-datastore.c.

1211 {
1215  &delete_expired,
1216  NULL);
1217 }
static struct GNUNET_SERVICE_Handle * service
Handle to our server.
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:1208
void GNUNET_SERVICE_resume(struct GNUNET_SERVICE_Handle *sh)
Resume accepting connections from the listen socket.
Definition: service.c:2199

References delete_expired(), expired_kill_task, GNUNET_SCHEDULER_add_with_priority(), GNUNET_SCHEDULER_PRIORITY_IDLE, GNUNET_SERVICE_resume(), and service.

Referenced by add_key_to_bloomfilter(), and process_stat_done().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_key_to_bloomfilter()

static void add_key_to_bloomfilter ( void *  cls,
const struct GNUNET_HashCode key,
unsigned int  count 
)
static

Adds a given key to the bloomfilter in cls count times.

Parameters
clsthe bloomfilter
keykey to add
countnumber of times to add key

Definition at line 1228 of file gnunet-service-datastore.c.

1231 {
1232  struct GNUNET_CONTAINER_BloomFilter *bf = cls;
1233 
1234  if (NULL == key)
1235  {
1237  _ ("Bloomfilter construction complete.\n"));
1238  begin_service ();
1239  return;
1240  }
1241 
1242  while (0 < count--)
1244 }
static void begin_service()
Initialization complete, start operating the service.

References _, begin_service(), GNUNET_CONTAINER_bloomfilter_add(), GNUNET_ERROR_TYPE_INFO, GNUNET_log, and key.

Referenced by process_stat_done().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_stat_done()

static void process_stat_done ( void *  cls,
int  success 
)
static

We finished receiving the statistic.

Initialize the plugin; if loading the statistic failed, run the estimator.

Parameters
clsNULL
successGNUNET_NO if we failed to read the stat

Definition at line 1255 of file gnunet-service-datastore.c.

1256 {
1257  stat_get = NULL;
1258  if (NULL != stat_timeout_task)
1259  {
1261  stat_timeout_task = NULL;
1262  }
1263  plugin = load_plugin ();
1264  if (NULL == plugin)
1265  {
1267  filter = NULL;
1268  if (NULL != stats)
1269  {
1271  stats = NULL;
1272  }
1273  return;
1274  }
1275 
1276  if (GNUNET_NO == stats_worked)
1277  {
1279  "Failed to obtain value from statistics service, recomputing it\n");
1282  _ ("New payload: %lld\n"),
1283  (long long) payload);
1284  }
1285 
1286  if (GNUNET_YES == refresh_bf)
1287  {
1289  _ ("Rebuilding bloomfilter. Please be patient.\n"));
1290  if (NULL != plugin->api->get_keys)
1291  {
1293  return;
1294  }
1295  else
1296  {
1298  _ (
1299  "Plugin does not support get_keys function. Please fix!\n"));
1300  }
1301  }
1302  begin_service ();
1303 }
static struct GNUNET_STATISTICS_GetHandle * stat_get
Handle for pending get request.
static struct DatastorePlugin * load_plugin()
Load the datastore 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 GNUNET_SCHEDULER_Task * stat_timeout_task
Task to timeout stat GET.
static int refresh_bf
Should we refresh the BF when the DB is loaded?
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...
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:957
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).
PluginGetKeys get_keys
Iterate over all keys in the database.

References _, add_key_to_bloomfilter(), DatastorePlugin::api, begin_service(), GNUNET_DATASTORE_PluginFunctions::cls, GNUNET_DATASTORE_PluginFunctions::estimate_size, filter, GNUNET_DATASTORE_PluginFunctions::get_keys, GNUNET_CONTAINER_bloomfilter_free(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_NO, GNUNET_SCHEDULER_cancel(), GNUNET_STATISTICS_destroy(), GNUNET_YES, load_plugin(), payload, plugin, refresh_bf, stat_get, stat_timeout_task, stats, and stats_worked.

Referenced by run(), and stat_timeout().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ stat_timeout()

static void stat_timeout ( void *  cls)
static

Fetching stats took to long, run without.

Parameters
clsNULL

Definition at line 1312 of file gnunet-service-datastore.c.

1313 {
1314  stat_timeout_task = NULL;
1316  process_stat_done (NULL, GNUNET_NO);
1317 }
static void process_stat_done(void *cls, int success)
We finished receiving the statistic.
void GNUNET_STATISTICS_get_cancel(struct GNUNET_STATISTICS_GetHandle *gh)
Cancel a GNUNET_STATISTICS_get request.

References GNUNET_NO, GNUNET_STATISTICS_get_cancel(), process_stat_done(), stat_get, and stat_timeout_task.

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cleaning_task()

static void cleaning_task ( void *  cls)
static

Task run during shutdown.

Definition at line 1324 of file gnunet-service-datastore.c.

1325 {
1327  if (NULL != expired_kill_task)
1328  {
1330  expired_kill_task = NULL;
1331  }
1332  if (GNUNET_YES == do_drop)
1333  {
1334  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Dropping database!\n");
1335  plugin->api->drop (plugin->api->cls);
1336  payload = 0;
1337  last_sync++;
1338  }
1339  if (NULL != plugin)
1340  {
1342  plugin = NULL;
1343  }
1344  if (NULL != filter)
1345  {
1347  filter = NULL;
1348  }
1349  if (NULL != stat_get)
1350  {
1352  stat_get = NULL;
1353  }
1354  if (NULL != stat_timeout_task)
1355  {
1357  stat_timeout_task = NULL;
1358  }
1360  plugin_name = NULL;
1361  if (last_sync > 0)
1362  sync_stats ();
1363  if (NULL != stats)
1364  {
1366  stats = NULL;
1367  }
1369  quota_stat_name = NULL;
1370 }
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 unload_plugin(struct DatastorePlugin *plug)
Function called when the service shuts down.
PluginDrop drop
Delete the database.

References DatastorePlugin::api, cleaning_done, GNUNET_DATASTORE_PluginFunctions::cls, do_drop, GNUNET_DATASTORE_PluginFunctions::drop, expired_kill_task, filter, GNUNET_CONTAINER_bloomfilter_free(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_SCHEDULER_cancel(), GNUNET_STATISTICS_destroy(), GNUNET_STATISTICS_get_cancel(), GNUNET_YES, last_sync, payload, plugin, plugin_name, quota_stat_name, stat_get, stat_timeout_task, stats, sync_stats(), and unload_plugin().

Referenced by run().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ client_connect_cb()

static void* client_connect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
struct GNUNET_MQ_Handle mq 
)
static

Add a client to our list of active clients.

Parameters
clsNULL
clientclient to add
mqmessage queue for client
Returns
client

Definition at line 1382 of file gnunet-service-datastore.c.

1385 {
1386  return client;
1387 }

◆ client_disconnect_cb()

static void client_disconnect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
void *  app_ctx 
)
static

Called whenever a client is disconnected.

Frees our resources associated with that client.

Parameters
clsclosure
clientidentification of the client
app_ctxmust match client

Definition at line 1399 of file gnunet-service-datastore.c.

1402 {
1403  struct ReservationList *pos;
1404  struct ReservationList *prev;
1405  struct ReservationList *next;
1406 
1407  GNUNET_assert (app_ctx == client);
1408  prev = NULL;
1409  pos = reservations;
1410  while (NULL != pos)
1411  {
1412  next = pos->next;
1413  if (pos->client == client)
1414  {
1415  if (NULL == prev)
1416  reservations = next;
1417  else
1418  prev->next = next;
1420  GNUNET_free (pos);
1421  }
1422  else
1423  {
1424  prev = pos;
1425  }
1426  pos = next;
1427  }
1429  gettext_noop ("# reserved"),
1430  reserved,
1431  GNUNET_NO);
1432 }

References ReservationList::amount, ReservationList::client, ReservationList::entries, gettext_noop, GNUNET_assert, GNUNET_DATASTORE_ENTRY_OVERHEAD, GNUNET_free, GNUNET_NO, GNUNET_STATISTICS_set(), ReservationList::next, reservations, reserved, and stats.

Here is the call graph for this function:

◆ run()

static void run ( void *  cls,
const struct GNUNET_CONFIGURATION_Handle c,
struct GNUNET_SERVICE_Handle serv 
)
static

Process datastore requests.

Parameters
clsclosure
servthe initialized service
cconfiguration to use

Definition at line 1443 of file gnunet-service-datastore.c.

1446 {
1447  char *fn;
1448  char *pfn;
1449  unsigned int bf_size;
1450 
1451  service = serv;
1452  cfg = c;
1454  "DATASTORE",
1455  "DATABASE",
1456  &plugin_name))
1457  {
1459  "DATABASE",
1460  "DATASTORE");
1461  return;
1462  }
1464  _ ("# bytes used in file-sharing datastore `%s'"),
1465  plugin_name);
1466  if (GNUNET_OK !=
1467  GNUNET_CONFIGURATION_get_value_size (cfg, "DATASTORE", "QUOTA", &quota))
1468  {
1469  GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "QUOTA", "DATASTORE");
1470  return;
1471  }
1472  stats = GNUNET_STATISTICS_create ("datastore", cfg);
1474  cache_size = quota / 8; /* Or should we make this an option? */
1476  gettext_noop ("# cache size"),
1477  cache_size,
1478  GNUNET_NO);
1479  if (quota / (32 * 1024LL) > MAX_BF_SIZE)
1480  bf_size = MAX_BF_SIZE;
1481  else
1482  bf_size =
1483  quota / (32 * 1024LL); /* 8 bit per entry, 1 bit per 32 kb in DB */
1484  fn = NULL;
1486  "DATASTORE",
1487  "BLOOMFILTER",
1488  &fn)) ||
1490  {
1492  _ ("Could not use specified filename `%s' for bloomfilter.\n"),
1493  NULL != fn ? fn : "");
1494  GNUNET_free (fn);
1495  fn = NULL;
1496  }
1497  if (NULL != fn)
1498  {
1499  GNUNET_asprintf (&pfn, "%s.%s", fn, plugin_name);
1500  if (GNUNET_YES == GNUNET_DISK_file_test (pfn))
1501  {
1502  filter =
1504  bf_size,
1505  5); /* approx. 3% false positives at max use */
1506  if (NULL == filter)
1507  {
1508  /* file exists but not valid, remove and try again, but refresh */
1509  if (0 != unlink (pfn))
1510  {
1511  /* failed to remove, run without file */
1513  _ ("Failed to remove bogus bloomfilter file `%s'\n"),
1514  pfn);
1515  GNUNET_free (pfn);
1516  pfn = NULL;
1518  NULL,
1519  bf_size,
1520  5); /* approx. 3% false positives at max use */
1522  }
1523  else
1524  {
1525  /* try again after remove */
1527  pfn,
1528  bf_size,
1529  5); /* approx. 3% false positives at max use */
1531  if (NULL == filter)
1532  {
1533  /* failed yet again, give up on using file */
1535  _ ("Failed to remove bogus bloomfilter file `%s'\n"),
1536  pfn);
1537  GNUNET_free (pfn);
1538  pfn = NULL;
1540  NULL,
1541  bf_size,
1542  5); /* approx. 3% false positives at max use */
1543  }
1544  }
1545  }
1546  else
1547  {
1548  /* normal case: have an existing valid bf file, no need to refresh */
1550  }
1551  }
1552  else
1553  {
1554  filter =
1556  bf_size,
1557  5); /* approx. 3% false positives at max use */
1559  }
1560  GNUNET_free (pfn);
1561  }
1562  else
1563  {
1564  filter =
1566  bf_size,
1567  5); /* approx. 3% false positives at max use */
1569  }
1570  GNUNET_free (fn);
1571  if (NULL == filter)
1572  {
1574  _ ("Failed to initialize bloomfilter.\n"));
1575  if (NULL != stats)
1576  {
1578  stats = NULL;
1579  }
1580  return;
1581  }
1584  "datastore",
1587  &process_stat_in,
1588  NULL);
1589  if (NULL == stat_get)
1591  else
1593  &stat_timeout,
1594  NULL);
1596 }
static void stat_timeout(void *cls)
Fetching stats took to long, run without.
static void cleaning_task(void *cls)
Task run during shutdown.
#define MAX_BF_SIZE
Limit size of bloom filter to 2 GB.
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.
struct GNUNET_CONTAINER_BloomFilter * GNUNET_CONTAINER_bloomfilter_load(const char *filename, size_t size, unsigned int k)
Load a Bloom filter from a file.
struct GNUNET_CONTAINER_BloomFilter * GNUNET_CONTAINER_bloomfilter_init(const char *data, size_t size, unsigned int k)
Create a Bloom filter from raw bits.
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.
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:482
enum GNUNET_GenericReturnValue GNUNET_DISK_directory_create_for_file(const char *filename)
Create the directory structure for storing a file.
Definition: disk.c:582
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
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:1316
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:1254
void GNUNET_SERVICE_suspend(struct GNUNET_SERVICE_Handle *sh)
Suspend accepting connections from the listen socket temporarily.
Definition: service.c:2187
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
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.
#define GNUNET_TIME_UNIT_SECONDS
One second.

References _, cache_size, cfg, cleaning_task(), filter, gettext_noop, GNUNET_asprintf(), GNUNET_CONFIGURATION_get_value_filename(), GNUNET_CONFIGURATION_get_value_size(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONTAINER_bloomfilter_init(), GNUNET_CONTAINER_bloomfilter_load(), GNUNET_DISK_directory_create_for_file(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_log_config_missing(), GNUNET_NO, GNUNET_OK, GNUNET_SCHEDULER_add_delayed(), GNUNET_SCHEDULER_add_shutdown(), GNUNET_SERVICE_suspend(), GNUNET_STATISTICS_create(), GNUNET_STATISTICS_destroy(), GNUNET_STATISTICS_get(), GNUNET_STATISTICS_set(), GNUNET_SYSERR, GNUNET_TIME_UNIT_SECONDS, GNUNET_YES, MAX_BF_SIZE, plugin_name, process_stat_done(), process_stat_in(), quota, quota_stat_name, refresh_bf, service, stat_get, stat_timeout(), stat_timeout_task, and stats.

Here is the call graph for this function:

◆ GNUNET_SERVICE_MAIN()

Define "main" method using service macro.

Variable Documentation

◆ quota_stat_name

char* quota_stat_name
static

Name under which we store current space consumption.

Definition at line 61 of file gnunet-service-datastore.c.

Referenced by cleaning_task(), run(), and sync_stats().

◆ stat_timeout_task

struct GNUNET_SCHEDULER_Task* stat_timeout_task
static

Task to timeout stat GET.

Definition at line 66 of file gnunet-service-datastore.c.

Referenced by cleaning_task(), process_stat_done(), run(), and stat_timeout().

◆ plugin

struct DatastorePlugin* plugin
static

◆ reservations

struct ReservationList* reservations
static

Linked list of space reservations made by clients.

Definition at line 144 of file gnunet-service-datastore.c.

Referenced by client_disconnect_cb(), handle_put(), handle_release_reserve(), and handle_reserve().

◆ filter

struct GNUNET_CONTAINER_BloomFilter* filter
static

◆ plugin_name

char* plugin_name
static

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg
static

Our configuration.

Definition at line 159 of file gnunet-service-datastore.c.

Referenced by load_plugin(), and run().

◆ stats

struct GNUNET_STATISTICS_Handle* stats
static

◆ cache_size

unsigned long long cache_size
static

How much space are we using for the cache? (space available for insertions that will be instantly reclaimed by discarding less important content — or possibly whatever we just inserted into the "cache").

Definition at line 172 of file gnunet-service-datastore.c.

Referenced by handle_reserve(), put_continuation(), and run().

◆ reserved

unsigned long long reserved
static

How much space have we currently reserved?

Definition at line 177 of file gnunet-service-datastore.c.

Referenced by client_disconnect_cb(), handle_put(), handle_release_reserve(), handle_reserve(), and put_continuation().

◆ payload

unsigned long long payload
static

◆ expired_kill_task

struct GNUNET_SCHEDULER_Task* expired_kill_task
static

Identity of the task that is used to delete expired content.

Definition at line 189 of file gnunet-service-datastore.c.

Referenced by begin_service(), cleaning_task(), delete_expired(), and expired_processor().

◆ min_expiration

struct GNUNET_TIME_Absolute min_expiration
static

Minimum time that content should have to not be discarded instantly (time stamp of any content that we've been discarding recently to stay below the quota).

FOREVER if we had to expire content with non-zero priority.

Definition at line 189 of file gnunet-service-datastore.c.

Referenced by expired_processor(), put_migration_continuation(), quota_processor(), and transmit_status().

◆ quota

unsigned long long quota
static

How much space are we allowed to use?

Definition at line 202 of file gnunet-service-datastore.c.

Referenced by GNUNET_DATACACHE_create(), handle_reserve(), put_continuation(), run(), and set_incoming_quota().

◆ do_drop

int do_drop
static

Should the database be dropped on exit?

Definition at line 207 of file gnunet-service-datastore.c.

Referenced by cleaning_task(), and handle_drop().

◆ refresh_bf

int refresh_bf
static

Should we refresh the BF when the DB is loaded?

Definition at line 212 of file gnunet-service-datastore.c.

Referenced by process_stat_done(), and run().

◆ last_sync

unsigned int last_sync
static

Number of updates that were made to the payload value since we last synchronized it with the statistics service.

Definition at line 219 of file gnunet-service-datastore.c.

Referenced by cleaning_task(), disk_utilization_change_cb(), and sync_stats().

◆ stats_worked

int stats_worked
static

Did we get an answer from statistics?

Definition at line 224 of file gnunet-service-datastore.c.

Referenced by process_stat_done(), and process_stat_in().

◆ cleaning_done

int cleaning_done
static

Have we already cleaned up the TCCs and are hence no longer willing (or able) to transmit anything to anyone?

Definition at line 247 of file gnunet-service-datastore.c.

Referenced by cleaning_task().

◆ stat_get

struct GNUNET_STATISTICS_GetHandle* stat_get
static

Handle for pending get request.

Definition at line 252 of file gnunet-service-datastore.c.

Referenced by cleaning_task(), process_stat_done(), run(), and stat_timeout().

◆ service

struct GNUNET_SERVICE_Handle* service
static

Handle to our server.

Definition at line 257 of file gnunet-service-datastore.c.

Referenced by begin_service(), and run().