aboutsummaryrefslogtreecommitdiff
path: root/src/fs/gnunet-service-fs_pe.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2015-10-26 00:53:32 +0000
committerChristian Grothoff <christian@grothoff.org>2015-10-26 00:53:32 +0000
commit6342157c3068d482f7f8c02b7229e80eba2c94dc (patch)
tree3c5b9f1af6637e05471ca3cfae2b268e08f00b2b /src/fs/gnunet-service-fs_pe.c
parent0cd7408a37d1daefc6394027247b10d0efaae1a3 (diff)
downloadgnunet-6342157c3068d482f7f8c02b7229e80eba2c94dc.tar.gz
gnunet-6342157c3068d482f7f8c02b7229e80eba2c94dc.zip
potential fix for #4024
Diffstat (limited to 'src/fs/gnunet-service-fs_pe.c')
-rw-r--r--src/fs/gnunet-service-fs_pe.c82
1 files changed, 60 insertions, 22 deletions
diff --git a/src/fs/gnunet-service-fs_pe.c b/src/fs/gnunet-service-fs_pe.c
index 9743d1cb2..1c4065f70 100644
--- a/src/fs/gnunet-service-fs_pe.c
+++ b/src/fs/gnunet-service-fs_pe.c
@@ -371,6 +371,8 @@ get_latest (const struct GSF_RequestPlan *rp)
371 rprd = GSF_pending_request_get_data_ (ret); 371 rprd = GSF_pending_request_get_data_ (ret);
372 for (bi = bi->next_PE; NULL != bi; bi = bi->next_PE) 372 for (bi = bi->next_PE; NULL != bi; bi = bi->next_PE)
373 { 373 {
374 GNUNET_break (GNUNET_YES ==
375 GSF_pending_request_test_active_ (bi->pr));
374 prd = GSF_pending_request_get_data_ (bi->pr); 376 prd = GSF_pending_request_get_data_ (bi->pr);
375 if (prd->ttl.abs_value_us > rprd->ttl.abs_value_us) 377 if (prd->ttl.abs_value_us > rprd->ttl.abs_value_us)
376 { 378 {
@@ -433,7 +435,8 @@ transmit_message_callback (void *cls,
433 return 0; 435 return 0;
434 } 436 }
435 /* remove from root, add again elsewhere... */ 437 /* remove from root, add again elsewhere... */
436 GNUNET_assert (rp == GNUNET_CONTAINER_heap_remove_root (pp->priority_heap)); 438 GNUNET_assert (rp ==
439 GNUNET_CONTAINER_heap_remove_root (pp->priority_heap));
437 rp->hn = NULL; 440 rp->hn = NULL;
438 rp->last_transmission = GNUNET_TIME_absolute_get (); 441 rp->last_transmission = GNUNET_TIME_absolute_get ();
439 rp->transmission_counter++; 442 rp->transmission_counter++;
@@ -443,8 +446,8 @@ transmit_message_callback (void *cls,
443 rp, rp->transmission_counter); 446 rp, rp->transmission_counter);
444 plan (pp, rp); 447 plan (pp, rp);
445 GNUNET_STATISTICS_update (GSF_stats, 448 GNUNET_STATISTICS_update (GSF_stats,
446 gettext_noop 449 gettext_noop ("# query messages sent to other peers"),
447 ("# query messages sent to other peers"), 1, 450 1,
448 GNUNET_NO); 451 GNUNET_NO);
449 return msize; 452 return msize;
450} 453}
@@ -477,7 +480,9 @@ schedule_peer_transmission (void *cls,
477 (rp->earliest_transmission).rel_value_us)) 480 (rp->earliest_transmission).rel_value_us))
478 { 481 {
479 GNUNET_assert (rp == GNUNET_CONTAINER_heap_remove_root (pp->delay_heap)); 482 GNUNET_assert (rp == GNUNET_CONTAINER_heap_remove_root (pp->delay_heap));
480 rp->hn = GNUNET_CONTAINER_heap_insert (pp->priority_heap, rp, rp->priority); 483 rp->hn = GNUNET_CONTAINER_heap_insert (pp->priority_heap,
484 rp,
485 rp->priority);
481 } 486 }
482 if (0 == GNUNET_CONTAINER_heap_get_size (pp->priority_heap)) 487 if (0 == GNUNET_CONTAINER_heap_get_size (pp->priority_heap))
483 { 488 {
@@ -512,7 +517,9 @@ schedule_peer_transmission (void *cls,
512#endif 517#endif
513 /* process from priority heap */ 518 /* process from priority heap */
514 rp = GNUNET_CONTAINER_heap_peek (pp->priority_heap); 519 rp = GNUNET_CONTAINER_heap_peek (pp->priority_heap);
515 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Executing query plan %p\n", rp); 520 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
521 "Executing query plan %p\n",
522 rp);
516 GNUNET_assert (NULL != rp); 523 GNUNET_assert (NULL != rp);
517 msize = GSF_pending_request_get_message_ (get_latest (rp), 0, NULL); 524 msize = GSF_pending_request_get_message_ (get_latest (rp), 0, NULL);
518 pp->pth = 525 pp->pth =
@@ -565,6 +572,8 @@ merge_pr (void *cls,
565 struct GSF_PendingRequestPlanBijection *bi; 572 struct GSF_PendingRequestPlanBijection *bi;
566 struct GSF_PendingRequest *latest; 573 struct GSF_PendingRequest *latest;
567 574
575 GNUNET_break (GNUNET_YES ==
576 GSF_pending_request_test_active_ (mpr->pr));
568 if (GNUNET_OK != 577 if (GNUNET_OK !=
569 GSF_pending_request_is_compatible_ (mpr->pr, 578 GSF_pending_request_is_compatible_ (mpr->pr,
570 rp->pe_head->pr)) 579 rp->pe_head->pr))
@@ -585,7 +594,8 @@ merge_pr (void *cls,
585 mpr->merged = GNUNET_YES; 594 mpr->merged = GNUNET_YES;
586#if INSANE_STATISTICS 595#if INSANE_STATISTICS
587 GNUNET_STATISTICS_update (GSF_stats, 596 GNUNET_STATISTICS_update (GSF_stats,
588 gettext_noop ("# requests merged"), 1, 597 gettext_noop ("# requests merged"),
598 1,
589 GNUNET_NO); 599 GNUNET_NO);
590#endif 600#endif
591 latest = get_latest (rp); 601 latest = get_latest (rp);
@@ -595,7 +605,8 @@ merge_pr (void *cls,
595#if INSANE_STATISTICS 605#if INSANE_STATISTICS
596 GNUNET_STATISTICS_update (GSF_stats, 606 GNUNET_STATISTICS_update (GSF_stats,
597 gettext_noop ("# requests refreshed"), 607 gettext_noop ("# requests refreshed"),
598 1, GNUNET_NO); 608 1,
609 GNUNET_NO);
599#endif 610#endif
600 rp->transmission_counter = 0; /* reset */ 611 rp->transmission_counter = 0; /* reset */
601 } 612 }
@@ -620,6 +631,8 @@ GSF_plan_add_ (struct GSF_ConnectedPeer *cp,
620 struct GSF_PendingRequestPlanBijection *bi; 631 struct GSF_PendingRequestPlanBijection *bi;
621 struct MergeContext mpc; 632 struct MergeContext mpc;
622 633
634 GNUNET_assert (GNUNET_YES ==
635 GSF_pending_request_test_active_ (pr));
623 GNUNET_assert (NULL != cp); 636 GNUNET_assert (NULL != cp);
624 id = GSF_connected_peer_get_identity2_ (cp); 637 id = GSF_connected_peer_get_identity2_ (cp);
625 pp = GNUNET_CONTAINER_multipeermap_get (plans, id); 638 pp = GNUNET_CONTAINER_multipeermap_get (plans, id);
@@ -715,12 +728,19 @@ GSF_plan_notify_peer_disconnect_ (const struct GSF_ConnectedPeer *cp)
715 { 728 {
716 GNUNET_break (GNUNET_YES == 729 GNUNET_break (GNUNET_YES ==
717 GNUNET_CONTAINER_multihashmap_remove (pp->plan_map, 730 GNUNET_CONTAINER_multihashmap_remove (pp->plan_map,
718 get_rp_key (rp), rp)); 731 get_rp_key (rp),
732 rp));
719 while (NULL != (bi = rp->pe_head)) 733 while (NULL != (bi = rp->pe_head))
720 { 734 {
721 GNUNET_CONTAINER_MDLL_remove (PE, rp->pe_head, rp->pe_tail, bi); 735 GNUNET_CONTAINER_MDLL_remove (PE,
736 rp->pe_head,
737 rp->pe_tail,
738 bi);
722 prd = GSF_pending_request_get_data_ (bi->pr); 739 prd = GSF_pending_request_get_data_ (bi->pr);
723 GNUNET_CONTAINER_MDLL_remove (PR, prd->pr_head, prd->pr_tail, bi); 740 GNUNET_CONTAINER_MDLL_remove (PR,
741 prd->pr_head,
742 prd->pr_tail,
743 bi);
724 GNUNET_free (bi); 744 GNUNET_free (bi);
725 } 745 }
726 plan_count--; 746 plan_count--;
@@ -731,19 +751,28 @@ GSF_plan_notify_peer_disconnect_ (const struct GSF_ConnectedPeer *cp)
731 { 751 {
732 GNUNET_break (GNUNET_YES == 752 GNUNET_break (GNUNET_YES ==
733 GNUNET_CONTAINER_multihashmap_remove (pp->plan_map, 753 GNUNET_CONTAINER_multihashmap_remove (pp->plan_map,
734 get_rp_key (rp), rp)); 754 get_rp_key (rp),
755 rp));
735 while (NULL != (bi = rp->pe_head)) 756 while (NULL != (bi = rp->pe_head))
736 { 757 {
737 prd = GSF_pending_request_get_data_ (bi->pr); 758 prd = GSF_pending_request_get_data_ (bi->pr);
738 GNUNET_CONTAINER_MDLL_remove (PE, rp->pe_head, rp->pe_tail, bi); 759 GNUNET_CONTAINER_MDLL_remove (PE,
739 GNUNET_CONTAINER_MDLL_remove (PR, prd->pr_head, prd->pr_tail, bi); 760 rp->pe_head,
761 rp->pe_tail,
762 bi);
763 GNUNET_CONTAINER_MDLL_remove (PR,
764 prd->pr_head,
765 prd->pr_tail,
766 bi);
740 GNUNET_free (bi); 767 GNUNET_free (bi);
741 } 768 }
742 plan_count--; 769 plan_count--;
743 GNUNET_free (rp); 770 GNUNET_free (rp);
744 } 771 }
745 GNUNET_STATISTICS_set (GSF_stats, gettext_noop ("# query plan entries"), 772 GNUNET_STATISTICS_set (GSF_stats,
746 plan_count, GNUNET_NO); 773 gettext_noop ("# query plan entries"),
774 plan_count,
775 GNUNET_NO);
747 GNUNET_CONTAINER_heap_destroy (pp->delay_heap); 776 GNUNET_CONTAINER_heap_destroy (pp->delay_heap);
748 GNUNET_CONTAINER_multihashmap_destroy (pp->plan_map); 777 GNUNET_CONTAINER_multihashmap_destroy (pp->plan_map);
749 GNUNET_free (pp); 778 GNUNET_free (pp);
@@ -798,23 +827,31 @@ GSF_plan_notify_request_done_ (struct GSF_PendingRequest *pr)
798 while (NULL != (bi = prd->pr_head)) 827 while (NULL != (bi = prd->pr_head))
799 { 828 {
800 rp = bi->rp; 829 rp = bi->rp;
801 GNUNET_CONTAINER_MDLL_remove (PR, prd->pr_head, prd->pr_tail, bi); 830 GNUNET_CONTAINER_MDLL_remove (PR,
802 GNUNET_CONTAINER_MDLL_remove (PE, rp->pe_head, rp->pe_tail, bi); 831 prd->pr_head,
832 prd->pr_tail,
833 bi);
834 GNUNET_CONTAINER_MDLL_remove (PE,
835 rp->pe_head,
836 rp->pe_tail,
837 bi);
838 GNUNET_assert (bi->pr == pr);
803 if (NULL == rp->pe_head) 839 if (NULL == rp->pe_head)
804 { 840 {
805 GNUNET_CONTAINER_heap_remove_node (rp->hn); 841 GNUNET_CONTAINER_heap_remove_node (rp->hn);
806 plan_count--; 842 plan_count--;
807 GNUNET_break (GNUNET_YES == 843 GNUNET_break (GNUNET_YES ==
808 GNUNET_CONTAINER_multihashmap_remove (rp->pp->plan_map, 844 GNUNET_CONTAINER_multihashmap_remove (rp->pp->plan_map,
809 &GSF_pending_request_get_data_ 845 &prd->query,
810 (bi->pr)->query,
811 rp)); 846 rp));
812 GNUNET_free (rp); 847 GNUNET_free (rp);
813 } 848 }
814 GNUNET_free (bi); 849 GNUNET_free (bi);
815 } 850 }
816 GNUNET_STATISTICS_set (GSF_stats, gettext_noop ("# query plan entries"), 851 GNUNET_STATISTICS_set (GSF_stats,
817 plan_count, GNUNET_NO); 852 gettext_noop ("# query plan entries"),
853 plan_count,
854 GNUNET_NO);
818} 855}
819 856
820 857
@@ -824,7 +861,8 @@ GSF_plan_notify_request_done_ (struct GSF_PendingRequest *pr)
824void 861void
825GSF_plan_init () 862GSF_plan_init ()
826{ 863{
827 plans = GNUNET_CONTAINER_multipeermap_create (256, GNUNET_YES); 864 plans = GNUNET_CONTAINER_multipeermap_create (256,
865 GNUNET_YES);
828} 866}
829 867
830 868