aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-10-23 18:29:31 +0000
committerChristian Grothoff <christian@grothoff.org>2012-10-23 18:29:31 +0000
commita25686672d1ca40a856292ee65f45e0e736a7a8f (patch)
tree923b746e3f8af3b77d90536e5c936c4135c1b781
parentb38b47339b7c806432f251a566c857eb64c6e8cf (diff)
downloadgnunet-a25686672d1ca40a856292ee65f45e0e736a7a8f.tar.gz
gnunet-a25686672d1ca40a856292ee65f45e0e736a7a8f.zip
-using new MDLL facility to clean up bijection data structure and reduce memory consumption in fs service
-rw-r--r--src/fs/gnunet-service-fs.h5
-rw-r--r--src/fs/gnunet-service-fs_pe.c178
-rw-r--r--src/fs/gnunet-service-fs_pe.h8
-rw-r--r--src/fs/gnunet-service-fs_pr.c11
-rw-r--r--src/fs/gnunet-service-fs_pr.h4
5 files changed, 91 insertions, 115 deletions
diff --git a/src/fs/gnunet-service-fs.h b/src/fs/gnunet-service-fs.h
index 70e65186d..d198d864d 100644
--- a/src/fs/gnunet-service-fs.h
+++ b/src/fs/gnunet-service-fs.h
@@ -183,10 +183,9 @@ struct GSF_LocalClient;
183struct GSF_RequestPlan; 183struct GSF_RequestPlan;
184 184
185/** 185/**
186 * DLL of request plans a particular pending request is 186 * Bijection between request plans and pending requests.
187 * involved with.
188 */ 187 */
189struct GSF_RequestPlanReference; 188struct GSF_PendingRequestPlanBijection;
190 189
191/** 190/**
192 * Our connection to the datastore. 191 * Our connection to the datastore.
diff --git a/src/fs/gnunet-service-fs_pe.c b/src/fs/gnunet-service-fs_pe.c
index 226137d73..0a5b7e4b2 100644
--- a/src/fs/gnunet-service-fs_pe.c
+++ b/src/fs/gnunet-service-fs_pe.c
@@ -47,73 +47,55 @@ struct PeerPlan;
47 47
48 48
49/** 49/**
50 * DLL of request plans a particular pending request is 50 * M:N binding of plans to pending requests.
51 * involved with. The corresponding head and tail are 51 * Each pending request can be in a number of plans,
52 * stored in a 'struct GSF_PendingRequest'. (We need 52 * and each plan can have a number of pending requests.
53 * to be able to lookup all 'plan' entries for a given 53 * Objects of this type indicate a mapping of a plan to
54 * request easily). 54 * a particular pending request.
55 * 55 *
56 * There is always one 'struct PendingRequestList' 56 * The corresponding head and tail of the "PE" MDLL
57 * for each 'struct GSF_RequestPlanReference'. 57 * are stored in a 'struct GSF_RequestPlan'. (We need
58 * to be able to lookup all pending requests corresponding
59 * to a given plan entry.)
60 *
61 * Similarly head and tail of the "PR" MDLL are stored
62 * with the 'struct GSF_PendingRequest'. (We need
63 * to be able to lookup all plan entries corresponding
64 * to a given pending request.)
58 */ 65 */
59struct GSF_RequestPlanReference 66struct GSF_PendingRequestPlanBijection
60{ 67{
61 68
62 /** 69 /**
63 * This is a doubly-linked list. 70 * This is a doubly-linked list.
64 */ 71 */
65 struct GSF_RequestPlanReference *next_PR; 72 struct GSF_PendingRequestPlanBijection *next_PR;
66 73
67 /** 74 /**
68 * This is a doubly-linked list. 75 * This is a doubly-linked list.
69 */ 76 */
70 struct GSF_RequestPlanReference *prev_PR; 77 struct GSF_PendingRequestPlanBijection *prev_PR;
71 78
72 /** 79 /**
73 * Associated request plan. 80 * This is a doubly-linked list.
74 */ 81 */
75 struct GSF_RequestPlan *rp; 82 struct GSF_PendingRequestPlanBijection *next_PE;
76
77 /**
78 * Corresponding PendingRequestList.
79 */
80 struct PendingRequestList *prl;
81};
82
83
84/**
85 * List of GSF_PendingRequests this request plan
86 * participates with. The corresponding head and tail
87 * are stored in a 'struct GSF_RequestPlan'. (We need
88 * to be able to lookup all pending requests corresponding
89 * to a given plan entry.)
90 *
91 * There is always one 'struct PendingRequestList'
92 * for each 'struct GSF_RequestPlanReference'.
93 */
94struct PendingRequestList
95{
96 83
97 /** 84 /**
98 * This is a doubly-linked list. 85 * This is a doubly-linked list.
99 */ 86 */
100 struct PendingRequestList *next_PE; 87 struct GSF_PendingRequestPlanBijection *prev_PE;
101 88
102 /** 89 /**
103 * This is a doubly-linked list. 90 * Associated request plan.
104 */ 91 */
105 struct PendingRequestList *prev_PE; 92 struct GSF_RequestPlan *rp;
106 93
107 /** 94 /**
108 * Associated pending request. 95 * Associated pending request.
109 */ 96 */
110 struct GSF_PendingRequest *pr; 97 struct GSF_PendingRequest *pr;
111 98
112 /**
113 * Corresponding GSF_RequestPlanReference.
114 */
115 struct GSF_RequestPlanReference *rpr;
116
117}; 99};
118 100
119 101
@@ -149,12 +131,12 @@ struct GSF_RequestPlan
149 /** 131 /**
150 * Head of list of associated pending requests. 132 * Head of list of associated pending requests.
151 */ 133 */
152 struct PendingRequestList *prl_head; 134 struct GSF_PendingRequestPlanBijection *pe_head;
153 135
154 /** 136 /**
155 * Tail of list of associated pending requests. 137 * Tail of list of associated pending requests.
156 */ 138 */
157 struct PendingRequestList *prl_tail; 139 struct GSF_PendingRequestPlanBijection *pe_tail;
158 140
159 /** 141 /**
160 * Earliest time we'd be happy to (re)transmit this request. 142 * Earliest time we'd be happy to (re)transmit this request.
@@ -249,7 +231,7 @@ static unsigned long long plan_count;
249static const struct GNUNET_HashCode * 231static const struct GNUNET_HashCode *
250get_rp_key (struct GSF_RequestPlan *rp) 232get_rp_key (struct GSF_RequestPlan *rp)
251{ 233{
252 return &GSF_pending_request_get_data_ (rp->prl_head->pr)->query; 234 return &GSF_pending_request_get_data_ (rp->pe_head->pr)->query;
253} 235}
254 236
255 237
@@ -286,7 +268,7 @@ plan (struct PeerPlan *pp, struct GSF_RequestPlan *rp)
286 GNUNET_STATISTICS_set (GSF_stats, 268 GNUNET_STATISTICS_set (GSF_stats,
287 gettext_noop ("# average retransmission delay (ms)"), 269 gettext_noop ("# average retransmission delay (ms)"),
288 total_delay * 1000LL / plan_count, GNUNET_NO); 270 total_delay * 1000LL / plan_count, GNUNET_NO);
289 prd = GSF_pending_request_get_data_ (rp->prl_head->pr); 271 prd = GSF_pending_request_get_data_ (rp->pe_head->pr);
290 272
291 if (rp->transmission_counter < 8) 273 if (rp->transmission_counter < 8)
292 delay = 274 delay =
@@ -372,17 +354,19 @@ struct GSF_PendingRequest *
372get_latest (const struct GSF_RequestPlan *rp) 354get_latest (const struct GSF_RequestPlan *rp)
373{ 355{
374 struct GSF_PendingRequest *ret; 356 struct GSF_PendingRequest *ret;
375 struct PendingRequestList *prl; 357 struct GSF_PendingRequestPlanBijection *bi;
376 358
377 prl = rp->prl_head; 359 bi = rp->pe_head;
378 ret = prl->pr; 360 if (NULL == bi)
379 prl = prl->next_PE; 361 return NULL; /* should never happen */
380 while (NULL != prl) 362 ret = bi->pr;
363 bi = bi->next_PE;
364 while (NULL != bi)
381 { 365 {
382 if (GSF_pending_request_get_data_ (prl->pr)->ttl.abs_value > 366 if (GSF_pending_request_get_data_ (bi->pr)->ttl.abs_value >
383 GSF_pending_request_get_data_ (ret)->ttl.abs_value) 367 GSF_pending_request_get_data_ (ret)->ttl.abs_value)
384 ret = prl->pr; 368 ret = bi->pr;
385 prl = prl->next_PE; 369 bi = bi->next_PE;
386 } 370 }
387 return ret; 371 return ret;
388} 372}
@@ -541,23 +525,19 @@ merge_pr (void *cls, const struct GNUNET_HashCode * query, void *element)
541 struct MergeContext *mpr = cls; 525 struct MergeContext *mpr = cls;
542 struct GSF_RequestPlan *rp = element; 526 struct GSF_RequestPlan *rp = element;
543 struct GSF_PendingRequestData *prd; 527 struct GSF_PendingRequestData *prd;
544 struct GSF_RequestPlanReference *rpr; 528 struct GSF_PendingRequestPlanBijection *bi;
545 struct PendingRequestList *prl;
546 struct GSF_PendingRequest *latest; 529 struct GSF_PendingRequest *latest;
547 530
548 if (GNUNET_OK != 531 if (GNUNET_OK !=
549 GSF_pending_request_is_compatible_ (mpr->pr, rp->prl_head->pr)) 532 GSF_pending_request_is_compatible_ (mpr->pr, rp->pe_head->pr))
550 return GNUNET_YES; 533 return GNUNET_YES;
551 /* merge new request with existing request plan */ 534 /* merge new request with existing request plan */
552 rpr = GNUNET_malloc (sizeof (struct GSF_RequestPlanReference)); 535 bi = GNUNET_malloc (sizeof (struct GSF_PendingRequestPlanBijection));
553 prl = GNUNET_malloc (sizeof (struct PendingRequestList)); 536 bi->rp = rp;
554 rpr->rp = rp; 537 bi->pr = mpr->pr;
555 rpr->prl = prl;
556 prl->rpr = rpr;
557 prl->pr = mpr->pr;
558 prd = GSF_pending_request_get_data_ (mpr->pr); 538 prd = GSF_pending_request_get_data_ (mpr->pr);
559 GNUNET_CONTAINER_MDLL_insert (PR, prd->rpr_head, prd->rpr_tail, rpr); 539 GNUNET_CONTAINER_MDLL_insert (PR, prd->pr_head, prd->pr_tail, bi);
560 GNUNET_CONTAINER_MDLL_insert (PE, rp->prl_head, rp->prl_tail, prl); 540 GNUNET_CONTAINER_MDLL_insert (PE, rp->pe_head, rp->pe_tail, bi);
561 mpr->merged = GNUNET_YES; 541 mpr->merged = GNUNET_YES;
562#if INSANE_STATISTICS 542#if INSANE_STATISTICS
563 GNUNET_STATISTICS_update (GSF_stats, gettext_noop ("# requests merged"), 1, 543 GNUNET_STATISTICS_update (GSF_stats, gettext_noop ("# requests merged"), 1,
@@ -590,8 +570,7 @@ GSF_plan_add_ (struct GSF_ConnectedPeer *cp, struct GSF_PendingRequest *pr)
590 struct PeerPlan *pp; 570 struct PeerPlan *pp;
591 struct GSF_PendingRequestData *prd; 571 struct GSF_PendingRequestData *prd;
592 struct GSF_RequestPlan *rp; 572 struct GSF_RequestPlan *rp;
593 struct GSF_RequestPlanReference *rpr; 573 struct GSF_PendingRequestPlanBijection *bi;
594 struct PendingRequestList *prl;
595 struct MergeContext mpc; 574 struct MergeContext mpc;
596 575
597 GNUNET_assert (NULL != cp); 576 GNUNET_assert (NULL != cp);
@@ -630,14 +609,11 @@ GSF_plan_add_ (struct GSF_ConnectedPeer *cp, struct GSF_PendingRequest *pr)
630 "Planning transmission of query `%s' to peer `%s'\n", 609 "Planning transmission of query `%s' to peer `%s'\n",
631 GNUNET_h2s (&prd->query), GNUNET_i2s (id)); 610 GNUNET_h2s (&prd->query), GNUNET_i2s (id));
632 rp = GNUNET_malloc (sizeof (struct GSF_RequestPlan)); // 8 MB 611 rp = GNUNET_malloc (sizeof (struct GSF_RequestPlan)); // 8 MB
633 rpr = GNUNET_malloc (sizeof (struct GSF_RequestPlanReference)); 612 bi = GNUNET_malloc (sizeof (struct GSF_PendingRequestPlanBijection));
634 prl = GNUNET_malloc (sizeof (struct PendingRequestList)); 613 bi->rp = rp;
635 rpr->rp = rp; 614 bi->pr = pr;
636 rpr->prl = prl; 615 GNUNET_CONTAINER_MDLL_insert (PR, prd->pr_head, prd->pr_tail, bi);
637 prl->rpr = rpr; 616 GNUNET_CONTAINER_MDLL_insert (PE, rp->pe_head, rp->pe_tail, bi);
638 prl->pr = pr;
639 GNUNET_CONTAINER_MDLL_insert (PR, prd->rpr_head, prd->rpr_tail, rpr);
640 GNUNET_CONTAINER_MDLL_insert (PE, rp->prl_head, rp->prl_tail, prl);
641 rp->pp = pp; 617 rp->pp = pp;
642 GNUNET_assert (GNUNET_YES == 618 GNUNET_assert (GNUNET_YES ==
643 GNUNET_CONTAINER_multihashmap_put (pp->plan_map, 619 GNUNET_CONTAINER_multihashmap_put (pp->plan_map,
@@ -660,7 +636,7 @@ GSF_plan_notify_peer_disconnect_ (const struct GSF_ConnectedPeer *cp)
660 struct PeerPlan *pp; 636 struct PeerPlan *pp;
661 struct GSF_RequestPlan *rp; 637 struct GSF_RequestPlan *rp;
662 struct GSF_PendingRequestData *prd; 638 struct GSF_PendingRequestData *prd;
663 struct PendingRequestList *prl; 639 struct GSF_PendingRequestPlanBijection *bi;
664 640
665 id = GSF_connected_peer_get_identity2_ (cp); 641 id = GSF_connected_peer_get_identity2_ (cp);
666 pp = GNUNET_CONTAINER_multihashmap_get (plans, &id->hashPubKey); 642 pp = GNUNET_CONTAINER_multihashmap_get (plans, &id->hashPubKey);
@@ -684,13 +660,12 @@ GSF_plan_notify_peer_disconnect_ (const struct GSF_ConnectedPeer *cp)
684 GNUNET_break (GNUNET_YES == 660 GNUNET_break (GNUNET_YES ==
685 GNUNET_CONTAINER_multihashmap_remove (pp->plan_map, 661 GNUNET_CONTAINER_multihashmap_remove (pp->plan_map,
686 get_rp_key (rp), rp)); 662 get_rp_key (rp), rp));
687 while (NULL != (prl = rp->prl_head)) 663 while (NULL != (bi = rp->pe_head))
688 { 664 {
689 GNUNET_CONTAINER_MDLL_remove (PE, rp->prl_head, rp->prl_tail, prl); 665 GNUNET_CONTAINER_MDLL_remove (PE, rp->pe_head, rp->pe_tail, bi);
690 prd = GSF_pending_request_get_data_ (prl->pr); 666 prd = GSF_pending_request_get_data_ (bi->pr);
691 GNUNET_CONTAINER_MDLL_remove (PR, prd->rpr_head, prd->rpr_tail, prl->rpr); 667 GNUNET_CONTAINER_MDLL_remove (PR, prd->pr_head, prd->pr_tail, bi);
692 GNUNET_free (prl->rpr); 668 GNUNET_free (bi);
693 GNUNET_free (prl);
694 } 669 }
695 plan_count--; 670 plan_count--;
696 GNUNET_free (rp); 671 GNUNET_free (rp);
@@ -701,13 +676,11 @@ GSF_plan_notify_peer_disconnect_ (const struct GSF_ConnectedPeer *cp)
701 GNUNET_break (GNUNET_YES == 676 GNUNET_break (GNUNET_YES ==
702 GNUNET_CONTAINER_multihashmap_remove (pp->plan_map, 677 GNUNET_CONTAINER_multihashmap_remove (pp->plan_map,
703 get_rp_key (rp), rp)); 678 get_rp_key (rp), rp));
704 while (NULL != (prl = rp->prl_head)) 679 while (NULL != (bi = rp->pe_head))
705 { 680 {
706 GNUNET_CONTAINER_MDLL_remove (PE, rp->prl_head, rp->prl_tail, prl); 681 GNUNET_CONTAINER_MDLL_remove (PE, rp->pe_head, rp->pe_tail, bi);
707 prd = GSF_pending_request_get_data_ (prl->pr); 682 GNUNET_CONTAINER_MDLL_remove (PR, prd->pr_head, prd->pr_tail, bi);
708 GNUNET_CONTAINER_MDLL_remove (PR, prd->rpr_head, prd->rpr_tail, prl->rpr); 683 GNUNET_free (bi);
709 GNUNET_free (prl->rpr);
710 GNUNET_free (prl);
711 } 684 }
712 plan_count--; 685 plan_count--;
713 GNUNET_free (rp); 686 GNUNET_free (rp);
@@ -722,25 +695,25 @@ GSF_plan_notify_peer_disconnect_ (const struct GSF_ConnectedPeer *cp)
722 695
723/** 696/**
724 * Get the last transmission attempt time for the request plan list 697 * Get the last transmission attempt time for the request plan list
725 * referenced by 'rpr_head', that was sent to 'sender' 698 * referenced by 'pr_head', that was sent to 'sender'
726 * 699 *
727 * @param rpr_head request plan reference list to check. 700 * @param pr_head request plan reference list to check.
728 * @param sender the peer that we've sent the request to. 701 * @param sender the peer that we've sent the request to.
729 * @param result the timestamp to fill. 702 * @param result the timestamp to fill.
730 * @return GNUNET_YES if 'result' was changed, GNUNET_NO otherwise. 703 * @return GNUNET_YES if 'result' was changed, GNUNET_NO otherwise.
731 */ 704 */
732int 705int
733GSF_request_plan_reference_get_last_transmission_ ( 706GSF_request_plan_reference_get_last_transmission_ (
734 struct GSF_RequestPlanReference *rpr_head, struct GSF_ConnectedPeer *sender, 707 struct GSF_PendingRequestPlanBijection *pr_head, struct GSF_ConnectedPeer *sender,
735 struct GNUNET_TIME_Absolute *result) 708 struct GNUNET_TIME_Absolute *result)
736{ 709{
737 struct GSF_RequestPlanReference *rpr; 710 struct GSF_PendingRequestPlanBijection *bi;
738 711
739 for (rpr = rpr_head; NULL != rpr; rpr = rpr->next_PR) 712 for (bi = pr_head; NULL != bi; bi = bi->next_PR)
740 { 713 {
741 if (rpr->rp->pp->cp == sender) 714 if (bi->rp->pp->cp == sender)
742 { 715 {
743 *result = rpr->rp->last_transmission; 716 *result = bi->rp->last_transmission;
744 return GNUNET_YES; 717 return GNUNET_YES;
745 } 718 }
746 } 719 }
@@ -759,27 +732,26 @@ GSF_plan_notify_request_done_ (struct GSF_PendingRequest *pr)
759{ 732{
760 struct GSF_RequestPlan *rp; 733 struct GSF_RequestPlan *rp;
761 struct GSF_PendingRequestData *prd; 734 struct GSF_PendingRequestData *prd;
762 struct GSF_RequestPlanReference *rpr; 735 struct GSF_PendingRequestPlanBijection *bi;
763 736
764 prd = GSF_pending_request_get_data_ (pr); 737 prd = GSF_pending_request_get_data_ (pr);
765 while (NULL != (rpr = prd->rpr_head)) 738 while (NULL != (bi = prd->pr_head))
766 { 739 {
767 GNUNET_CONTAINER_MDLL_remove (PR, prd->rpr_head, prd->rpr_tail, rpr); 740 GNUNET_CONTAINER_MDLL_remove (PR, prd->pr_head, prd->pr_tail, bi);
768 rp = rpr->rp; 741 GNUNET_CONTAINER_MDLL_remove (PE, rp->pe_head, rp->pe_tail, bi);
769 GNUNET_CONTAINER_MDLL_remove (PE, rp->prl_head, rp->prl_tail, rpr->prl); 742 rp = bi->rp;
770 if (NULL == rp->prl_head) 743 if (NULL == rp->pe_head)
771 { 744 {
772 GNUNET_CONTAINER_heap_remove_node (rp->hn); 745 GNUNET_CONTAINER_heap_remove_node (rp->hn);
773 plan_count--; 746 plan_count--;
774 GNUNET_break (GNUNET_YES == 747 GNUNET_break (GNUNET_YES ==
775 GNUNET_CONTAINER_multihashmap_remove (rp->pp->plan_map, 748 GNUNET_CONTAINER_multihashmap_remove (rp->pp->plan_map,
776 &GSF_pending_request_get_data_ 749 &GSF_pending_request_get_data_
777 (rpr->prl->pr)->query, 750 (bi->pr)->query,
778 rp)); 751 rp));
779 GNUNET_free (rp); 752 GNUNET_free (rp);
780 } 753 }
781 GNUNET_free (rpr->prl); 754 GNUNET_free (bi);
782 GNUNET_free (rpr);
783 } 755 }
784 GNUNET_STATISTICS_set (GSF_stats, gettext_noop ("# query plan entries"), 756 GNUNET_STATISTICS_set (GSF_stats, gettext_noop ("# query plan entries"),
785 plan_count, GNUNET_NO); 757 plan_count, GNUNET_NO);
diff --git a/src/fs/gnunet-service-fs_pe.h b/src/fs/gnunet-service-fs_pe.h
index 3a18715ca..d1362675c 100644
--- a/src/fs/gnunet-service-fs_pe.h
+++ b/src/fs/gnunet-service-fs_pe.h
@@ -62,15 +62,15 @@ GSF_plan_notify_request_done_ (struct GSF_PendingRequest *pr);
62 * Get the last transmission attempt time for the request plan list 62 * Get the last transmission attempt time for the request plan list
63 * referenced by 'rpr_head', that was sent to 'sender' 63 * referenced by 'rpr_head', that was sent to 'sender'
64 * 64 *
65 * @param rpr_head request plan reference list to check. 65 * @param pr_head request plan reference list to check.
66 * @param sender the peer that we've sent the request to. 66 * @param sender the peer that we've sent the request to.
67 * @param result the timestamp to fill. 67 * @param result the timestamp to fill.
68 * @return GNUNET_YES if 'result' was changed, GNUNET_NO otherwise. 68 * @return GNUNET_YES if 'result' was changed, GNUNET_NO otherwise.
69 */ 69 */
70int 70int
71GSF_request_plan_reference_get_last_transmission_ ( 71GSF_request_plan_reference_get_last_transmission_ (struct GSF_PendingRequestPlanBijection *pr_head,
72 struct GSF_RequestPlanReference *rpr_head, struct GSF_ConnectedPeer *sender, 72 struct GSF_ConnectedPeer *sender,
73 struct GNUNET_TIME_Absolute *result); 73 struct GNUNET_TIME_Absolute *result);
74 74
75/** 75/**
76 * Initialize plan subsystem. 76 * Initialize plan subsystem.
diff --git a/src/fs/gnunet-service-fs_pr.c b/src/fs/gnunet-service-fs_pr.c
index f39f3fb78..74a982970 100644
--- a/src/fs/gnunet-service-fs_pr.c
+++ b/src/fs/gnunet-service-fs_pr.c
@@ -819,7 +819,9 @@ process_reply (void *cls, const struct GNUNET_HashCode * key, void *value)
819 GNUNET_LOAD_update (GSF_rt_entry_lifetime, 819 GNUNET_LOAD_update (GSF_rt_entry_lifetime,
820 GNUNET_TIME_absolute_get_duration (pr-> 820 GNUNET_TIME_absolute_get_duration (pr->
821 public_data.start_time).rel_value); 821 public_data.start_time).rel_value);
822 if (!GSF_request_plan_reference_get_last_transmission_ (pr->public_data.rpr_head, prq->sender, &last_transmission)) 822 if (! GSF_request_plan_reference_get_last_transmission_ (pr->public_data.pr_head,
823 prq->sender,
824 &last_transmission))
823 last_transmission.abs_value = GNUNET_TIME_UNIT_FOREVER_ABS.abs_value; 825 last_transmission.abs_value = GNUNET_TIME_UNIT_FOREVER_ABS.abs_value;
824 /* pass on to other peers / local clients */ 826 /* pass on to other peers / local clients */
825 pr->rh (pr->rh_cls, prq->eval, pr, prq->anonymity_level, prq->expiration, 827 pr->rh (pr->rh_cls, prq->eval, pr, prq->anonymity_level, prq->expiration,
@@ -870,9 +872,12 @@ process_reply (void *cls, const struct GNUNET_HashCode * key, void *value)
870 pr->public_data.results_found++; 872 pr->public_data.results_found++;
871 prq->request_found = GNUNET_YES; 873 prq->request_found = GNUNET_YES;
872 /* finally, pass on to other peer / local client */ 874 /* finally, pass on to other peer / local client */
873 if (!GSF_request_plan_reference_get_last_transmission_ (pr->public_data.rpr_head, prq->sender, &last_transmission)) 875 if (! GSF_request_plan_reference_get_last_transmission_ (pr->public_data.pr_head,
876 prq->sender,
877 &last_transmission))
874 last_transmission.abs_value = GNUNET_TIME_UNIT_FOREVER_ABS.abs_value; 878 last_transmission.abs_value = GNUNET_TIME_UNIT_FOREVER_ABS.abs_value;
875 pr->rh (pr->rh_cls, prq->eval, pr, prq->anonymity_level, prq->expiration, 879 pr->rh (pr->rh_cls, prq->eval, pr,
880 prq->anonymity_level, prq->expiration,
876 last_transmission, prq->type, prq->data, prq->size); 881 last_transmission, prq->type, prq->data, prq->size);
877 return GNUNET_YES; 882 return GNUNET_YES;
878} 883}
diff --git a/src/fs/gnunet-service-fs_pr.h b/src/fs/gnunet-service-fs_pr.h
index 2a5fed29d..ab5ce0fab 100644
--- a/src/fs/gnunet-service-fs_pr.h
+++ b/src/fs/gnunet-service-fs_pr.h
@@ -102,12 +102,12 @@ struct GSF_PendingRequestData
102 /** 102 /**
103 * Fields for the plan module to track a DLL with the request. 103 * Fields for the plan module to track a DLL with the request.
104 */ 104 */
105 struct GSF_RequestPlanReference *rpr_head; 105 struct GSF_PendingRequestPlanBijection *pr_head;
106 106
107 /** 107 /**
108 * Fields for the plan module to track a DLL with the request. 108 * Fields for the plan module to track a DLL with the request.
109 */ 109 */
110 struct GSF_RequestPlanReference *rpr_tail; 110 struct GSF_PendingRequestPlanBijection *pr_tail;
111 111
112 /** 112 /**
113 * Current TTL for the request. 113 * Current TTL for the request.