GNUnet  0.11.x
Typedefs | Functions
Data Cache library

Simple, transient hash table of bounded size with content expiration. More...

Typedefs

typedef int(* GNUNET_DATACACHE_Iterator) (void *cls, const struct GNUNET_HashCode *key, size_t data_size, const char *data, enum GNUNET_BLOCK_Type type, struct GNUNET_TIME_Absolute exp, unsigned int path_info_len, const struct GNUNET_PeerIdentity *path_info)
 An iterator over a set of items stored in the datacache. More...
 

Functions

struct GNUNET_DATACACHE_HandleGNUNET_DATACACHE_create (const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section)
 Create a data cache. More...
 
void GNUNET_DATACACHE_destroy (struct GNUNET_DATACACHE_Handle *h)
 Destroy a data cache (and free associated resources). More...
 
int GNUNET_DATACACHE_put (struct GNUNET_DATACACHE_Handle *h, const struct GNUNET_HashCode *key, uint32_t xor_distance, size_t data_size, const char *data, enum GNUNET_BLOCK_Type type, struct GNUNET_TIME_Absolute discard_time, unsigned int path_info_len, const struct GNUNET_PeerIdentity *path_info)
 Store an item in the datacache. More...
 
unsigned int GNUNET_DATACACHE_get (struct GNUNET_DATACACHE_Handle *h, const struct GNUNET_HashCode *key, enum GNUNET_BLOCK_Type type, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
 Iterate over the results for a particular key in the datacache. More...
 
unsigned int GNUNET_DATACACHE_get_random (struct GNUNET_DATACACHE_Handle *h, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
 Obtain a random element from the datacache. More...
 
unsigned int GNUNET_DATACACHE_get_closest (struct GNUNET_DATACACHE_Handle *h, const struct GNUNET_HashCode *key, unsigned int num_results, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
 Iterate over the results that are "close" to a particular key in the datacache. More...
 

Detailed Description

Simple, transient hash table of bounded size with content expiration.

In contrast to the sqstore there is no prioritization, deletion or iteration. All of the data is discarded when the peer shuts down!

Typedef Documentation

◆ GNUNET_DATACACHE_Iterator

typedef int(* GNUNET_DATACACHE_Iterator) (void *cls, const struct GNUNET_HashCode *key, size_t data_size, const char *data, enum GNUNET_BLOCK_Type type, struct GNUNET_TIME_Absolute exp, unsigned int path_info_len, const struct GNUNET_PeerIdentity *path_info)

An iterator over a set of items stored in the datacache.

Parameters
clsclosure
keykey for the content
data_sizenumber of bytes in data
datacontent stored
typetype of the content
expwhen will the content expire?
path_info_lennumber of entries in path_info
path_infoa path through the network
Returns
GNUNET_OK to continue iterating, GNUNET_SYSERR to abort

Definition at line 92 of file gnunet_datacache_lib.h.

Function Documentation

◆ GNUNET_DATACACHE_create()

struct GNUNET_DATACACHE_Handle* GNUNET_DATACACHE_create ( const struct GNUNET_CONFIGURATION_Handle cfg,
const char *  section 
)

Create a data cache.

Parameters
cfgconfiguration to use
sectionsection in the configuration that contains our options
Returns
handle to use to access the service

Definition at line 133 of file datacache.c.

135 {
136  unsigned int bf_size;
137  unsigned long long quota;
139  char *libname;
140  char *name;
141  const struct GNUNET_OS_ProjectData *pd;
142 
143  if (GNUNET_OK !=
144  GNUNET_CONFIGURATION_get_value_size (cfg, section, "QUOTA", &quota))
145  {
147  return NULL;
148  }
149  if (GNUNET_OK !=
150  GNUNET_CONFIGURATION_get_value_string (cfg, section, "DATABASE", &name))
151  {
152  GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, section, "DATABASE");
153  return NULL;
154  }
155  bf_size = quota / 32; /* 8 bit per entry, 1 bit per 32 kb in DB */
156 
158 
159  if (GNUNET_YES !=
160  GNUNET_CONFIGURATION_get_value_yesno (cfg, section, "DISABLE_BF"))
161  {
162  if (GNUNET_YES !=
163  GNUNET_CONFIGURATION_get_value_yesno (cfg, section, "DISABLE_BF_RC"))
164  {
165  ret->bloom_name = GNUNET_DISK_mktemp ("gnunet-datacachebloom");
166  }
167  if (NULL != ret->bloom_name)
168  {
170  ret->bloom_name,
171  quota / 1024, /* 8 bit per entry in DB, expect 1k entries */
172  5);
173  }
174  if (NULL == ret->filter)
175  {
176  ret->filter =
178  bf_size,
179  5); /* approx. 3% false positives at max use */
180  }
181  }
182  ret->stats = GNUNET_STATISTICS_create ("datacache", cfg);
183  ret->section = GNUNET_strdup (section);
184  ret->env.cfg = cfg;
185  ret->env.delete_notify = &env_delete_notify;
186  ret->env.section = ret->section;
187  ret->env.cls = ret;
188  ret->env.delete_notify = &env_delete_notify;
189  ret->env.quota = quota;
190  LOG (GNUNET_ERROR_TYPE_INFO, _ ("Loading `%s' datacache plugin\n"), name);
191  GNUNET_asprintf (&libname, "libgnunet_plugin_datacache_%s", name);
192  ret->short_name = name;
193  ret->lib_name = libname;
194  /* Load the plugin within GNUnet's default context */
197  ret->api = GNUNET_PLUGIN_load (libname, &ret->env);
198  GNUNET_OS_init(pd);
199  if (NULL == ret->api)
200  {
201  /* Try to load the plugin within the application's context
202  This normally happens when the application is not GNUnet itself but a
203  third party; inside GNUnet this is effectively a double failure. */
204  ret->api = GNUNET_PLUGIN_load (libname, &ret->env);
205  if (NULL == ret->api)
206  {
208  _ ("Failed to load datacache plugin for `%s'\n"),
209  name);
211  return NULL;
212  }
213  }
214  return ret;
215 }
static void env_delete_notify(void *cls, const struct GNUNET_HashCode *key, size_t size)
Function called by plugins to notify the datacache about content deletions.
Definition: datacache.c:104
#define LOG(kind,...)
Definition: datacache.c:32
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
static unsigned long long quota
How much space are we allowed to use?
@ GNUNET_OK
Definition: gnunet_common.h:95
@ GNUNET_YES
Definition: gnunet_common.h:97
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_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_yesno(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option)
Get a configuration value that should be in a set of "YES" or "NO".
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.
void GNUNET_DATACACHE_destroy(struct GNUNET_DATACACHE_Handle *h)
Destroy a data cache (and free associated resources).
Definition: datacache.c:224
char * GNUNET_DISK_mktemp(const char *t)
Create an (empty) temporary file on disk.
Definition: disk.c:381
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_ERROR
@ 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.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_default(void)
Return default project data used by 'libgnunetutil' for GNUnet.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_get(void)
void GNUNET_OS_init(const struct GNUNET_OS_ProjectData *pd)
Setup OS subsystem with project data.
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
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
#define _(String)
GNU gettext support macro.
Definition: platform.h:177
const char * name
Internal state of the datacache library.
Definition: datacache.c:41
Project-specific data used to help the OS subsystem find installation paths.
const char * libname
Name of a library that is installed in the "lib/" directory of the project, such as "libgnunetutil".

References _, cfg, env_delete_notify(), GNUNET_asprintf(), GNUNET_CONFIGURATION_get_value_size(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_get_value_yesno(), GNUNET_CONTAINER_bloomfilter_init(), GNUNET_CONTAINER_bloomfilter_load(), GNUNET_DATACACHE_destroy(), GNUNET_DISK_mktemp(), GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_log_config_missing(), GNUNET_new, GNUNET_OK, GNUNET_OS_init(), GNUNET_OS_project_data_default(), GNUNET_OS_project_data_get(), GNUNET_PLUGIN_load(), GNUNET_STATISTICS_create(), GNUNET_strdup, GNUNET_YES, GNUNET_OS_ProjectData::libname, LOG, name, quota, and ret.

Referenced by GDS_DATACACHE_init().

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

◆ GNUNET_DATACACHE_destroy()

void GNUNET_DATACACHE_destroy ( struct GNUNET_DATACACHE_Handle h)

Destroy a data cache (and free associated resources).

Parameters
hhandle to the datastore

Definition at line 224 of file datacache.c.

225 {
226  if (NULL != h->filter)
228  if (NULL != h->api)
229  GNUNET_break (NULL == GNUNET_PLUGIN_unload (h->lib_name, h->api));
230  GNUNET_free (h->lib_name);
231  GNUNET_free (h->short_name);
232  GNUNET_free (h->section);
233  if (NULL != h->bloom_name)
234  {
235  if (0 != unlink (h->bloom_name))
237  "datacache",
238  "unlink",
239  h->bloom_name);
240  GNUNET_free (h->bloom_name);
241  }
243  GNUNET_free (h);
244 }
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
@ GNUNET_NO
Definition: gnunet_common.h:94
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...
#define GNUNET_log_from_strerror_file(level, component, cmd, filename)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_WARNING
#define GNUNET_free(ptr)
Wrapper around free.
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
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).

References GNUNET_break, GNUNET_CONTAINER_bloomfilter_free(), GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log_from_strerror_file, GNUNET_NO, GNUNET_PLUGIN_unload(), GNUNET_STATISTICS_destroy(), and h.

Referenced by GDS_DATACACHE_done(), and GNUNET_DATACACHE_create().

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

◆ GNUNET_DATACACHE_put()

int GNUNET_DATACACHE_put ( struct GNUNET_DATACACHE_Handle h,
const struct GNUNET_HashCode key,
uint32_t  xor_distance,
size_t  data_size,
const char *  data,
enum GNUNET_BLOCK_Type  type,
struct GNUNET_TIME_Absolute  discard_time,
unsigned int  path_info_len,
const struct GNUNET_PeerIdentity path_info 
)

Store an item in the datacache.

Parameters
hhandle to the datacache
keykey to store data under
howclose is key to our pid?
data_sizenumber of bytes in data
datadata to store
typetype of the value
discard_timewhen to discard the value in any case
path_info_lennumber of entries in path_info
path_infoa path through the network
Returns
GNUNET_OK on success, GNUNET_SYSERR on error, GNUNET_NO if duplicate

Store an item in the datacache.

Parameters
hhandle to the datacache
keykey to store data under
xor_distancedistance of key to our PID
data_sizenumber of bytes in data
datadata to store
typetype of the value
discard_timewhen to discard the value in any case
path_info_lennumber of entries in path_info
path_infoa path through the network
Returns
GNUNET_OK on success, GNUNET_SYSERR on error, GNUNET_NO if duplicate

Definition at line 262 of file datacache.c.

271 {
272  ssize_t used;
273 
274  used = h->api->put (h->api->cls,
275  key,
276  xor_distance,
277  data_size,
278  data,
279  type,
280  discard_time,
281  path_info_len,
282  path_info);
283  if (-1 == used)
284  {
285  GNUNET_break (0);
286  return GNUNET_SYSERR;
287  }
288  if (0 == used)
289  {
290  /* duplicate */
291  return GNUNET_NO;
292  }
294  "Stored data under key `%s' in cache\n",
295  GNUNET_h2s (key));
296  if (NULL != h->filter)
298  GNUNET_STATISTICS_update (h->stats,
299  gettext_noop ("# bytes stored"),
300  used,
301  GNUNET_NO);
302  GNUNET_STATISTICS_update (h->stats,
303  gettext_noop ("# items stored"),
304  1,
305  GNUNET_NO);
306  while (h->utilization + used > h->env.quota)
307  GNUNET_assert (GNUNET_OK == h->api->del (h->api->cls));
308  h->utilization += used;
309  return GNUNET_OK;
310 }
#define gettext_noop(String)
Definition: gettext.h:69
static size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
struct GNUNET_HashCode key
The key used in the DHT.
uint32_t data
The data value.
@ GNUNET_SYSERR
Definition: gnunet_common.h:93
void GNUNET_CONTAINER_bloomfilter_add(struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Add an element to the filter.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model

References data, data_size, gettext_noop, GNUNET_assert, GNUNET_break, GNUNET_CONTAINER_bloomfilter_add(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_update(), GNUNET_SYSERR, h, key, LOG, and type.

Referenced by GDS_DATACACHE_handle_put().

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

◆ GNUNET_DATACACHE_get()

unsigned int GNUNET_DATACACHE_get ( struct GNUNET_DATACACHE_Handle h,
const struct GNUNET_HashCode key,
enum GNUNET_BLOCK_Type  type,
GNUNET_DATACACHE_Iterator  iter,
void *  iter_cls 
)

Iterate over the results for a particular key in the datacache.

Parameters
hhandle to the datacache
keywhat to look up
typeentries of which type are relevant?
itermaybe NULL (to just count)
iter_clsclosure for iter
Returns
the number of results found

Definition at line 325 of file datacache.c.

330 {
331  GNUNET_STATISTICS_update (h->stats,
332  gettext_noop ("# requests received"),
333  1,
334  GNUNET_NO);
336  "Processing request for key `%s'\n",
337  GNUNET_h2s (key));
338  if ((NULL != h->filter) &&
340  {
341  GNUNET_STATISTICS_update (h->stats,
342  gettext_noop (
343  "# requests filtered by bloom filter"),
344  1,
345  GNUNET_NO);
347  "Bloomfilter filters request for key `%s'\n",
348  GNUNET_h2s (key));
349  return 0; /* can not be present */
350  }
351  return h->api->get (h->api->cls, key, type, iter, iter_cls);
352 }
int GNUNET_CONTAINER_bloomfilter_test(const struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Test if an element is in the filter.

References gettext_noop, GNUNET_CONTAINER_bloomfilter_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_update(), h, key, LOG, and type.

Here is the call graph for this function:

◆ GNUNET_DATACACHE_get_random()

unsigned int GNUNET_DATACACHE_get_random ( struct GNUNET_DATACACHE_Handle h,
GNUNET_DATACACHE_Iterator  iter,
void *  iter_cls 
)

Obtain a random element from the datacache.

Parameters
hhandle to the datacache
itermaybe NULL (to just count)
iter_clsclosure for iter
Returns
the number of results found (zero or 1)

Definition at line 364 of file datacache.c.

367 {
368  GNUNET_STATISTICS_update (h->stats,
369  gettext_noop (
370  "# requests for random value received"),
371  1,
372  GNUNET_NO);
373  LOG (GNUNET_ERROR_TYPE_DEBUG, "Processing request for random value\n");
374  return h->api->get_random (h->api->cls, iter, iter_cls);
375 }

References gettext_noop, GNUNET_ERROR_TYPE_DEBUG, GNUNET_NO, GNUNET_STATISTICS_update(), h, and LOG.

Referenced by GDS_DATACACHE_get_random_key().

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

◆ GNUNET_DATACACHE_get_closest()

unsigned int GNUNET_DATACACHE_get_closest ( struct GNUNET_DATACACHE_Handle h,
const struct GNUNET_HashCode key,
unsigned int  num_results,
GNUNET_DATACACHE_Iterator  iter,
void *  iter_cls 
)

Iterate over the results that are "close" to a particular key in the datacache.

"close" is defined as numerically larger than key (when interpreted as a circular address space), with small distance.

Parameters
hhandle to the datacache
keyarea of the keyspace to look into
num_resultsnumber of results that should be returned to iter
itermaybe NULL (to just count)
iter_clsclosure for iter
Returns
the number of results found

Definition at line 392 of file datacache.c.

397 {
398  GNUNET_STATISTICS_update (h->stats,
399  gettext_noop (
400  "# proximity search requests received"),
401  1,
402  GNUNET_NO);
404  "Processing proximity search at `%s'\n",
405  GNUNET_h2s (key));
406  return h->api->get_closest (h->api->cls, key, num_results, iter, iter_cls);
407 }

References gettext_noop, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_NO, GNUNET_STATISTICS_update(), h, key, and LOG.

Referenced by GDS_DATACACHE_get_successors().

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