diff options
author | Christian Grothoff <christian@grothoff.org> | 2012-05-09 20:03:45 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2012-05-09 20:03:45 +0000 |
commit | 764cc859e7be44bf79a5a66e1aa6043a1c350b98 (patch) | |
tree | fe63cf91f49995e51a5b0f5d928e40baa3bf3a33 /src/dht | |
parent | b4e0339e9687a8315bc078092ff017283d5de345 (diff) | |
download | gnunet-764cc859e7be44bf79a5a66e1aa6043a1c350b98.tar.gz gnunet-764cc859e7be44bf79a5a66e1aa6043a1c350b98.zip |
-fix #2319
Diffstat (limited to 'src/dht')
-rw-r--r-- | src/dht/gnunet-service-dht_routing.c | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/src/dht/gnunet-service-dht_routing.c b/src/dht/gnunet-service-dht_routing.c index 2600b4460..013d8562f 100644 --- a/src/dht/gnunet-service-dht_routing.c +++ b/src/dht/gnunet-service-dht_routing.c | |||
@@ -297,6 +297,33 @@ GDS_ROUTING_process (enum GNUNET_BLOCK_Type type, | |||
297 | 297 | ||
298 | 298 | ||
299 | /** | 299 | /** |
300 | * Remove the oldest entry from the DHT routing table. Must only | ||
301 | * be called if it is known that there is at least one entry | ||
302 | * in the heap and hashmap. | ||
303 | */ | ||
304 | static void | ||
305 | expire_oldest_entry () | ||
306 | { | ||
307 | struct RecentRequest *recent_req; | ||
308 | |||
309 | GNUNET_STATISTICS_update (GDS_stats, | ||
310 | gettext_noop | ||
311 | ("# Entries removed from routing table"), 1, | ||
312 | GNUNET_NO); | ||
313 | recent_req = GNUNET_CONTAINER_heap_peek (recent_heap); | ||
314 | GNUNET_assert (recent_req != NULL); | ||
315 | GNUNET_CONTAINER_heap_remove_node (recent_req->heap_node); | ||
316 | GNUNET_CONTAINER_bloomfilter_free (recent_req->reply_bf); | ||
317 | GNUNET_assert (GNUNET_YES == | ||
318 | GNUNET_CONTAINER_multihashmap_remove (recent_map, | ||
319 | &recent_req->key, | ||
320 | recent_req)); | ||
321 | GNUNET_free (recent_req); | ||
322 | } | ||
323 | |||
324 | |||
325 | |||
326 | /** | ||
300 | * Add a new entry to our routing table. | 327 | * Add a new entry to our routing table. |
301 | * | 328 | * |
302 | * @param sender peer that originated the request | 329 | * @param sender peer that originated the request |
@@ -320,18 +347,7 @@ GDS_ROUTING_add (const struct GNUNET_PeerIdentity *sender, | |||
320 | struct RecentRequest *recent_req; | 347 | struct RecentRequest *recent_req; |
321 | 348 | ||
322 | while (GNUNET_CONTAINER_heap_get_size (recent_heap) >= DHT_MAX_RECENT) | 349 | while (GNUNET_CONTAINER_heap_get_size (recent_heap) >= DHT_MAX_RECENT) |
323 | { | 350 | expire_oldest_entry (); |
324 | GNUNET_STATISTICS_update (GDS_stats, | ||
325 | gettext_noop | ||
326 | ("# Entries removed from routing table"), 1, | ||
327 | GNUNET_NO); | ||
328 | recent_req = GNUNET_CONTAINER_heap_peek (recent_heap); | ||
329 | GNUNET_assert (recent_req != NULL); | ||
330 | GNUNET_CONTAINER_heap_remove_node (recent_req->heap_node); | ||
331 | GNUNET_CONTAINER_bloomfilter_free (recent_req->reply_bf); | ||
332 | GNUNET_free (recent_req); | ||
333 | } | ||
334 | |||
335 | GNUNET_STATISTICS_update (GDS_stats, | 351 | GNUNET_STATISTICS_update (GDS_stats, |
336 | gettext_noop ("# Entries added to routing table"), | 352 | gettext_noop ("# Entries added to routing table"), |
337 | 1, GNUNET_NO); | 353 | 1, GNUNET_NO); |
@@ -371,23 +387,12 @@ GDS_ROUTING_init () | |||
371 | void | 387 | void |
372 | GDS_ROUTING_done () | 388 | GDS_ROUTING_done () |
373 | { | 389 | { |
374 | struct RecentRequest *recent_req; | ||
375 | |||
376 | while (GNUNET_CONTAINER_heap_get_size (recent_heap) > 0) | 390 | while (GNUNET_CONTAINER_heap_get_size (recent_heap) > 0) |
377 | { | 391 | expire_oldest_entry (); |
378 | GNUNET_STATISTICS_update (GDS_stats, | ||
379 | gettext_noop | ||
380 | ("# Entries removed from routing table"), 1, | ||
381 | GNUNET_NO); | ||
382 | recent_req = GNUNET_CONTAINER_heap_peek (recent_heap); | ||
383 | GNUNET_assert (recent_req != NULL); | ||
384 | GNUNET_CONTAINER_heap_remove_node (recent_req->heap_node); | ||
385 | GNUNET_CONTAINER_bloomfilter_free (recent_req->reply_bf); | ||
386 | GNUNET_free (recent_req); | ||
387 | } | ||
388 | GNUNET_assert (0 == GNUNET_CONTAINER_heap_get_size (recent_heap)); | 392 | GNUNET_assert (0 == GNUNET_CONTAINER_heap_get_size (recent_heap)); |
389 | GNUNET_CONTAINER_heap_destroy (recent_heap); | 393 | GNUNET_CONTAINER_heap_destroy (recent_heap); |
390 | recent_heap = NULL; | 394 | recent_heap = NULL; |
395 | GNUNET_assert (0 == GNUNET_CONTAINER_multihashmap_size (recent_map)); | ||
391 | GNUNET_CONTAINER_multihashmap_destroy (recent_map); | 396 | GNUNET_CONTAINER_multihashmap_destroy (recent_map); |
392 | recent_map = NULL; | 397 | recent_map = NULL; |
393 | } | 398 | } |