GNUnet  0.10.x
Data Structures | Macros | Functions | Variables
gnunet-service-fs_put.c File Reference

API to PUT zero-anonymity index data from our datastore into the DHT. More...

#include "platform.h"
#include "gnunet-service-fs.h"
#include "gnunet-service-fs_put.h"
Include dependency graph for gnunet-service-fs_put.c:

Go to the source code of this file.

Data Structures

struct  PutOperator
 Context for each zero-anonymity iterator. More...
 

Macros

#define MAX_DHT_PUT_FREQ   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
 How often do we at most PUT content into the DHT? More...
 
#define DEFAULT_PUT_REPLICATION   5
 How many replicas do we try to create per PUT? More...
 

Functions

static void gather_dht_put_blocks (void *cls)
 Task that is run periodically to obtain blocks for DHT PUTs. More...
 
static void schedule_next_put (struct PutOperator *po)
 Calculate when to run the next PUT operation and schedule it. More...
 
static void delay_dht_put_blocks (void *cls)
 Continuation called after DHT PUT operation has finished. More...
 
static void delay_dht_put_task (void *cls)
 Task that is run periodically to obtain blocks for DHT PUTs. More...
 
static void process_dht_put_content (void *cls, const struct GNUNET_HashCode *key, size_t size, const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority, uint32_t anonymity, uint32_t replication, struct GNUNET_TIME_Absolute expiration, uint64_t uid)
 Store content in DHT. More...
 
void GSF_put_init_ ()
 Setup the module. More...
 
void GSF_put_done_ ()
 Shutdown the module. More...
 

Variables

static struct PutOperator operators []
 ANY-terminated list of our operators (one per type of block that we're putting into the DHT). More...
 

Detailed Description

API to PUT zero-anonymity index data from our datastore into the DHT.

Author
Christian Grothoff

Definition in file gnunet-service-fs_put.c.

Macro Definition Documentation

◆ MAX_DHT_PUT_FREQ

#define MAX_DHT_PUT_FREQ   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)

How often do we at most PUT content into the DHT?

Definition at line 34 of file gnunet-service-fs_put.c.

Referenced by schedule_next_put().

◆ DEFAULT_PUT_REPLICATION

#define DEFAULT_PUT_REPLICATION   5

How many replicas do we try to create per PUT?

Definition at line 39 of file gnunet-service-fs_put.c.

Referenced by process_dht_put_content().

Function Documentation

◆ gather_dht_put_blocks()

static void gather_dht_put_blocks ( void *  cls)
static

Task that is run periodically to obtain blocks for DHT PUTs.

Parameters
clstype of blocks to gather
tcscheduler context (unused)
clstype of blocks to gather

Definition at line 228 of file gnunet-service-fs_put.c.

References delay_dht_put_task(), PutOperator::dht_put_type, PutOperator::dht_qe, PutOperator::dht_task, GNUNET_DATASTORE_get_zero_anonymity(), GNUNET_SCHEDULER_add_now(), GSF_dsh, PutOperator::next_uid, and process_dht_put_content().

Referenced by GSF_put_init_(), and schedule_next_put().

229 {
230  struct PutOperator *po = cls;
231 
232  po->dht_task = NULL;
233  po->dht_qe =
235  po->next_uid,
236  0,
237  UINT_MAX,
238  po->dht_put_type,
240  po);
241  if (NULL == po->dht_qe)
243 }
uint64_t next_uid
Next UID to request when iterating the database.
enum GNUNET_BLOCK_Type dht_put_type
Type we request from the datastore.
struct GNUNET_SCHEDULER_Task * dht_task
ID of task that collects blocks for DHT PUTs.
static void delay_dht_put_task(void *cls)
Task that is run periodically to obtain blocks for DHT PUTs.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1273
struct GNUNET_DATASTORE_QueueEntry * dht_qe
Request to datastore for DHT PUTs (or NULL).
Context for each zero-anonymity iterator.
struct GNUNET_DATASTORE_Handle * GSF_dsh
Our connection to the datastore.
struct GNUNET_DATASTORE_QueueEntry * GNUNET_DATASTORE_get_zero_anonymity(struct GNUNET_DATASTORE_Handle *h, uint64_t next_uid, unsigned int queue_priority, unsigned int max_queue_size, enum GNUNET_BLOCK_Type type, GNUNET_DATASTORE_DatumProcessor proc, void *proc_cls)
Get a single zero-anonymity value from the datastore.
static void process_dht_put_content(void *cls, const struct GNUNET_HashCode *key, size_t size, const void *data, enum GNUNET_BLOCK_Type type, uint32_t priority, uint32_t anonymity, uint32_t replication, struct GNUNET_TIME_Absolute expiration, uint64_t uid)
Store content in DHT.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ schedule_next_put()

static void schedule_next_put ( struct PutOperator po)
static

Calculate when to run the next PUT operation and schedule it.

Parameters
poput operator to schedule

Definition at line 112 of file gnunet-service-fs_put.c.

References PutOperator::dht_task, gather_dht_put_blocks(), GNUNET_DHT_DEFAULT_REPUBLISH_FREQUENCY, GNUNET_SCHEDULER_add_delayed(), GNUNET_TIME_relative_divide(), GNUNET_TIME_relative_min(), GNUNET_TIME_relative_multiply(), GNUNET_TIME_UNIT_MINUTES, MAX_DHT_PUT_FREQ, and PutOperator::zero_anonymity_count_estimate.

Referenced by delay_dht_put_blocks(), and delay_dht_put_task().

113 {
115 
116  if (po->zero_anonymity_count_estimate > 0)
117  {
118  delay =
122  }
123  else
124  {
125  /* if we have NO zero-anonymity content yet, wait 5 minutes for some to
126  * (hopefully) appear */
128  }
129  po->dht_task =
131 }
#define GNUNET_TIME_UNIT_MINUTES
One minute.
static void gather_dht_put_blocks(void *cls)
Task that is run periodically to obtain blocks for DHT PUTs.
struct GNUNET_SCHEDULER_Task * dht_task
ID of task that collects blocks for DHT PUTs.
#define GNUNET_DHT_DEFAULT_REPUBLISH_FREQUENCY
Default republication frequency for stored data in the DHT.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1246
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition: time.c:439
uint64_t zero_anonymity_count_estimate
How many entires with zero anonymity of our type do we currently estimate to have in the database...
struct GNUNET_TIME_Relative GNUNET_TIME_relative_min(struct GNUNET_TIME_Relative t1, struct GNUNET_TIME_Relative t2)
Return the minimum of two relative time values.
Definition: time.c:271
static struct GNUNET_TIME_Relative delay
When should dkg communication start?
#define MAX_DHT_PUT_FREQ
How often do we at most PUT content into the DHT?
struct GNUNET_TIME_Relative GNUNET_TIME_relative_divide(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Divide relative time by a given factor.
Definition: time.c:525
Time for relative time used by GNUnet, in microseconds.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ delay_dht_put_blocks()

static void delay_dht_put_blocks ( void *  cls)
static

Continuation called after DHT PUT operation has finished.

Parameters
clstype of blocks to gather

Definition at line 140 of file gnunet-service-fs_put.c.

References PutOperator::dht_put, and schedule_next_put().

Referenced by process_dht_put_content().

141 {
142  struct PutOperator *po = cls;
143 
144  po->dht_put = NULL;
145  schedule_next_put (po);
146 }
static void schedule_next_put(struct PutOperator *po)
Calculate when to run the next PUT operation and schedule it.
Context for each zero-anonymity iterator.
struct GNUNET_DHT_PutHandle * dht_put
Handle to PUT operation.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ delay_dht_put_task()

static void delay_dht_put_task ( void *  cls)
static

Task that is run periodically to obtain blocks for DHT PUTs.

Parameters
clstype of blocks to gather

Definition at line 155 of file gnunet-service-fs_put.c.

References PutOperator::dht_task, and schedule_next_put().

Referenced by gather_dht_put_blocks(), and process_dht_put_content().

156 {
157  struct PutOperator *po = cls;
158 
159  po->dht_task = NULL;
160  schedule_next_put (po);
161 }
struct GNUNET_SCHEDULER_Task * dht_task
ID of task that collects blocks for DHT PUTs.
static void schedule_next_put(struct PutOperator *po)
Calculate when to run the next PUT operation and schedule it.
Context for each zero-anonymity iterator.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_dht_put_content()

static void process_dht_put_content ( void *  cls,
const struct GNUNET_HashCode key,
size_t  size,
const void *  data,
enum GNUNET_BLOCK_Type  type,
uint32_t  priority,
uint32_t  anonymity,
uint32_t  replication,
struct GNUNET_TIME_Absolute  expiration,
uint64_t  uid 
)
static

Store content in DHT.

Parameters
clsclosure
keykey for the content
sizenumber of bytes in data
datacontent stored
typetype of the content
prioritypriority of the content
anonymityanonymity-level for the content
replicationreplication-level for the content
expirationexpiration time for the content
uidunique identifier for the datum; maybe 0 if no unique identifier is available

Definition at line 180 of file gnunet-service-fs_put.c.

References DEFAULT_PUT_REPLICATION, delay_dht_put_blocks(), delay_dht_put_task(), PutOperator::dht_put, PutOperator::dht_qe, PutOperator::dht_task, GNUNET_DHT_put(), GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_MAX, GNUNET_SCHEDULER_add_now(), GSF_dht, PutOperator::next_uid, PutOperator::result_count, and PutOperator::zero_anonymity_count_estimate.

Referenced by gather_dht_put_blocks().

190 {
191  struct PutOperator *po = cls;
192 
193  po->dht_qe = NULL;
194  if (key == NULL)
195  {
197  po->result_count = 0;
198  po->next_uid = 0;
200  return;
201  }
202  po->result_count++;
203  po->next_uid = uid + 1;
207  "Retrieved block `%s' of type %u for DHT PUT\n", GNUNET_h2s (key),
208  type);
210  key,
213  type,
214  size,
215  data,
216  expiration,
218  po);
219 }
uint64_t next_uid
Next UID to request when iterating the database.
#define DEFAULT_PUT_REPLICATION
How many replicas do we try to create per PUT?
struct GNUNET_DHT_Handle * GSF_dht
Handle for DHT operations.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
struct GNUNET_SCHEDULER_Task * dht_task
ID of task that collects blocks for DHT PUTs.
static void delay_dht_put_task(void *cls)
Task that is run periodically to obtain blocks for DHT PUTs.
#define GNUNET_MAX(a, b)
Definition: gnunet_common.h:85
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1273
struct GNUNET_DATASTORE_QueueEntry * dht_qe
Request to datastore for DHT PUTs (or NULL).
uint64_t result_count
Count of results received from the database.
Context for each zero-anonymity iterator.
uint64_t zero_anonymity_count_estimate
How many entires with zero anonymity of our type do we currently estimate to have in the database...
struct GNUNET_DHT_PutHandle * GNUNET_DHT_put(struct GNUNET_DHT_Handle *handle, const struct GNUNET_HashCode *key, uint32_t desired_replication_level, enum GNUNET_DHT_RouteOption options, enum GNUNET_BLOCK_Type type, size_t size, const void *data, struct GNUNET_TIME_Absolute exp, GNUNET_SCHEDULER_TaskCallback cont, void *cont_cls)
Perform a PUT operation storing data in the DHT.
Definition: dht_api.c:971
static unsigned int size
Size of the "table".
Definition: peer.c:67
struct GNUNET_DHT_PutHandle * dht_put
Handle to PUT operation.
#define GNUNET_log(kind,...)
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
static void delay_dht_put_blocks(void *cls)
Continuation called after DHT PUT operation has finished.
uint32_t data
The data value.
Each peer along the way should look at 'enc' (otherwise only the k-peers closest to the key should lo...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GSF_put_init_()

void GSF_put_init_ ( void  )

Setup the module.

Definition at line 250 of file gnunet-service-fs_put.c.

References PutOperator::dht_put_type, PutOperator::dht_task, gather_dht_put_blocks(), GNUNET_BLOCK_TYPE_ANY, and GNUNET_SCHEDULER_add_now().

Referenced by run().

251 {
252  unsigned int i;
253 
254  i = 0;
256  {
257  operators[i].dht_task =
259  i++;
260  }
261 }
Any type of block, used as a wildcard when searching.
enum GNUNET_BLOCK_Type dht_put_type
Type we request from the datastore.
static void gather_dht_put_blocks(void *cls)
Task that is run periodically to obtain blocks for DHT PUTs.
struct GNUNET_SCHEDULER_Task * dht_task
ID of task that collects blocks for DHT PUTs.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1273
static struct PutOperator operators[]
ANY-terminated list of our operators (one per type of block that we're putting into the DHT)...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GSF_put_done_()

void GSF_put_done_ ( void  )

Shutdown the module.

Definition at line 268 of file gnunet-service-fs_put.c.

References PutOperator::dht_put, PutOperator::dht_put_type, PutOperator::dht_qe, PutOperator::dht_task, GNUNET_BLOCK_TYPE_ANY, GNUNET_DATASTORE_cancel(), GNUNET_DHT_put_cancel(), and GNUNET_SCHEDULER_cancel().

Referenced by shutdown_task().

269 {
270  struct PutOperator *po;
271  unsigned int i;
272 
273  i = 0;
274  while ((po = &operators[i])->dht_put_type != GNUNET_BLOCK_TYPE_ANY)
275  {
276  if (NULL != po->dht_task)
277  {
279  po->dht_task = NULL;
280  }
281  if (NULL != po->dht_put)
282  {
284  po->dht_put = NULL;
285  }
286  if (NULL != po->dht_qe)
287  {
289  po->dht_qe = NULL;
290  }
291  i++;
292  }
293 }
void GNUNET_DHT_put_cancel(struct GNUNET_DHT_PutHandle *ph)
Cancels a DHT PUT operation.
Definition: dht_api.c:1040
Any type of block, used as a wildcard when searching.
enum GNUNET_BLOCK_Type dht_put_type
Type we request from the datastore.
struct GNUNET_SCHEDULER_Task * dht_task
ID of task that collects blocks for DHT PUTs.
struct GNUNET_DATASTORE_QueueEntry * dht_qe
Request to datastore for DHT PUTs (or NULL).
Context for each zero-anonymity iterator.
struct GNUNET_DHT_PutHandle * dht_put
Handle to PUT operation.
static struct PutOperator operators[]
ANY-terminated list of our operators (one per type of block that we're putting into the DHT)...
void GNUNET_DATASTORE_cancel(struct GNUNET_DATASTORE_QueueEntry *qe)
Cancel a datastore operation.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:965
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ operators

struct PutOperator operators[]
static
Initial value:
= {
{NULL, GNUNET_BLOCK_TYPE_FS_UBLOCK, 0, 0, 0},
{NULL, GNUNET_BLOCK_TYPE_ANY, 0, 0, 0}
}
Any type of block, used as a wildcard when searching.
Type of a block representing any type of search result (universal).

ANY-terminated list of our operators (one per type of block that we're putting into the DHT).

Definition at line 90 of file gnunet-service-fs_put.c.