diff options
author | Christian Grothoff <christian@grothoff.org> | 2015-10-26 00:53:32 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2015-10-26 00:53:32 +0000 |
commit | 6342157c3068d482f7f8c02b7229e80eba2c94dc (patch) | |
tree | 3c5b9f1af6637e05471ca3cfae2b268e08f00b2b /src/fs/gnunet-service-fs_pe.c | |
parent | 0cd7408a37d1daefc6394027247b10d0efaae1a3 (diff) | |
download | gnunet-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.c | 82 |
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) | |||
824 | void | 861 | void |
825 | GSF_plan_init () | 862 | GSF_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 | ||