diff options
author | Bart Polot <bart.polot+voyager@gmail.com> | 2016-11-09 20:13:19 +0100 |
---|---|---|
committer | Bart Polot <bart.polot+voyager@gmail.com> | 2016-11-09 21:11:37 +0100 |
commit | bee2b8177d652c12359ef9a0f80385833696f303 (patch) | |
tree | bbc72aba76635ba2fdcb810ff761d9e380337060 /src/cadet/gnunet-service-cadet_dht.c | |
parent | e0403a96df49997398ce8d056e08e83684896998 (diff) | |
download | gnunet-bee2b8177d652c12359ef9a0f80385833696f303.tar.gz gnunet-bee2b8177d652c12359ef9a0f80385833696f303.zip |
- fix handling of HELLO with 0 expiration time
Diffstat (limited to 'src/cadet/gnunet-service-cadet_dht.c')
-rw-r--r-- | src/cadet/gnunet-service-cadet_dht.c | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/src/cadet/gnunet-service-cadet_dht.c b/src/cadet/gnunet-service-cadet_dht.c index 55dd10d33..9b11ebf18 100644 --- a/src/cadet/gnunet-service-cadet_dht.c +++ b/src/cadet/gnunet-service-cadet_dht.c | |||
@@ -96,6 +96,11 @@ static unsigned long long dht_replication_level; | |||
96 | static struct GNUNET_SCHEDULER_Task * announce_id_task; | 96 | static struct GNUNET_SCHEDULER_Task * announce_id_task; |
97 | 97 | ||
98 | /** | 98 | /** |
99 | * Delay for the next ID announce. | ||
100 | */ | ||
101 | static struct GNUNET_TIME_Relative announce_delay; | ||
102 | |||
103 | /** | ||
99 | * GET requests to stop on shutdown. | 104 | * GET requests to stop on shutdown. |
100 | */ | 105 | */ |
101 | static struct GNUNET_CONTAINER_MultiHashMap32 *get_requests; | 106 | static struct GNUNET_CONTAINER_MultiHashMap32 *get_requests; |
@@ -214,26 +219,27 @@ announce_id (void *cls) | |||
214 | const struct GNUNET_HELLO_Message *hello; | 219 | const struct GNUNET_HELLO_Message *hello; |
215 | size_t size; | 220 | size_t size; |
216 | struct GNUNET_TIME_Absolute expiration; | 221 | struct GNUNET_TIME_Absolute expiration; |
222 | struct GNUNET_TIME_Relative next_put; | ||
217 | 223 | ||
218 | announce_id_task = NULL; | 224 | announce_id_task = NULL; |
219 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Announce ID\n"); | 225 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Announce ID\n"); |
220 | /* TODO | ||
221 | * - Set data expiration in function of X | ||
222 | * - Adapt X to churn | ||
223 | */ | ||
224 | hello = GCH_get_mine (); | 226 | hello = GCH_get_mine (); |
225 | if (NULL == hello || (size = GNUNET_HELLO_size (hello)) == 0) | 227 | size = NULL != hello ? GNUNET_HELLO_size (hello) : 0; |
228 | if (NULL == hello || 0 == size) | ||
226 | { | 229 | { |
227 | /* Peerinfo gave us no hello yet, try again in a second. */ | 230 | /* Peerinfo gave us no hello yet, try again soon. */ |
228 | announce_id_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, | 231 | LOG (GNUNET_ERROR_TYPE_INFO, " no hello, waiting!\n"); |
229 | &announce_id, cls); | ||
230 | LOG (GNUNET_ERROR_TYPE_DEBUG, " no hello, waiting!\n"); | ||
231 | GNUNET_STATISTICS_update (stats, "# DHT announce skipped (no hello)", | 232 | GNUNET_STATISTICS_update (stats, "# DHT announce skipped (no hello)", |
232 | 1, GNUNET_NO); | 233 | 1, GNUNET_NO); |
233 | 234 | expiration = GNUNET_TIME_absolute_add (GNUNET_TIME_absolute_get (), | |
234 | return; | 235 | announce_delay); |
236 | announce_delay = GNUNET_TIME_STD_BACKOFF (announce_delay); | ||
237 | } | ||
238 | else | ||
239 | { | ||
240 | expiration = GNUNET_HELLO_get_last_expiration (hello); | ||
241 | announce_delay = GNUNET_TIME_UNIT_SECONDS; | ||
235 | } | 242 | } |
236 | expiration = GNUNET_HELLO_get_last_expiration (hello); | ||
237 | 243 | ||
238 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Hello %p size: %u\n", hello, size); | 244 | LOG (GNUNET_ERROR_TYPE_DEBUG, "Hello %p size: %u\n", hello, size); |
239 | GNUNET_STATISTICS_update (stats, "# DHT announce", | 245 | GNUNET_STATISTICS_update (stats, "# DHT announce", |
@@ -251,8 +257,13 @@ announce_id (void *cls) | |||
251 | expiration, /* Data expiration */ | 257 | expiration, /* Data expiration */ |
252 | NULL, /* Continuation */ | 258 | NULL, /* Continuation */ |
253 | NULL); /* Continuation closure */ | 259 | NULL); /* Continuation closure */ |
254 | announce_id_task = | 260 | |
255 | GNUNET_SCHEDULER_add_delayed (id_announce_time, &announce_id, cls); | 261 | /* Call again in id_announce_time, unless HELLO expires first, |
262 | * but wait at least 1s. */ | ||
263 | next_put = GNUNET_TIME_absolute_get_remaining (expiration); | ||
264 | next_put = GNUNET_TIME_relative_min (next_put, id_announce_time); | ||
265 | next_put = GNUNET_TIME_relative_max (next_put, GNUNET_TIME_UNIT_SECONDS); | ||
266 | announce_id_task = GNUNET_SCHEDULER_add_delayed (next_put, &announce_id, cls); | ||
256 | } | 267 | } |
257 | 268 | ||
258 | /** | 269 | /** |
@@ -291,11 +302,12 @@ GCD_init (const struct GNUNET_CONFIGURATION_Handle *c) | |||
291 | { | 302 | { |
292 | LOG (GNUNET_ERROR_TYPE_DEBUG, "init\n"); | 303 | LOG (GNUNET_ERROR_TYPE_DEBUG, "init\n"); |
293 | if (GNUNET_OK != | 304 | if (GNUNET_OK != |
294 | GNUNET_CONFIGURATION_get_value_number (c, "CADET", "DHT_REPLICATION_LEVEL", | 305 | GNUNET_CONFIGURATION_get_value_number (c, "CADET", |
306 | "DHT_REPLICATION_LEVEL", | ||
295 | &dht_replication_level)) | 307 | &dht_replication_level)) |
296 | { | 308 | { |
297 | GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING, | 309 | GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_WARNING, "CADET", |
298 | "CADET", "DHT_REPLICATION_LEVEL", "USING DEFAULT"); | 310 | "DHT_REPLICATION_LEVEL", "USING DEFAULT"); |
299 | dht_replication_level = 3; | 311 | dht_replication_level = 3; |
300 | } | 312 | } |
301 | 313 | ||
@@ -303,8 +315,8 @@ GCD_init (const struct GNUNET_CONFIGURATION_Handle *c) | |||
303 | GNUNET_CONFIGURATION_get_value_time (c, "CADET", "ID_ANNOUNCE_TIME", | 315 | GNUNET_CONFIGURATION_get_value_time (c, "CADET", "ID_ANNOUNCE_TIME", |
304 | &id_announce_time)) | 316 | &id_announce_time)) |
305 | { | 317 | { |
306 | GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR, | 318 | GNUNET_log_config_invalid (GNUNET_ERROR_TYPE_ERROR, "CADET", |
307 | "CADET", "ID_ANNOUNCE_TIME", "MISSING"); | 319 | "ID_ANNOUNCE_TIME", "MISSING"); |
308 | GNUNET_SCHEDULER_shutdown (); | 320 | GNUNET_SCHEDULER_shutdown (); |
309 | return; | 321 | return; |
310 | } | 322 | } |
@@ -315,6 +327,7 @@ GCD_init (const struct GNUNET_CONFIGURATION_Handle *c) | |||
315 | GNUNET_break (0); | 327 | GNUNET_break (0); |
316 | } | 328 | } |
317 | 329 | ||
330 | announce_delay = GNUNET_TIME_UNIT_SECONDS; | ||
318 | announce_id_task = GNUNET_SCHEDULER_add_now (&announce_id, NULL); | 331 | announce_id_task = GNUNET_SCHEDULER_add_now (&announce_id, NULL); |
319 | get_requests = GNUNET_CONTAINER_multihashmap32_create (32); | 332 | get_requests = GNUNET_CONTAINER_multihashmap32_create (32); |
320 | } | 333 | } |