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:273
#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).
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:208
#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 268 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().

275 {
276  struct GetRequestContext ctx;
277  unsigned int r;
278 
279  if (NULL == datacache)
282  gettext_noop ("# GET requests given to datacache"),
283  1,
284  GNUNET_NO);
286  ctx.key = *key;
287  ctx.xquery = xquery;
288  ctx.xquery_size = xquery_size;
289  ctx.bg = bg;
290  ctx.gc = gc;
291  ctx.gc_cls = gc_cls;
293  key,
294  type,
296  &ctx);
298  "DATACACHE GET for key %s completed (%d). %u results found.\n",
299  GNUNET_h2s (key),
300  ctx.eval,
301  r);
302  return ctx.eval;
303 }
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:81
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:338
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 346 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.

347 {
348  if (0 ==
351  key))
352  {
353  /* randomize key in this case */
355  key);
356  return GNUNET_SYSERR;
357  }
358  return GNUNET_OK;
359 }
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
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:79
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:380
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 430 of file gnunet-service-dht_datacache.c.

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

433 {
434  struct SuccContext sc;
435 
436  sc.cb = cb;
437  sc.cb_cls = cb_cls;
439  key,
440  NUM_CLOSEST,
442  &sc);
443 }
#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:410
Here is the call graph for this function:

◆ GDS_DATACACHE_init()

void GDS_DATACACHE_init ( void  )

Initialize datacache subsystem.

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

References GDS_cfg, and GNUNET_DATACACHE_create().

Referenced by run().

451 {
452  datacache = GNUNET_DATACACHE_create (GDS_cfg, "dhtcache");
453 }
struct GNUNET_DATACACHE_Handle * GNUNET_DATACACHE_create(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section)
Create a data cache.
Definition: datacache.c:137
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 460 of file gnunet-service-dht_datacache.c.

References GNUNET_DATACACHE_destroy().

Referenced by shutdown_task().

461 {
462  if (NULL != datacache)
463  {
465  datacache = NULL;
466  }
467 }
void GNUNET_DATACACHE_destroy(struct GNUNET_DATACACHE_Handle *h)
Destroy a data cache (and free associated resources).
Definition: datacache.c:232
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: