GNUnet  0.10.x
Typedefs | Functions
gnunet-service-dht_datacache.h File Reference

GNUnet DHT service's datacache integration. More...

#include "gnunet_util_lib.h"
#include "gnunet_block_lib.h"
#include "gnunet_dht_service.h"
Include dependency graph for gnunet-service-dht_datacache.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef void(* GDS_DATACACHE_GetCallback) (void *cls, enum GNUNET_BLOCK_Type type, struct GNUNET_TIME_Absolute expiration_time, const struct GNUNET_HashCode *key, unsigned int put_path_length, const struct GNUNET_PeerIdentity *put_path, unsigned int get_path_length, const struct GNUNET_PeerIdentity *get_path, const void *data, size_t data_size)
 Handle a result for a GET operation. More...
 
typedef void(* GDS_DATACACHE_SuccessorCallback) (void *cls, enum GNUNET_DHT_RouteOption options, const struct GNUNET_HashCode *key, enum GNUNET_BLOCK_Type type, unsigned int put_path_length, const struct GNUNET_PeerIdentity *put_path, struct GNUNET_TIME_Absolute expiration, const void *data, size_t data_size)
 Send the get result to requesting client. More...
 

Functions

void GDS_DATACACHE_handle_put (struct GNUNET_TIME_Absolute expiration, const struct GNUNET_HashCode *key, unsigned int put_path_length, const struct GNUNET_PeerIdentity *put_path, enum GNUNET_BLOCK_Type type, size_t data_size, const void *data)
 Handle a datum we've received from another peer. More...
 
enum GNUNET_BLOCK_EvaluationResult GDS_DATACACHE_handle_get (const struct GNUNET_HashCode *key, enum GNUNET_BLOCK_Type type, const void *xquery, size_t xquery_size, struct GNUNET_BLOCK_Group *bg, GDS_DATACACHE_GetCallback gc, void *gc_cls)
 Handle a GET request we've received from another peer. More...
 
int GDS_DATACACHE_get_random_key (struct GNUNET_HashCode *key)
 Obtain a random key from the datacache. More...
 
void GDS_DATACACHE_get_successors (const struct GNUNET_HashCode *key, GDS_DATACACHE_SuccessorCallback cb, void *cb_cls)
 Handle a request for data close to a key that we have received from another peer. More...
 
void GDS_DATACACHE_init (void)
 Initialize datacache subsystem. More...
 
void GDS_DATACACHE_done (void)
 Shutdown datacache subsystem. More...
 

Detailed Description

GNUnet DHT service's datacache integration.

Author
Christian Grothoff
Nathan Evans

Definition in file gnunet-service-dht_datacache.h.

Typedef Documentation

◆ GDS_DATACACHE_GetCallback

typedef void(* GDS_DATACACHE_GetCallback) (void *cls, enum GNUNET_BLOCK_Type type, struct GNUNET_TIME_Absolute expiration_time, const struct GNUNET_HashCode *key, unsigned int put_path_length, const struct GNUNET_PeerIdentity *put_path, unsigned int get_path_length, const struct GNUNET_PeerIdentity *get_path, const void *data, size_t data_size)

Handle a result for a GET operation.

Parameters
clsclosure
typetype of the block
expiration_timewhen does the content expire
keykey for the content
put_path_lengthnumber of entries in put_path
put_pathpeers the original PUT traversed (if tracked)
get_path_lengthnumber of entries in get_path
get_pathpeers this reply has traversed so far (if tracked)
datapayload of the reply
data_sizenumber of bytes in data

Definition at line 71 of file gnunet-service-dht_datacache.h.

◆ GDS_DATACACHE_SuccessorCallback

typedef void(* GDS_DATACACHE_SuccessorCallback) (void *cls, enum GNUNET_DHT_RouteOption options, const struct GNUNET_HashCode *key, enum GNUNET_BLOCK_Type type, unsigned int put_path_length, const struct GNUNET_PeerIdentity *put_path, struct GNUNET_TIME_Absolute expiration, const void *data, size_t data_size)

Send the get result to requesting client.

Parameters
clsclosure
optionsrouting options (from GET request)
keykey of the requested data.
typeblock type
put_path_lengthnumber of peers in put_path
put_pathpath taken to put the data at its stored location.
expirationwhen will this result expire?
datapayload to store
data_sizesize of the data

Definition at line 131 of file gnunet-service-dht_datacache.h.

Function Documentation

◆ GDS_DATACACHE_handle_put()

void GDS_DATACACHE_handle_put ( struct GNUNET_TIME_Absolute  expiration,
const struct GNUNET_HashCode key,
unsigned int  put_path_length,
const struct GNUNET_PeerIdentity put_path,
enum GNUNET_BLOCK_Type  type,
size_t  data_size,
const void *  data 
)

Handle a datum we've received from another peer.

Cache if possible.

Parameters
expirationwhen will the reply expire
keythe query this reply is for
put_path_lengthnumber of peers in 'put_path'
put_pathpath the reply took on put
typetype of the reply
data_sizenumber of bytes in 'data'
dataapplication payload data

Cache if possible.

Parameters
expirationwhen will the reply expire
keythe query this reply is for
put_path_lengthnumber of peers in put_path
put_pathpath the reply took on put
typetype of the reply
data_sizenumber of bytes in data
dataapplication payload data

Definition at line 60 of file gnunet-service-dht_datacache.c.

References _, GDS_stats, gettext_noop, GNUNET_break, GNUNET_CRYPTO_hash_matching_bits(), GNUNET_DATACACHE_put(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_h2s(), GNUNET_log, GNUNET_MAX_MESSAGE_SIZE, GNUNET_NO, GNUNET_STATISTICS_update(), LOG, and my_identity_hash.

Referenced by handle_dht_local_put(), handle_dht_p2p_put(), and process_reply_with_path().

67 {
68  int r;
69 
70  if (NULL == datacache)
71  {
73  _("%s request received, but have no datacache!\n"), "PUT");
74  return;
75  }
77  {
78  GNUNET_break(0);
79  return;
80  }
81  /* Put size is actual data size plus struct overhead plus path length (if any) */
83  gettext_noop("# ITEMS stored in datacache"),
84  1,
85  GNUNET_NO);
87  key,
90  data_size,
91  data,
92  type,
93  expiration,
94  put_path_length,
95  put_path);
97  "DATACACHE PUT for key %s [%u] completed (%d) after %u hops\n",
98  GNUNET_h2s(key),
99  data_size,
100  r,
101  put_path_length);
102 }
struct GNUNET_STATISTICS_Handle * GDS_stats
Handle for the statistics service.
unsigned int GNUNET_CRYPTO_hash_matching_bits(const struct GNUNET_HashCode *first, const struct GNUNET_HashCode *second)
Determine how many low order bits match in two struct GNUNET_HashCodes.
Definition: crypto_hash.c:256
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 datastore.
Definition: datacache.c:249
#define GNUNET_NO
Definition: gnunet_common.h:78
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_HashCode my_identity_hash
Hash of the identity of this peer.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
#define LOG(kind,...)
#define GNUNET_MAX_MESSAGE_SIZE
Largest supported message (to be precise, one byte more than the largest possible message...
#define GNUNET_log(kind,...)
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
static struct GNUNET_DATACACHE_Handle * datacache
Handle to the datacache service (for inserting/retrieving data)
uint32_t data
The data value.
static size_t data_size
Number of bytes in data.
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_DATACACHE_handle_get()

enum GNUNET_BLOCK_EvaluationResult GDS_DATACACHE_handle_get ( const struct GNUNET_HashCode key,
enum GNUNET_BLOCK_Type  type,
const void *  xquery,
size_t  xquery_size,
struct GNUNET_BLOCK_Group bg,
GDS_DATACACHE_GetCallback  gc,
void *  gc_cls 
)

Handle a GET request we've received from another peer.

Parameters
keythe query
typerequested data type
xqueryextended query
xquery_sizenumber of bytes in xquery
bgblock group to use for evaluation of replies
gcfunction to call on the results
gc_clsclosure for gc
Returns
evaluation result for the local replies
Parameters
keythe query
typerequested data type
xqueryextended query
xquery_sizenumber of bytes in xquery
bgblock group to use for reply evaluation
gcfunction to call on the results
gc_clsclosure for gc
Returns
evaluation result for the local replies

Definition at line 272 of file gnunet-service-dht_datacache.c.

References GetRequestContext::bg, datacache_get_iterator(), GetRequestContext::eval, GetRequestContext::gc, GetRequestContext::gc_cls, GDS_stats, gettext_noop, GNUNET_BLOCK_EVALUATION_REQUEST_VALID, GNUNET_DATACACHE_get(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_NO, GNUNET_STATISTICS_update(), GetRequestContext::key, LOG, GetRequestContext::xquery, and GetRequestContext::xquery_size.

Referenced by handle_dht_local_get(), and handle_dht_p2p_get().

279 {
280  struct GetRequestContext ctx;
281  unsigned int r;
282 
283  if (NULL == datacache)
286  gettext_noop("# GET requests given to datacache"),
287  1,
288  GNUNET_NO);
290  ctx.key = *key;
291  ctx.xquery = xquery;
292  ctx.xquery_size = xquery_size;
293  ctx.bg = bg;
294  ctx.gc = gc;
295  ctx.gc_cls = gc_cls;
297  key,
298  type,
300  &ctx);
302  "DATACACHE GET for key %s completed (%d). %u results found.\n",
303  GNUNET_h2s(key),
304  ctx.eval,
305  r);
306  return ctx.eval;
307 }
struct GNUNET_STATISTICS_Handle * GDS_stats
Handle for the statistics service.
size_t xquery_size
Number of bytes in xquery.
GDS_DATACACHE_GetCallback gc
Function to call on results.
#define GNUNET_NO
Definition: gnunet_common.h:78
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
#define LOG(kind,...)
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.
Definition: datacache.c:312
Context containing information about a GET request.
struct GNUNET_BLOCK_Group * bg
Block group to use to evaluate replies (updated)
struct GNUNET_HashCode key
The key used in the DHT.
static int datacache_get_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 put_path_length, const struct GNUNET_PeerIdentity *put_path)
Iterator for local get request results,.
void * gc_cls
Closure for gc.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
static struct GNUNET_DATACACHE_Handle * datacache
Handle to the datacache service (for inserting/retrieving data)
Query is valid, no reply given.
const void * xquery
extended query (see gnunet_block_lib.h).
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_DATACACHE_get_random_key()

int GDS_DATACACHE_get_random_key ( struct GNUNET_HashCode key)

Obtain a random key from the datacache.

Used by Whanau for load-balancing.

Parameters
[out]keywhere to store the key of a random element, randomized by PRNG if datacache is empty
Returns
GNUNET_OK on success, GNUNET_SYSERR if the datacache is empty

Definition at line 350 of file gnunet-service-dht_datacache.c.

References datacache_random_iterator(), GNUNET_CRYPTO_hash_create_random(), GNUNET_CRYPTO_QUALITY_NONCE, GNUNET_DATACACHE_get_random(), GNUNET_OK, and GNUNET_SYSERR.

351 {
352  if (0 ==
355  key))
356  {
357  /* randomize key in this case */
359  key);
360  return GNUNET_SYSERR;
361  }
362  return GNUNET_OK;
363 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
void GNUNET_CRYPTO_hash_create_random(enum GNUNET_CRYPTO_Quality mode, struct GNUNET_HashCode *result)
Create a random hash code.
Definition: crypto_hash.c:138
Randomness for IVs etc.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static int datacache_random_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)
Function called with a random element from the datacache.
static struct GNUNET_DATACACHE_Handle * datacache
Handle to the datacache service (for inserting/retrieving data)
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.
Definition: datacache.c:351
Here is the call graph for this function:

◆ GDS_DATACACHE_get_successors()

void GDS_DATACACHE_get_successors ( const struct GNUNET_HashCode key,
GDS_DATACACHE_SuccessorCallback  cb,
void *  cb_cls 
)

Handle a request for data close to a key that we have received from another peer.

Parameters
keythe location at which the peer is looking for data that is close
cbfunction to call with the result
cb_clsclosure for cb

Definition at line 433 of file gnunet-service-dht_datacache.c.

References SuccContext::cb, SuccContext::cb_cls, datacache_get_successors_iterator(), GNUNET_DATACACHE_get_closest(), and NUM_CLOSEST.

436 {
437  struct SuccContext sc;
438 
439  sc.cb = cb;
440  sc.cb_cls = cb_cls;
442  key,
443  NUM_CLOSEST,
445  &sc);
446 }
#define NUM_CLOSEST
How many "closest" results to we return for migration when asked (at most)?
static int datacache_get_successors_iterator(void *cls, const struct GNUNET_HashCode *key, size_t size, const char *data, enum GNUNET_BLOCK_Type type, struct GNUNET_TIME_Absolute exp, unsigned int put_path_length, const struct GNUNET_PeerIdentity *put_path)
Iterator for local get request results,.
void * cb_cls
Closure for cb.
static struct GNUNET_FS_SearchContext * sc
Definition: gnunet-search.c:37
GDS_DATACACHE_SuccessorCallback cb
Function to call on the result.
Closure for datacache_get_successors_iterator().
static struct GNUNET_DATACACHE_Handle * datacache
Handle to the datacache service (for inserting/retrieving data)
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.
Definition: datacache.c:379
Here is the call graph for this function:

◆ GDS_DATACACHE_init()

void GDS_DATACACHE_init ( void  )

Initialize datacache subsystem.

Definition at line 453 of file gnunet-service-dht_datacache.c.

References GDS_cfg, and GNUNET_DATACACHE_create().

Referenced by run().

454 {
456 }
struct GNUNET_DATACACHE_Handle * GNUNET_DATACACHE_create(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section)
Create a data cache.
Definition: datacache.c:132
const struct GNUNET_CONFIGURATION_Handle * GDS_cfg
Configuration we use.
static struct GNUNET_DATACACHE_Handle * datacache
Handle to the datacache service (for inserting/retrieving data)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GDS_DATACACHE_done()

void GDS_DATACACHE_done ( void  )

Shutdown datacache subsystem.

Definition at line 463 of file gnunet-service-dht_datacache.c.

References GNUNET_DATACACHE_destroy().

Referenced by shutdown_task().

464 {
465  if (NULL != datacache)
466  {
468  datacache = NULL;
469  }
470 }
void GNUNET_DATACACHE_destroy(struct GNUNET_DATACACHE_Handle *h)
Destroy a data cache (and free associated resources).
Definition: datacache.c:211
static struct GNUNET_DATACACHE_Handle * datacache
Handle to the datacache service (for inserting/retrieving data)
Here is the call graph for this function:
Here is the caller graph for this function: