aboutsummaryrefslogtreecommitdiff
path: root/src/cadet/gnunet-service-cadet_dht.c
diff options
context:
space:
mode:
authorBart Polot <bart.polot+voyager@gmail.com>2016-11-09 20:13:19 +0100
committerBart Polot <bart.polot+voyager@gmail.com>2016-11-09 21:11:37 +0100
commitbee2b8177d652c12359ef9a0f80385833696f303 (patch)
treebbc72aba76635ba2fdcb810ff761d9e380337060 /src/cadet/gnunet-service-cadet_dht.c
parente0403a96df49997398ce8d056e08e83684896998 (diff)
downloadgnunet-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.c51
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;
96static struct GNUNET_SCHEDULER_Task * announce_id_task; 96static struct GNUNET_SCHEDULER_Task * announce_id_task;
97 97
98/** 98/**
99 * Delay for the next ID announce.
100 */
101static struct GNUNET_TIME_Relative announce_delay;
102
103/**
99 * GET requests to stop on shutdown. 104 * GET requests to stop on shutdown.
100 */ 105 */
101static struct GNUNET_CONTAINER_MultiHashMap32 *get_requests; 106static 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}