GNUnet 0.21.1
Data Cache library

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

Collaboration diagram for Data Cache library:

Data Structures

struct  GNUNET_DATACACHE_Block
 Information about a block stored in the datacache. More...
 

Typedefs

typedef enum GNUNET_GenericReturnValue(* GNUNET_DATACACHE_Iterator) (void *cls, const struct GNUNET_DATACACHE_Block *block)
 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...
 
enum GNUNET_GenericReturnValue GNUNET_DATACACHE_put (struct GNUNET_DATACACHE_Handle *h, uint32_t xor_distance, const struct GNUNET_DATACACHE_Block *block)
 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_closest (struct GNUNET_DATACACHE_Handle *h, const struct GNUNET_HashCode *key, enum GNUNET_BLOCK_Type type, 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 enum GNUNET_GenericReturnValue(* GNUNET_DATACACHE_Iterator) (void *cls, const struct GNUNET_DATACACHE_Block *block)

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

Parameters
clsclosure
blocka block from the datacache
Returns
GNUNET_OK to continue iterating, GNUNET_SYSERR to abort

Definition at line 134 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 128 of file datacache.c.

130{
131 unsigned int bf_size;
132 unsigned long long quota;
134 char *libname;
135 char *name;
136 const struct GNUNET_OS_ProjectData *pd;
137
138 if (GNUNET_OK !=
140 section,
141 "QUOTA",
142 &quota))
143 {
145 section,
146 "QUOTA");
147 return NULL;
148 }
149 if (GNUNET_OK !=
151 section,
152 "DATABASE",
153 &name))
154 {
156 section,
157 "DATABASE");
158 return NULL;
159 }
160 bf_size = quota / 32; /* 8 bit per entry, 1 bit per 32 kb in DB */
161
163
164 if (GNUNET_YES !=
166 section,
167 "DISABLE_BF"))
168 {
169 if (GNUNET_YES !=
171 section,
172 "DISABLE_BF_RC"))
173 {
174 ret->bloom_name = GNUNET_DISK_mktemp ("gnunet-datacachebloom");
175 }
176 if (NULL != ret->bloom_name)
177 {
179 ret->bloom_name,
180 quota / 1024, /* 8 bit per entry in DB, expect 1k entries */
181 5);
182 }
183 if (NULL == ret->filter)
184 {
185 ret->filter =
187 bf_size,
188 5); /* approx. 3% false positives at max use */
189 }
190 }
191 ret->stats = GNUNET_STATISTICS_create ("datacache",
192 cfg);
193 ret->section = GNUNET_strdup (section);
194 ret->env.cfg = cfg;
195 ret->env.delete_notify = &env_delete_notify;
196 ret->env.section = ret->section;
197 ret->env.cls = ret;
198 ret->env.delete_notify = &env_delete_notify;
199 ret->env.quota = quota;
201 "Loading `%s' datacache plugin\n",
202 name);
204 "libgnunet_plugin_datacache_%s",
205 name);
206 ret->short_name = name;
207 ret->lib_name = libname;
208 /* Load the plugin within GNUnet's default context */
212 &ret->env);
213 GNUNET_OS_init (pd);
214 if (NULL == ret->api)
215 {
216 /* Try to load the plugin within the application's context
217 This normally happens when the application is not GNUnet itself but a
218 third party; inside GNUnet this is effectively a double failure. */
220 &ret->env);
221 if (NULL == ret->api)
222 {
224 "Failed to load datacache plugin for `%s'\n",
225 name);
227 return NULL;
228 }
229 }
230 return ret;
231}
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 int ret
Final status code.
Definition: gnunet-arm.c:94
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:109
static char * name
Name (label) of the records to list.
static unsigned long long quota
How much space are we allowed to use?
struct GNUNET_CONTAINER_BloomFilter * GNUNET_CONTAINER_bloomfilter_init(const char *data, size_t size, unsigned int k)
Create a Bloom filter from raw bits.
struct GNUNET_CONTAINER_BloomFilter * GNUNET_CONTAINER_bloomfilter_load(const char *filename, size_t size, unsigned int k)
Load a Bloom filter from a file.
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:235
char * GNUNET_DISK_mktemp(const char *t)
Create an (empty) temporary file on disk.
Definition: disk.c:380
@ GNUNET_OK
@ GNUNET_YES
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.
void GNUNET_OS_init(const struct GNUNET_OS_ProjectData *pd)
Setup OS subsystem with project data.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_get(void)
void * GNUNET_PLUGIN_load(const char *library_name, void *arg)
Setup plugin (runs the "init" callback and returns whatever "init" returned).
Definition: plugin.c:198
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
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 235 of file datacache.c.

236{
237 if (NULL != h->filter)
239 if (NULL != h->api)
240 GNUNET_break (NULL ==
241 GNUNET_PLUGIN_unload (h->lib_name,
242 h->api));
243 GNUNET_free (h->lib_name);
244 GNUNET_free (h->short_name);
245 GNUNET_free (h->section);
246 if (NULL != h->bloom_name)
247 {
248 if (0 != unlink (h->bloom_name))
250 "datacache",
251 "unlink",
252 h->bloom_name);
253 GNUNET_free (h->bloom_name);
254 }
256 GNUNET_free (h);
257}
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
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...
@ GNUNET_NO
#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:242
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()

enum GNUNET_GenericReturnValue GNUNET_DATACACHE_put ( struct GNUNET_DATACACHE_Handle h,
uint32_t  xor_distance,
const struct GNUNET_DATACACHE_Block block 
)

Store an item in the datacache.

Parameters
hhandle to the datacache
xor_distancehow close is the block's key to our pid?
blockactual block data to store
Returns
GNUNET_OK on success, GNUNET_SYSERR on error, GNUNET_NO if duplicate

Definition at line 261 of file datacache.c.

264{
265 ssize_t used;
266
267 used = h->api->put (h->api->cls,
268 xor_distance,
269 block);
270 if (-1 == used)
271 {
272 GNUNET_break (0);
273 return GNUNET_SYSERR;
274 }
275 if (0 == used)
276 {
277 /* duplicate */
278 return GNUNET_NO;
279 }
281 "Stored data under key `%s' in cache\n",
282 GNUNET_h2s (&block->key));
283 if (NULL != h->filter)
285 &block->key);
287 "# bytes stored",
288 used,
289 GNUNET_NO);
291 "# items stored",
292 1,
293 GNUNET_NO);
294 while (h->utilization + used > h->env.quota)
296 h->api->del (h->api->cls));
297 h->utilization += used;
298 return GNUNET_OK;
299}
void GNUNET_CONTAINER_bloomfilter_add(struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Add an element to the filter.
@ GNUNET_SYSERR
#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.
struct GNUNET_HashCode key
Key of the block.

References GNUNET_assert, GNUNET_break, GNUNET_CONTAINER_bloomfilter_add(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_NO, GNUNET_OK, GNUNET_STATISTICS_update(), GNUNET_SYSERR, h, GNUNET_DATACACHE_Block::key, and LOG.

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 303 of file datacache.c.

308{
310 "# requests received",
311 1,
312 GNUNET_NO);
314 "Processing request for key `%s'\n",
315 GNUNET_h2s (key));
316 if ( (NULL != h->filter) &&
317 (GNUNET_OK !=
319 key)) )
320 {
322 "# requests filtered by bloom filter",
323 1,
324 GNUNET_NO);
326 "Bloomfilter filters request for key `%s'\n",
327 GNUNET_h2s (key));
328 return 0; /* can not be present */
329 }
330 return h->api->get (h->api->cls,
331 key,
332 type,
333 iter, iter_cls);
334}
struct GNUNET_HashCode key
The key used in the DHT.
static uint32_t type
Type string converted to DNS type value.
bool GNUNET_CONTAINER_bloomfilter_test(const struct GNUNET_CONTAINER_BloomFilter *bf, const struct GNUNET_HashCode *e)
Test if an element is in the filter.

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

Referenced by GDS_DATACACHE_handle_get().

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,
enum GNUNET_BLOCK_Type  type,
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
typeentries of which type are relevant?
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 338 of file datacache.c.

344{
346 "# proximity search requests received",
347 1,
348 GNUNET_NO);
350 "Processing proximity search at `%s'\n",
351 GNUNET_h2s (key));
352 return h->api->get_closest (h->api->cls,
353 key,
354 type,
355 num_results,
356 iter,
357 iter_cls);
358}

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

Referenced by GDS_DATACACHE_get_closest().

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