GNUnet  0.10.x
Data Structures | Macros | Functions
plugin_datacache_heap.c File Reference

heap-only implementation of a database backend for the datacache More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_datacache_plugin.h"
Include dependency graph for plugin_datacache_heap.c:

Go to the source code of this file.

Data Structures

struct  Plugin
 Handle for a plugin. More...
 
struct  Value
 Entry in the hash map. More...
 
struct  PutContext
 Closure for put_cb(). More...
 
struct  GetContext
 Closure for get_cb(). More...
 
struct  GetClosestContext
 Closure for find_closest(). More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "datacache-heap", __VA_ARGS__)
 
#define LOG_STRERROR_FILE(kind, op, fn)   GNUNET_log_from_strerror_file (kind, "datacache-heap", op, fn)
 
#define NUM_HEAPS   24
 
#define OVERHEAD   (sizeof (struct Value) + 64)
 

Functions

static int put_cb (void *cls, const struct GNUNET_HashCode *key, void *value)
 Function called during PUT to detect if an equivalent block already exists. More...
 
static ssize_t heap_plugin_put (void *cls, const struct GNUNET_HashCode *key, uint32_t xor_distance, size_t 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 datastore. More...
 
static int get_cb (void *cls, const struct GNUNET_HashCode *key, void *value)
 Function called during GET to find matching blocks. More...
 
static unsigned int heap_plugin_get (void *cls, 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 datastore. More...
 
static int heap_plugin_del (void *cls)
 Delete the entry with the lowest expiration value from the datacache right now. More...
 
static unsigned int heap_plugin_get_random (void *cls, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
 Return a random value from the datastore. More...
 
static int find_closest (void *cls, const struct GNUNET_HashCode *key, void *value)
 
static unsigned int heap_plugin_get_closest (void *cls, 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...
 
void * libgnunet_plugin_datacache_heap_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_datacache_heap_done (void *cls)
 Exit point from the plugin. More...
 

Detailed Description

heap-only implementation of a database backend for the datacache

Author
Christian Grothoff

Definition in file plugin_datacache_heap.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "datacache-heap", __VA_ARGS__)

Definition at line 30 of file plugin_datacache_heap.c.

Referenced by libgnunet_plugin_datacache_heap_init().

◆ LOG_STRERROR_FILE

#define LOG_STRERROR_FILE (   kind,
  op,
  fn 
)    GNUNET_log_from_strerror_file (kind, "datacache-heap", op, fn)

Definition at line 32 of file plugin_datacache_heap.c.

◆ NUM_HEAPS

#define NUM_HEAPS   24

◆ OVERHEAD

#define OVERHEAD   (sizeof (struct Value) + 64)

Definition at line 107 of file plugin_datacache_heap.c.

Referenced by heap_plugin_del(), and heap_plugin_put().

Function Documentation

◆ put_cb()

static int put_cb ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Function called during PUT to detect if an equivalent block already exists.

Parameters
clsthe struct PutContext
keythe key for the value(s)
valuean existing value
Returns
GNUNET_YES if not found (to continue to iterate)

Definition at line 162 of file plugin_datacache_heap.c.

References GNUNET_TIME_Absolute::abs_value_us, PutContext::data, Value::discard_time, PutContext::discard_time, PutContext::found, GNUNET_array_grow, GNUNET_CONTAINER_heap_update_cost(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_NO, GNUNET_TIME_absolute_max(), GNUNET_YES, Value::hn, Value::path_info, PutContext::path_info, Value::path_info_len, PutContext::path_info_len, Value::size, PutContext::size, Value::type, PutContext::type, and value.

Referenced by GNUNET_DHT_monitor_start(), and heap_plugin_put().

165 {
166  struct PutContext *put_ctx = cls;
167  struct Value *val = value;
168 
169  if ( (val->size == put_ctx->size) &&
170  (val->type == put_ctx->type) &&
171  (0 == memcmp (&val[1],
172  put_ctx->data,
173  put_ctx->size)) )
174  {
175  put_ctx->found = GNUNET_YES;
177  put_ctx->discard_time);
178  /* replace old path with new path */
180  val->path_info_len,
181  put_ctx->path_info_len);
182  GNUNET_memcpy (val->path_info,
183  put_ctx->path_info,
184  put_ctx->path_info_len * sizeof (struct GNUNET_PeerIdentity));
188  "Got same value for key %s and type %d (size %u vs %u)\n",
189  GNUNET_h2s (key),
190  val->type,
191  (unsigned int) val->size,
192  (unsigned int) put_ctx->size);
193  return GNUNET_NO;
194  }
195  return GNUNET_YES;
196 }
size_t size
Payload (actual payload follows this struct)
void GNUNET_CONTAINER_heap_update_cost(struct GNUNET_CONTAINER_HeapNode *node, GNUNET_CONTAINER_HeapCostType new_cost)
Updates the cost of any node in the tree.
unsigned int path_info_len
Number of entries in path_info.
size_t size
Number of bytes in data.
const char * data
Data for the new value.
#define GNUNET_NO
Definition: gnunet_common.h:81
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
uint64_t abs_value_us
The actual value.
struct GNUNET_TIME_Absolute discard_time
Expiration time for the new value.
Closure for put_cb().
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
#define GNUNET_memcpy(dst, src, n)
int found
Value to set to GNUNET_YES if an equivalent block was found.
static char * value
Value of the record to add/remove.
enum GNUNET_BLOCK_Type type
Type of the block.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_max(struct GNUNET_TIME_Absolute t1, struct GNUNET_TIME_Absolute t2)
Return the maximum of two absolute time values.
Definition: time.c:317
const struct GNUNET_PeerIdentity * path_info
Path information.
unsigned int path_info_len
Number of entries in path_info.
Entry in the hash map.
The identity of the host (wraps the signing key of the peer).
struct GNUNET_CONTAINER_HeapNode * hn
Corresponding node in the heap.
#define GNUNET_log(kind,...)
#define GNUNET_YES
Definition: gnunet_common.h:80
struct GNUNET_TIME_Absolute discard_time
Expiration time.
struct GNUNET_PeerIdentity * path_info
Path information.
enum GNUNET_BLOCK_Type type
Type of the node.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ heap_plugin_put()

static ssize_t heap_plugin_put ( void *  cls,
const struct GNUNET_HashCode key,
uint32_t  xor_distance,
size_t  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 
)
static

Store an item in the datastore.

Parameters
clsclosure (our struct Plugin)
keykey to store data under
xor_distancehow close is key to our PID?
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
0 if duplicate, -1 on error, number of bytes used otherwise

Definition at line 214 of file plugin_datacache_heap.c.

References GNUNET_TIME_Absolute::abs_value_us, data, PutContext::data, Value::discard_time, PutContext::discard_time, Value::distance, PutContext::found, GNUNET_array_grow, GNUNET_CONTAINER_heap_insert(), GNUNET_CONTAINER_multihashmap_get_multiple(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE, GNUNET_malloc, GNUNET_memcpy, GNUNET_NO, GNUNET_YES, Plugin::heaps, Value::hn, Value::key, Plugin::key, Plugin::map, NUM_HEAPS, OVERHEAD, Value::path_info, PutContext::path_info, Value::path_info_len, PutContext::path_info_len, plugin, put_cb(), Value::size, PutContext::size, Plugin::size, Value::type, type, and PutContext::type.

Referenced by libgnunet_plugin_datacache_heap_init().

223 {
224  struct Plugin *plugin = cls;
225  struct Value *val;
226  struct PutContext put_ctx;
227 
228  put_ctx.found = GNUNET_NO;
229  put_ctx.data = data;
230  put_ctx.size = size;
231  put_ctx.path_info = path_info;
232  put_ctx.path_info_len = path_info_len;
233  put_ctx.discard_time = discard_time;
234  put_ctx.type = type;
236  key,
237  &put_cb,
238  &put_ctx);
239  if (GNUNET_YES == put_ctx.found)
240  return 0;
241  val = GNUNET_malloc (sizeof (struct Value) + size);
242  GNUNET_memcpy (&val[1],
243  data,
244  size);
245  val->key = *key;
246  val->type = type;
247  val->discard_time = discard_time;
248  val->size = size;
249  if (xor_distance >= NUM_HEAPS)
250  val->distance = NUM_HEAPS - 1;
251  else
252  val->distance = xor_distance;
254  val->path_info_len,
255  path_info_len);
256  GNUNET_memcpy (val->path_info,
257  path_info,
258  path_info_len * sizeof (struct GNUNET_PeerIdentity));
259  (void) GNUNET_CONTAINER_multihashmap_put (plugin->map,
260  &val->key,
261  val,
263  val->hn = GNUNET_CONTAINER_heap_insert (plugin->heaps[val->distance],
264  val,
266  return size + OVERHEAD;
267 }
size_t size
Payload (actual payload follows this struct)
unsigned int path_info_len
Number of entries in path_info.
struct GNUNET_CONTAINER_HeapNode * GNUNET_CONTAINER_heap_insert(struct GNUNET_CONTAINER_Heap *heap, void *element, GNUNET_CONTAINER_HeapCostType cost)
Inserts a new element into the heap.
uint32_t distance
How close is the hash to us? Determines which heap we are in!
struct GNUNET_CONTAINER_Heap * heaps[24]
Heaps sorted by distance.
#define GNUNET_NO
Definition: gnunet_common.h:81
struct GNUNET_CONTAINER_MultiHashMap * map
Our hash map.
uint64_t abs_value_us
The actual value.
#define OVERHEAD
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
struct GNUNET_TIME_Absolute discard_time
Expiration time for the new value.
Closure for put_cb().
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
#define GNUNET_memcpy(dst, src, n)
int found
Value to set to GNUNET_YES if an equivalent block was found.
enum GNUNET_BLOCK_Type type
Type of the block.
#define NUM_HEAPS
struct GNUNET_HashCode key
Key for the entry.
struct GNUNET_HashCode key
The key used in the DHT.
static unsigned int size
Size of the "table".
Definition: peer.c:67
const struct GNUNET_PeerIdentity * path_info
Path information.
unsigned int path_info_len
Number of entries in path_info.
int GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
Allow multiple values with the same key.
Entry in the hash map.
The identity of the host (wraps the signing key of the peer).
int GNUNET_CONTAINER_multihashmap_get_multiple(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, GNUNET_CONTAINER_MulitHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map that match a particular key.
Handle for a plugin.
Definition: block.c:37
struct GNUNET_CONTAINER_HeapNode * hn
Corresponding node in the heap.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
#define GNUNET_YES
Definition: gnunet_common.h:80
struct GNUNET_TIME_Absolute discard_time
Expiration time.
static int put_cb(void *cls, const struct GNUNET_HashCode *key, void *value)
Function called during PUT to detect if an equivalent block already exists.
uint32_t data
The data value.
struct GNUNET_PeerIdentity * path_info
Path information.
#define GNUNET_malloc(size)
Wrapper around malloc.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_cb()

static int get_cb ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Function called during GET to find matching blocks.

Only matches by type.

Parameters
clsthe struct GetContext
keythe key for the value(s)
valuean existing value
Returns
GNUNET_YES to continue to iterate

Definition at line 308 of file plugin_datacache_heap.c.

References GetContext::cnt, Value::discard_time, GNUNET_BLOCK_TYPE_ANY, GNUNET_OK, GNUNET_TIME_absolute_get_remaining(), GNUNET_YES, GetContext::iter, GetContext::iter_cls, GNUNET_TIME_Relative::rel_value_us, ret, Value::size, Value::type, GetContext::type, and value.

Referenced by GNUNET_DHT_monitor_start(), heap_plugin_get(), and heap_plugin_get_random().

311 {
312  struct GetContext *get_ctx = cls;
313  struct Value *val = value;
314  int ret;
315 
316  if ( (get_ctx->type != val->type) &&
317  (GNUNET_BLOCK_TYPE_ANY != get_ctx->type) )
318  return GNUNET_OK;
319  if (0 ==
321  return GNUNET_OK;
322  if (NULL != get_ctx->iter)
323  ret = get_ctx->iter (get_ctx->iter_cls,
324  key,
325  val->size,
326  (const char *) &val[1],
327  val->type,
328  val->discard_time,
329  val->path_info_len,
330  val->path_info);
331  else
332  ret = GNUNET_YES;
333  get_ctx->cnt++;
334  return ret;
335 }
size_t size
Payload (actual payload follows this struct)
uint64_t rel_value_us
The actual value.
Any type of block, used as a wildcard when searching.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
void * iter_cls
Closure for iter.
static int ret
Final status code.
Definition: gnunet-arm.c:89
unsigned int cnt
Number of results found.
static char * value
Value of the record to add/remove.
GNUNET_DATACACHE_Iterator iter
Function to call for each result.
enum GNUNET_BLOCK_Type type
Type of the block.
enum GNUNET_BLOCK_Type type
Block type requested.
Closure for get_cb().
Entry in the hash map.
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:331
#define GNUNET_YES
Definition: gnunet_common.h:80
struct GNUNET_TIME_Absolute discard_time
Expiration time.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ heap_plugin_get()

static unsigned int heap_plugin_get ( void *  cls,
const struct GNUNET_HashCode key,
enum GNUNET_BLOCK_Type  type,
GNUNET_DATACACHE_Iterator  iter,
void *  iter_cls 
)
static

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

Parameters
clsclosure (our struct Plugin)
key
typeentries of which type are relevant?
itermaybe NULL (to just count)
iter_clsclosure for iter
Returns
the number of results found

Definition at line 350 of file plugin_datacache_heap.c.

References GetContext::cnt, get_cb(), GNUNET_CONTAINER_multihashmap_get_multiple(), Plugin::iter, GetContext::iter, Plugin::iter_cls, GetContext::iter_cls, Plugin::map, plugin, type, and GetContext::type.

Referenced by libgnunet_plugin_datacache_heap_init().

355 {
356  struct Plugin *plugin = cls;
357  struct GetContext get_ctx;
358 
359  get_ctx.type = type;
360  get_ctx.iter = iter;
361  get_ctx.iter_cls = iter_cls;
362  get_ctx.cnt = 0;
364  key,
365  &get_cb,
366  &get_ctx);
367  return get_ctx.cnt;
368 }
static int get_cb(void *cls, const struct GNUNET_HashCode *key, void *value)
Function called during GET to find matching blocks.
struct GNUNET_CONTAINER_MultiHashMap * map
Our hash map.
void * iter_cls
Closure for iter.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
GNUNET_DATACACHE_Iterator iter
Function to call for each result.
enum GNUNET_BLOCK_Type type
Block type requested.
Closure for get_cb().
int GNUNET_CONTAINER_multihashmap_get_multiple(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, GNUNET_CONTAINER_MulitHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map that match a particular key.
Handle for a plugin.
Definition: block.c:37
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Here is the call graph for this function:
Here is the caller graph for this function:

◆ heap_plugin_del()

static int heap_plugin_del ( void *  cls)
static

Delete the entry with the lowest expiration value from the datacache right now.

Parameters
clsclosure (our struct Plugin)
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 379 of file plugin_datacache_heap.c.

References GNUNET_DATACACHE_PluginEnvironment::cls, GNUNET_DATACACHE_PluginEnvironment::delete_notify, Plugin::env, GNUNET_assert, GNUNET_CONTAINER_heap_remove_root(), GNUNET_CONTAINER_multihashmap_remove(), GNUNET_free, GNUNET_free_non_null, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, Plugin::heaps, Value::key, Plugin::map, NUM_HEAPS, OVERHEAD, Value::path_info, plugin, and Value::size.

Referenced by libgnunet_plugin_datacache_heap_init().

380 {
381  struct Plugin *plugin = cls;
382  struct Value *val;
383 
384  for (unsigned int i=0;i<NUM_HEAPS;i++)
385  {
386  val = GNUNET_CONTAINER_heap_remove_root (plugin->heaps[i]);
387  if (NULL != val)
388  break;
389  }
390  if (NULL == val)
391  return GNUNET_SYSERR;
394  &val->key,
395  val));
396  plugin->env->delete_notify (plugin->env->cls,
397  &val->key,
398  val->size + OVERHEAD);
400  GNUNET_free (val);
401  return GNUNET_OK;
402 }
size_t size
Payload (actual payload follows this struct)
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_CONTAINER_Heap * heaps[24]
Heaps sorted by distance.
struct GNUNET_CONTAINER_MultiHashMap * map
Our hash map.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
#define OVERHEAD
GNUNET_DATACACHE_DeleteNotifyCallback delete_notify
Function to call whenever the plugin needs to discard content that it was asked to store...
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
struct GNUNET_DATACACHE_PluginEnvironment * env
Our execution environment.
int GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
#define NUM_HEAPS
struct GNUNET_HashCode key
Key for the entry.
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
Entry in the hash map.
Handle for a plugin.
Definition: block.c:37
void * GNUNET_CONTAINER_heap_remove_root(struct GNUNET_CONTAINER_Heap *heap)
Remove root of the heap.
void * cls
Closure to use for callbacks.
#define GNUNET_YES
Definition: gnunet_common.h:80
struct GNUNET_PeerIdentity * path_info
Path information.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ heap_plugin_get_random()

static unsigned int heap_plugin_get_random ( void *  cls,
GNUNET_DATACACHE_Iterator  iter,
void *  iter_cls 
)
static

Return a random value from the datastore.

Parameters
clsclosure (our struct Plugin)
itermaybe NULL (to just count)
iter_clsclosure for iter
Returns
the number of results found

Definition at line 414 of file plugin_datacache_heap.c.

References GetContext::cnt, get_cb(), GNUNET_BLOCK_TYPE_ANY, GNUNET_CONTAINER_multihashmap_get_random(), Plugin::iter, GetContext::iter, Plugin::iter_cls, GetContext::iter_cls, Plugin::map, plugin, and GetContext::type.

Referenced by libgnunet_plugin_datacache_heap_init().

417 {
418  struct Plugin *plugin = cls;
419  struct GetContext get_ctx;
420 
421  get_ctx.type = GNUNET_BLOCK_TYPE_ANY;
422  get_ctx.iter = iter;
423  get_ctx.iter_cls = iter_cls;
424  get_ctx.cnt = 0;
426  &get_cb,
427  &get_ctx);
428  return get_ctx.cnt;
429 }
Any type of block, used as a wildcard when searching.
static int get_cb(void *cls, const struct GNUNET_HashCode *key, void *value)
Function called during GET to find matching blocks.
struct GNUNET_CONTAINER_MultiHashMap * map
Our hash map.
void * iter_cls
Closure for iter.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
unsigned int GNUNET_CONTAINER_multihashmap_get_random(const struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MulitHashMapIteratorCallback it, void *it_cls)
Call it on a random value from the map, or not at all if the map is empty.
GNUNET_DATACACHE_Iterator iter
Function to call for each result.
enum GNUNET_BLOCK_Type type
Block type requested.
Closure for get_cb().
Handle for a plugin.
Definition: block.c:37
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_closest()

static int find_closest ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Definition at line 446 of file plugin_datacache_heap.c.

References GNUNET_CRYPTO_hash_cmp(), GNUNET_OK, Value::key, GetClosestContext::key, GetClosestContext::num_results, value, and GetClosestContext::values.

Referenced by heap_plugin_get_closest().

449 {
450  struct GetClosestContext *gcc = cls;
451  struct Value *val = value;
452  unsigned int j;
453 
454  if (1 != GNUNET_CRYPTO_hash_cmp (key,
455  gcc->key))
456  return GNUNET_OK; /* useless */
457  j = gcc->num_results;
458  for (unsigned int i=0;i<gcc->num_results;i++)
459  {
460  if (NULL == gcc->values[i])
461  {
462  j = i;
463  break;
464  }
465  if (1 == GNUNET_CRYPTO_hash_cmp (&gcc->values[i]->key,
466  key))
467  {
468  j = i;
469  break;
470  }
471  }
472  if (j == gcc->num_results)
473  return GNUNET_OK;
474  gcc->values[j] = val;
475  return GNUNET_OK;
476 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
const struct GNUNET_HashCode * key
static char * value
Value of the record to add/remove.
struct GNUNET_HashCode key
Key for the entry.
Closure for find_closest().
Entry in the hash map.
int GNUNET_CRYPTO_hash_cmp(const struct GNUNET_HashCode *h1, const struct GNUNET_HashCode *h2)
Compare function for HashCodes, producing a total ordering of all hashcodes.
Definition: crypto_hash.c:278
Here is the call graph for this function:
Here is the caller graph for this function:

◆ heap_plugin_get_closest()

static unsigned int heap_plugin_get_closest ( void *  cls,
const struct GNUNET_HashCode key,
unsigned int  num_results,
GNUNET_DATACACHE_Iterator  iter,
void *  iter_cls 
)
static

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
clsclosure (internal context for the plugin)
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 493 of file plugin_datacache_heap.c.

References find_closest(), GNUNET_CONTAINER_multihashmap_iterate(), Plugin::iter, Plugin::map, GetClosestContext::num_results, plugin, Plugin::size, type, values, and GetClosestContext::values.

Referenced by libgnunet_plugin_datacache_heap_init().

498 {
499  struct Plugin *plugin = cls;
500  struct Value *values[num_results];
501  struct GetClosestContext gcc = {
502  .values = values,
503  .num_results = num_results,
504  .key = key
505  };
507  &find_closest,
508  &gcc);
509  for (unsigned int i=0;i<num_results;i++)
510  {
511  if (NULL == values[i])
512  return i;
513  iter (iter_cls,
514  &values[i]->key,
515  values[i]->size,
516  (void *) &values[i][1],
517  values[i]->type,
518  values[i]->discard_time,
519  values[i]->path_info_len,
520  values[i]->path_info);
521  }
522  return num_results;
523 }
static struct GNUNET_CONTAINER_MultiHashMap * values
Collection of all values (represented with ValueSet).
struct GNUNET_CONTAINER_MultiHashMap * map
Our hash map.
static int find_closest(void *cls, const struct GNUNET_HashCode *key, void *value)
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
Closure for find_closest().
static unsigned int size
Size of the "table".
Definition: peer.c:67
Entry in the hash map.
Handle for a plugin.
Definition: block.c:37
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MulitHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ libgnunet_plugin_datacache_heap_init()

void* libgnunet_plugin_datacache_heap_init ( void *  cls)

Entry point for the plugin.

Parameters
clsclosure (the struct GNUNET_DATACACHE_PluginEnvironmnet)
Returns
the plugin's closure (our struct Plugin)

Definition at line 533 of file plugin_datacache_heap.c.

References _, Plugin::api, GNUNET_DATACACHE_PluginEnvironment::cls, GNUNET_DATACACHE_PluginFunctions::cls, GNUNET_DATACACHE_PluginFunctions::del, Plugin::env, GNUNET_DATACACHE_PluginFunctions::get, GNUNET_DATACACHE_PluginFunctions::get_closest, GNUNET_DATACACHE_PluginFunctions::get_random, GNUNET_CONTAINER_heap_create(), GNUNET_CONTAINER_HEAP_ORDER_MIN, GNUNET_CONTAINER_multihashmap_create(), GNUNET_ERROR_TYPE_INFO, GNUNET_new, GNUNET_YES, heap_plugin_del(), heap_plugin_get(), heap_plugin_get_closest(), heap_plugin_get_random(), heap_plugin_put(), Plugin::heaps, LOG, Plugin::map, NUM_HEAPS, plugin, and GNUNET_DATACACHE_PluginFunctions::put.

534 {
537  struct Plugin *plugin;
538 
539  plugin = GNUNET_new (struct Plugin);
540  plugin->map = GNUNET_CONTAINER_multihashmap_create (1024, /* FIXME: base on quota! */
541  GNUNET_YES);
542  for (unsigned int i=0;i<NUM_HEAPS;i++)
544  plugin->env = env;
546  api->cls = plugin;
547  api->get = &heap_plugin_get;
548  api->put = &heap_plugin_put;
549  api->del = &heap_plugin_del;
553  _("Heap datacache running\n"));
554  return api;
555 }
void * cls
Closure to pass to all plugin functions.
ssize_t(* put)(void *cls, const struct GNUNET_HashCode *key, uint32_t xor_distance, size_t 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 datastore.
int(* del)(void *cls)
Delete the entry with the lowest expiration value from the datacache right now.
static int heap_plugin_del(void *cls)
Delete the entry with the lowest expiration value from the datacache right now.
struct GNUNET_CONTAINER_Heap * heaps[24]
Heaps sorted by distance.
struct GNUNET_CONTAINER_MultiHashMap * map
Our hash map.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static unsigned int heap_plugin_get(void *cls, 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 datastore.
static ssize_t heap_plugin_put(void *cls, const struct GNUNET_HashCode *key, uint32_t xor_distance, size_t 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 datastore.
struct GNUNET_BLOCK_PluginFunctions * api
Plugin API.
Definition: block.c:47
#define _(String)
GNU gettext support macro.
Definition: platform.h:208
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
struct GNUNET_DATACACHE_PluginEnvironment * env
Our execution environment.
unsigned int(* get_closest)(void *cls, 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.
struct returned by the initialization function of the plugin
Heap with the minimum cost at the root.
#define NUM_HEAPS
static unsigned int heap_plugin_get_random(void *cls, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
Return a random value from the datastore.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
#define LOG(kind,...)
struct GNUNET_CONTAINER_Heap * GNUNET_CONTAINER_heap_create(enum GNUNET_CONTAINER_HeapOrder order)
Create a new heap.
static unsigned int heap_plugin_get_closest(void *cls, 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.
Handle for a plugin.
Definition: block.c:37
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
void * cls
Closure to use for callbacks.
#define GNUNET_YES
Definition: gnunet_common.h:80
unsigned int(* get_random)(void *cls, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
Return a random value from the datastore.
The datastore service will pass a pointer to a struct of this type as the first and only argument to ...
unsigned int(* get)(void *cls, 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 datastore.
Here is the call graph for this function:

◆ libgnunet_plugin_datacache_heap_done()

void* libgnunet_plugin_datacache_heap_done ( void *  cls)

Exit point from the plugin.

Parameters
clsclosure (our "struct Plugin")
Returns
NULL

Definition at line 565 of file plugin_datacache_heap.c.

References Plugin::api, GNUNET_DATACACHE_PluginFunctions::cls, GNUNET_assert, GNUNET_CONTAINER_heap_destroy(), GNUNET_CONTAINER_heap_remove_root(), GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_remove(), GNUNET_free, GNUNET_free_non_null, GNUNET_YES, Plugin::heaps, Value::key, Plugin::map, NUM_HEAPS, Value::path_info, and plugin.

566 {
568  struct Plugin *plugin = api->cls;
569  struct Value *val;
570 
571  for (unsigned int i=0;i<NUM_HEAPS;i++)
572  {
573  while (NULL != (val = GNUNET_CONTAINER_heap_remove_root (plugin->heaps[i])))
574  {
577  &val->key,
578  val));
580  GNUNET_free (val);
581  }
583  }
585  GNUNET_free (plugin);
586  GNUNET_free (api);
587  return NULL;
588 }
void * cls
Closure to pass to all plugin functions.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_CONTAINER_Heap * heaps[24]
Heaps sorted by distance.
struct GNUNET_CONTAINER_MultiHashMap * map
Our hash map.
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
int GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
struct returned by the initialization function of the plugin
#define NUM_HEAPS
void GNUNET_CONTAINER_heap_destroy(struct GNUNET_CONTAINER_Heap *heap)
Destroys the heap.
struct GNUNET_HashCode key
Key for the entry.
Entry in the hash map.
Handle for a plugin.
Definition: block.c:37
void * GNUNET_CONTAINER_heap_remove_root(struct GNUNET_CONTAINER_Heap *heap)
Remove root of the heap.
#define GNUNET_YES
Definition: gnunet_common.h:80
struct GNUNET_PeerIdentity * path_info
Path information.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function: