aboutsummaryrefslogtreecommitdiff
path: root/src/fs/gnunet-service-fs_pe.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs/gnunet-service-fs_pe.c')
-rw-r--r--src/fs/gnunet-service-fs_pe.c90
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 */
490static int 489static int
491merge_pr (void *cls, 490merge_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);