GNUnet  0.17.5
gnunet-service-fs_put.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2011 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  GNUnet is distributed in the hope that it will be useful, but
11  WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
26 #include "platform.h"
27 #include "gnunet-service-fs.h"
28 #include "gnunet-service-fs_put.h"
29 
30 
34 #define MAX_DHT_PUT_FREQ GNUNET_TIME_relative_multiply ( \
35  GNUNET_TIME_UNIT_SECONDS, 5)
36 
40 #define DEFAULT_PUT_REPLICATION 5
41 
42 
47 {
52 
57 
62 
67 
73 
77  uint64_t result_count;
78 
82  uint64_t next_uid;
83 };
84 
85 
90 static struct PutOperator operators[] = {
91  { NULL, GNUNET_BLOCK_TYPE_FS_UBLOCK, 0, 0, 0 },
92  { NULL, GNUNET_BLOCK_TYPE_ANY, 0, 0, 0 }
93 };
94 
95 
101 static void
102 gather_dht_put_blocks (void *cls);
103 
104 
110 static void
112 {
114 
115  if (po->zero_anonymity_count_estimate > 0)
116  {
117  delay =
121  }
122  else
123  {
124  /* if we have NO zero-anonymity content yet, wait 5 minutes for some to
125  * (hopefully) appear */
127  }
128  po->dht_task =
130 }
131 
132 
138 static void
140 {
141  struct PutOperator *po = cls;
142 
143  po->dht_put = NULL;
144  schedule_next_put (po);
145 }
146 
147 
153 static void
155 {
156  struct PutOperator *po = cls;
157 
158  po->dht_task = NULL;
159  schedule_next_put (po);
160 }
161 
162 
178 static void
180  const struct GNUNET_HashCode *key,
181  size_t size,
182  const void *data,
183  enum GNUNET_BLOCK_Type type,
184  uint32_t priority,
185  uint32_t anonymity,
186  uint32_t replication,
188  uint64_t uid)
189 {
190  struct PutOperator *po = cls;
191 
192  po->dht_qe = NULL;
193  if (key == NULL)
194  {
196  po->result_count = 0;
197  po->next_uid = 0;
199  return;
200  }
201  po->result_count++;
202  po->next_uid = uid + 1;
206  "Retrieved block `%s' of type %u for DHT PUT\n", GNUNET_h2s (key),
207  type);
209  key,
212  type,
213  size,
214  data,
215  expiration,
217  po);
218 }
219 
220 
221 static void
223 {
224  struct PutOperator *po = cls;
225 
226  po->dht_task = NULL;
227  po->dht_qe =
229  po->next_uid,
230  0,
231  UINT_MAX,
232  po->dht_put_type,
234  po);
235  if (NULL == po->dht_qe)
237 }
238 
239 
243 void
245 {
246  unsigned int i;
247 
248  i = 0;
250  {
251  operators[i].dht_task =
253  i++;
254  }
255 }
256 
257 
261 void
263 {
264  struct PutOperator *po;
265  unsigned int i;
266 
267  i = 0;
268  while ((po = &operators[i])->dht_put_type != GNUNET_BLOCK_TYPE_ANY)
269  {
270  if (NULL != po->dht_task)
271  {
273  po->dht_task = NULL;
274  }
275  if (NULL != po->dht_put)
276  {
278  po->dht_put = NULL;
279  }
280  if (NULL != po->dht_qe)
281  {
283  po->dht_qe = NULL;
284  }
285  i++;
286  }
287 }
288 
289 
290 /* end of gnunet-service-fs_put.c */
static char * expiration
Credential TTL.
Definition: gnunet-abd.c:96
static unsigned int replication
struct GNUNET_HashCode key
The key used in the DHT.
static unsigned int anonymity
uint32_t data
The data value.
static struct GNUNET_TIME_Relative delay
When should dkg communication start?
struct GNUNET_DHT_Handle * GSF_dht
Handle for DHT operations.
struct GNUNET_DATASTORE_Handle * GSF_dsh
Our connection to the datastore.
shared data structures of gnunet-service-fs.c
static void gather_dht_put_blocks(void *cls)
Task that is run periodically to obtain blocks for DHT PUTs.
#define MAX_DHT_PUT_FREQ
How often do we at most PUT content into the DHT?
static struct PutOperator operators[]
ANY-terminated list of our operators (one per type of block that we're putting into the DHT).
static void delay_dht_put_task(void *cls)
Task that is run periodically to obtain blocks for DHT PUTs.
void GSF_put_init_()
Setup the module.
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.
void GSF_put_done_()
Shutdown the module.
static void delay_dht_put_blocks(void *cls)
Continuation called after DHT PUT operation has finished.
#define DEFAULT_PUT_REPLICATION
How many replicas do we try to create per PUT?
static void schedule_next_put(struct PutOperator *po)
Calculate when to run the next PUT operation and schedule it.
support for putting content into the DHT
GNUNET_BLOCK_Type
WARNING: This header is generated! In order to add DHT block types, you must register them in GANA,...
@ GNUNET_BLOCK_TYPE_ANY
Identifier for any block.
@ GNUNET_BLOCK_TYPE_FS_UBLOCK
Type of a block representing any type of search result (universal).
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.
void GNUNET_DATASTORE_cancel(struct GNUNET_DATASTORE_QueueEntry *qe)
Cancel a datastore operation.
void GNUNET_DHT_put_cancel(struct GNUNET_DHT_PutHandle *ph)
Cancels a DHT PUT operation.
Definition: dht_api.c:1148
#define GNUNET_DHT_DEFAULT_REPUBLISH_FREQUENCY
Default republication frequency for stored data in the DHT.
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:1090
@ GNUNET_DHT_RO_DEMULTIPLEX_EVERYWHERE
Each peer along the way should process the request (otherwise only peers locally closest to the key w...
#define GNUNET_log(kind,...)
#define GNUNET_MAX(a, b)
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
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:1281
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:957
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:1254
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:342
#define GNUNET_TIME_UNIT_MINUTES
One minute.
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:483
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:549
static unsigned int size
Size of the "table".
Definition: peer.c:67
Entry in our priority queue.
Handle to a PUT request.
Definition: dht_api.c:45
A 512-bit hashcode.
Entry in list of pending tasks.
Definition: scheduler.c:135
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.
Context for each zero-anonymity iterator.
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.
uint64_t zero_anonymity_count_estimate
How many entries with zero anonymity of our type do we currently estimate to have in the database?
uint64_t next_uid
Next UID to request when iterating the database.
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.
struct GNUNET_DHT_PutHandle * dht_put
Handle to PUT operation.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model