diff options
Diffstat (limited to 'src/fs/gnunet-service-fs_pe.c')
-rw-r--r-- | src/fs/gnunet-service-fs_pe.c | 90 |
1 files changed, 42 insertions, 48 deletions
diff --git a/src/fs/gnunet-service-fs_pe.c b/src/fs/gnunet-service-fs_pe.c index 088a3dc11..41dd61a64 100644 --- a/src/fs/gnunet-service-fs_pe.c +++ b/src/fs/gnunet-service-fs_pe.c | |||
@@ -263,22 +263,25 @@ plan (struct PeerPlan *pp, struct GSF_RequestPlan *rp) | |||
263 | if (rp->transmission_counter < 8) | 263 | if (rp->transmission_counter < 8) |
264 | delay = | 264 | delay = |
265 | GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, | 265 | GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, |
266 | rp->transmission_counter); | 266 | rp->transmission_counter); |
267 | else if (rp->transmission_counter < 32) | 267 | else if (rp->transmission_counter < 32) |
268 | delay = | 268 | delay = |
269 | GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, | 269 | GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, |
270 | 8 + (1LL << (rp->transmission_counter - 8))); | 270 | 8 + |
271 | (1LL << (rp->transmission_counter - 8))); | ||
271 | else | 272 | else |
272 | delay = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, | 273 | delay = |
273 | 8 + (1LL << 24)); | 274 | GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, |
274 | delay.rel_value = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, | 275 | 8 + (1LL << 24)); |
275 | delay.rel_value + 1); | 276 | delay.rel_value = |
277 | GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, | ||
278 | delay.rel_value + 1); | ||
276 | if (rp->transmission_counter != 0) | 279 | if (rp->transmission_counter != 0) |
277 | delay.rel_value += TTL_DECREMENT; | 280 | delay.rel_value += TTL_DECREMENT; |
278 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 281 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
279 | "Considering (re)transmission number %u in %llu ms\n", | 282 | "Considering (re)transmission number %u in %llu ms\n", |
280 | (unsigned int) rp->transmission_counter, | 283 | (unsigned int) rp->transmission_counter, |
281 | (unsigned long long) delay.rel_value); | 284 | (unsigned long long) delay.rel_value); |
282 | rp->earliest_transmission = GNUNET_TIME_relative_to_absolute (delay); | 285 | rp->earliest_transmission = GNUNET_TIME_relative_to_absolute (delay); |
283 | #if DEBUG_FS | 286 | #if DEBUG_FS |
284 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 287 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -295,9 +298,9 @@ plan (struct PeerPlan *pp, struct GSF_RequestPlan *rp) | |||
295 | GNUNET_CONTAINER_heap_insert (pp->delay_heap, rp, | 298 | GNUNET_CONTAINER_heap_insert (pp->delay_heap, rp, |
296 | rp->earliest_transmission.abs_value); | 299 | rp->earliest_transmission.abs_value); |
297 | GNUNET_assert (GNUNET_YES == | 300 | GNUNET_assert (GNUNET_YES == |
298 | GNUNET_CONTAINER_multihashmap_contains_value (pp->plan_map, | 301 | GNUNET_CONTAINER_multihashmap_contains_value (pp->plan_map, |
299 | get_rp_key (rp), | 302 | get_rp_key (rp), |
300 | rp)); | 303 | rp)); |
301 | if (GNUNET_SCHEDULER_NO_TASK != pp->task) | 304 | if (GNUNET_SCHEDULER_NO_TASK != pp->task) |
302 | GNUNET_SCHEDULER_cancel (pp->task); | 305 | GNUNET_SCHEDULER_cancel (pp->task); |
303 | pp->task = GNUNET_SCHEDULER_add_now (&schedule_peer_transmission, pp); | 306 | pp->task = GNUNET_SCHEDULER_add_now (&schedule_peer_transmission, pp); |
@@ -351,8 +354,9 @@ transmit_message_callback (void *cls, size_t buf_size, void *buf) | |||
351 | /* failed, try again... */ | 354 | /* failed, try again... */ |
352 | pp->task = GNUNET_SCHEDULER_add_now (&schedule_peer_transmission, pp); | 355 | pp->task = GNUNET_SCHEDULER_add_now (&schedule_peer_transmission, pp); |
353 | GNUNET_STATISTICS_update (GSF_stats, | 356 | GNUNET_STATISTICS_update (GSF_stats, |
354 | gettext_noop ("# transmission failed (core has no bandwidth)"), 1, | 357 | gettext_noop |
355 | GNUNET_NO); | 358 | ("# transmission failed (core has no bandwidth)"), |
359 | 1, GNUNET_NO); | ||
356 | return 0; | 360 | return 0; |
357 | } | 361 | } |
358 | rp = GNUNET_CONTAINER_heap_peek (pp->priority_heap); | 362 | rp = GNUNET_CONTAINER_heap_peek (pp->priority_heap); |
@@ -433,22 +437,17 @@ schedule_peer_transmission (void *cls, | |||
433 | #if DEBUG_FS | 437 | #if DEBUG_FS |
434 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 438 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
435 | "Sleeping for %llu ms before retrying requests on plan %p.\n", | 439 | "Sleeping for %llu ms before retrying requests on plan %p.\n", |
436 | (unsigned long long) | 440 | (unsigned long long) delay.rel_value, pp); |
437 | delay.rel_value, pp); | ||
438 | #endif | 441 | #endif |
439 | GNUNET_STATISTICS_set (GSF_stats, | 442 | GNUNET_STATISTICS_set (GSF_stats, gettext_noop ("# delay heap timeout"), |
440 | gettext_noop ("# delay heap timeout"), | 443 | delay.rel_value, GNUNET_NO); |
441 | delay.rel_value, | 444 | |
442 | GNUNET_NO); | ||
443 | |||
444 | pp->task = | 445 | pp->task = |
445 | GNUNET_SCHEDULER_add_delayed (delay, | 446 | GNUNET_SCHEDULER_add_delayed (delay, &schedule_peer_transmission, pp); |
446 | &schedule_peer_transmission, pp); | ||
447 | return; | 447 | return; |
448 | } | 448 | } |
449 | GNUNET_STATISTICS_update (GSF_stats, | 449 | GNUNET_STATISTICS_update (GSF_stats, gettext_noop ("# query plans executed"), |
450 | gettext_noop ("# query plans executed"), 1, | 450 | 1, GNUNET_NO); |
451 | GNUNET_NO); | ||
452 | /* process from priority heap */ | 451 | /* process from priority heap */ |
453 | rp = GNUNET_CONTAINER_heap_peek (pp->priority_heap); | 452 | rp = GNUNET_CONTAINER_heap_peek (pp->priority_heap); |
454 | #if DEBUG_FS > 1 | 453 | #if DEBUG_FS > 1 |
@@ -488,9 +487,7 @@ struct MergeContext | |||
488 | * GNUNET_NO if not (merge success) | 487 | * GNUNET_NO if not (merge success) |
489 | */ | 488 | */ |
490 | static int | 489 | static int |
491 | merge_pr (void *cls, | 490 | merge_pr (void *cls, const GNUNET_HashCode * query, void *element) |
492 | const GNUNET_HashCode *query, | ||
493 | void *element) | ||
494 | { | 491 | { |
495 | struct MergeContext *mpr = cls; | 492 | struct MergeContext *mpr = cls; |
496 | struct GSF_RequestPlan *rp = element; | 493 | struct GSF_RequestPlan *rp = element; |
@@ -550,8 +547,7 @@ GSF_plan_add_ (struct GSF_ConnectedPeer *cp, struct GSF_PendingRequest *pr) | |||
550 | if (NULL == pp) | 547 | if (NULL == pp) |
551 | { | 548 | { |
552 | pp = GNUNET_malloc (sizeof (struct PeerPlan)); | 549 | pp = GNUNET_malloc (sizeof (struct PeerPlan)); |
553 | pp->plan_map = | 550 | pp->plan_map = GNUNET_CONTAINER_multihashmap_create (128); |
554 | GNUNET_CONTAINER_multihashmap_create (128); | ||
555 | pp->priority_heap = | 551 | pp->priority_heap = |
556 | GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MAX); | 552 | GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MAX); |
557 | pp->delay_heap = | 553 | pp->delay_heap = |
@@ -563,13 +559,13 @@ GSF_plan_add_ (struct GSF_ConnectedPeer *cp, struct GSF_PendingRequest *pr) | |||
563 | mpc.merged = GNUNET_NO; | 559 | mpc.merged = GNUNET_NO; |
564 | mpc.pr = pr; | 560 | mpc.pr = pr; |
565 | GNUNET_CONTAINER_multihashmap_get_multiple (pp->plan_map, | 561 | GNUNET_CONTAINER_multihashmap_get_multiple (pp->plan_map, |
566 | &GSF_pending_request_get_data_ (pr)->query, | 562 | &GSF_pending_request_get_data_ |
567 | &merge_pr, &mpc); | 563 | (pr)->query, &merge_pr, &mpc); |
568 | if (mpc.merged != GNUNET_NO) | 564 | if (mpc.merged != GNUNET_NO) |
569 | return; | 565 | return; |
570 | GNUNET_CONTAINER_multihashmap_get_multiple (pp->plan_map, | 566 | GNUNET_CONTAINER_multihashmap_get_multiple (pp->plan_map, |
571 | &GSF_pending_request_get_data_ (pr)->query, | 567 | &GSF_pending_request_get_data_ |
572 | &merge_pr, &mpc); | 568 | (pr)->query, &merge_pr, &mpc); |
573 | if (mpc.merged != GNUNET_NO) | 569 | if (mpc.merged != GNUNET_NO) |
574 | return; | 570 | return; |
575 | plan_count++; | 571 | plan_count++; |
@@ -592,10 +588,9 @@ GSF_plan_add_ (struct GSF_ConnectedPeer *cp, struct GSF_PendingRequest *pr) | |||
592 | GNUNET_CONTAINER_DLL_insert (rp->prl_head, rp->prl_tail, prl); | 588 | GNUNET_CONTAINER_DLL_insert (rp->prl_head, rp->prl_tail, prl); |
593 | rp->pp = pp; | 589 | rp->pp = pp; |
594 | GNUNET_assert (GNUNET_YES == | 590 | GNUNET_assert (GNUNET_YES == |
595 | GNUNET_CONTAINER_multihashmap_put (pp->plan_map, | 591 | GNUNET_CONTAINER_multihashmap_put (pp->plan_map, |
596 | get_rp_key (rp), | 592 | get_rp_key (rp), rp, |
597 | rp, | 593 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); |
598 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); | ||
599 | plan (pp, rp); | 594 | plan (pp, rp); |
600 | } | 595 | } |
601 | 596 | ||
@@ -632,9 +627,8 @@ GSF_plan_notify_peer_disconnect_ (const struct GSF_ConnectedPeer *cp) | |||
632 | while (NULL != (rp = GNUNET_CONTAINER_heap_remove_root (pp->priority_heap))) | 627 | while (NULL != (rp = GNUNET_CONTAINER_heap_remove_root (pp->priority_heap))) |
633 | { | 628 | { |
634 | GNUNET_break (GNUNET_YES == | 629 | GNUNET_break (GNUNET_YES == |
635 | GNUNET_CONTAINER_multihashmap_remove (pp->plan_map, | 630 | GNUNET_CONTAINER_multihashmap_remove (pp->plan_map, |
636 | get_rp_key (rp), | 631 | get_rp_key (rp), rp)); |
637 | rp)); | ||
638 | while (NULL != (prl = rp->prl_head)) | 632 | while (NULL != (prl = rp->prl_head)) |
639 | { | 633 | { |
640 | GNUNET_CONTAINER_DLL_remove (rp->prl_head, rp->prl_tail, prl); | 634 | GNUNET_CONTAINER_DLL_remove (rp->prl_head, rp->prl_tail, prl); |
@@ -649,9 +643,8 @@ GSF_plan_notify_peer_disconnect_ (const struct GSF_ConnectedPeer *cp) | |||
649 | while (NULL != (rp = GNUNET_CONTAINER_heap_remove_root (pp->delay_heap))) | 643 | while (NULL != (rp = GNUNET_CONTAINER_heap_remove_root (pp->delay_heap))) |
650 | { | 644 | { |
651 | GNUNET_break (GNUNET_YES == | 645 | GNUNET_break (GNUNET_YES == |
652 | GNUNET_CONTAINER_multihashmap_remove (pp->plan_map, | 646 | GNUNET_CONTAINER_multihashmap_remove (pp->plan_map, |
653 | get_rp_key (rp), | 647 | get_rp_key (rp), rp)); |
654 | rp)); | ||
655 | while (NULL != (prl = rp->prl_head)) | 648 | while (NULL != (prl = rp->prl_head)) |
656 | { | 649 | { |
657 | GNUNET_CONTAINER_DLL_remove (rp->prl_head, rp->prl_tail, prl); | 650 | GNUNET_CONTAINER_DLL_remove (rp->prl_head, rp->prl_tail, prl); |
@@ -695,9 +688,10 @@ GSF_plan_notify_request_done_ (struct GSF_PendingRequest *pr) | |||
695 | GNUNET_CONTAINER_heap_remove_node (rp->hn); | 688 | GNUNET_CONTAINER_heap_remove_node (rp->hn); |
696 | plan_count--; | 689 | plan_count--; |
697 | GNUNET_break (GNUNET_YES == | 690 | GNUNET_break (GNUNET_YES == |
698 | GNUNET_CONTAINER_multihashmap_remove (rp->pp->plan_map, | 691 | GNUNET_CONTAINER_multihashmap_remove (rp->pp->plan_map, |
699 | &GSF_pending_request_get_data_ (rpr->prl->pr)->query, | 692 | &GSF_pending_request_get_data_ |
700 | rp)); | 693 | (rpr->prl->pr)->query, |
694 | rp)); | ||
701 | GNUNET_free (rp); | 695 | GNUNET_free (rp); |
702 | } | 696 | } |
703 | GNUNET_free (rpr->prl); | 697 | GNUNET_free (rpr->prl); |