GNUnet 0.21.1
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"
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
90static 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
101static void
102gather_dht_put_blocks (void *cls);
103
104
110static void
112{
113 struct GNUNET_TIME_Relative delay;
114
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
138static void
140{
141 struct PutOperator *po = cls;
142
143 po->dht_put = NULL;
145}
146
147
153static void
155{
156 struct PutOperator *po = cls;
157
158 po->dht_task = NULL;
160}
161
162
178static void
180 const struct GNUNET_HashCode *key,
181 size_t size,
182 const void *data,
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,
217 po);
218}
219
220
221static 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
243void
245{
246 unsigned int i;
247
248 i = 0;
250 {
253 i++;
254 }
255}
256
257
261void
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 unsigned int replication
Desired replication level.
static char * data
The data to insert into the dht.
struct GNUNET_HashCode key
The key used in the DHT.
static struct GNUNET_TIME_Relative expiration
User supplied expiration value.
static unsigned int anonymity
static uint32_t type
Type string converted to DNS type value.
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
void GNUNET_DATASTORE_cancel(struct GNUNET_DATASTORE_QueueEntry *qe)
Cancel a datastore operation.
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_DHT_put_cancel(struct GNUNET_DHT_PutHandle *ph)
Cancels a DHT PUT operation.
Definition: dht_api.c:1146
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:1088
#define GNUNET_DHT_DEFAULT_REPUBLISH_FREQUENCY
Default republication frequency for stored data in the DHT.
@ 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
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:981
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:1305
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:1278
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:343
#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:484
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:550
static unsigned int size
Size of the "table".
Definition: peer.c:68
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).
Entry in our priority queue.
Handle to a PUT request.
Definition: dht_api.c:43
A 512-bit hashcode.
Entry in list of pending tasks.
Definition: scheduler.c:136
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.