aboutsummaryrefslogtreecommitdiff
path: root/src/fs
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-10-07 17:56:31 +0000
committerChristian Grothoff <christian@grothoff.org>2012-10-07 17:56:31 +0000
commitdecf459805cdb3f6811f979df4831bc2ce9a2858 (patch)
tree7d7644446cf8bd315185f2598993d0b4ce21cabb /src/fs
parent605c3946e573ab1446e8210b3b7f6cccd5c1ba03 (diff)
downloadgnunet-decf459805cdb3f6811f979df4831bc2ce9a2858.tar.gz
gnunet-decf459805cdb3f6811f979df4831bc2ce9a2858.zip
-reducing memory use for PendingRequestData by 30% by not allocating space for target/namespace hash codes unless the request needs/has them
Diffstat (limited to 'src/fs')
-rw-r--r--src/fs/gnunet-service-fs_pe.c8
-rw-r--r--src/fs/gnunet-service-fs_pr.c37
-rw-r--r--src/fs/gnunet-service-fs_pr.h11
3 files changed, 33 insertions, 23 deletions
diff --git a/src/fs/gnunet-service-fs_pe.c b/src/fs/gnunet-service-fs_pe.c
index f20021a8c..dbaab7d48 100644
--- a/src/fs/gnunet-service-fs_pe.c
+++ b/src/fs/gnunet-service-fs_pe.c
@@ -585,7 +585,7 @@ GSF_plan_add_ (struct GSF_ConnectedPeer *cp, struct GSF_PendingRequest *pr)
585 mpc.pr = pr; 585 mpc.pr = pr;
586 GNUNET_CONTAINER_multihashmap_get_multiple (pp->plan_map, 586 GNUNET_CONTAINER_multihashmap_get_multiple (pp->plan_map,
587 &GSF_pending_request_get_data_ 587 &GSF_pending_request_get_data_
588 (pr)->query, &merge_pr, &mpc); 588 (pr)->query, &merge_pr, &mpc); // 8 MB in 'merge_pr'
589 if (mpc.merged != GNUNET_NO) 589 if (mpc.merged != GNUNET_NO)
590 return; 590 return;
591 GNUNET_CONTAINER_multihashmap_get_multiple (pp->plan_map, 591 GNUNET_CONTAINER_multihashmap_get_multiple (pp->plan_map,
@@ -600,7 +600,7 @@ GSF_plan_add_ (struct GSF_ConnectedPeer *cp, struct GSF_PendingRequest *pr)
600 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 600 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
601 "Planning transmission of query `%s' to peer `%s'\n", 601 "Planning transmission of query `%s' to peer `%s'\n",
602 GNUNET_h2s (&prd->query), GNUNET_i2s (&id)); 602 GNUNET_h2s (&prd->query), GNUNET_i2s (&id));
603 rp = GNUNET_malloc (sizeof (struct GSF_RequestPlan)); 603 rp = GNUNET_malloc (sizeof (struct GSF_RequestPlan)); // 8 MB
604 rpr = GNUNET_malloc (sizeof (struct GSF_RequestPlanReference)); 604 rpr = GNUNET_malloc (sizeof (struct GSF_RequestPlanReference));
605 prl = GNUNET_malloc (sizeof (struct PendingRequestList)); 605 prl = GNUNET_malloc (sizeof (struct PendingRequestList));
606 rpr->rp = rp; 606 rpr->rp = rp;
@@ -613,8 +613,8 @@ GSF_plan_add_ (struct GSF_ConnectedPeer *cp, struct GSF_PendingRequest *pr)
613 GNUNET_assert (GNUNET_YES == 613 GNUNET_assert (GNUNET_YES ==
614 GNUNET_CONTAINER_multihashmap_put (pp->plan_map, 614 GNUNET_CONTAINER_multihashmap_put (pp->plan_map,
615 get_rp_key (rp), rp, 615 get_rp_key (rp), rp,
616 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); 616 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE)); // 8 MB
617 plan (pp, rp); 617 plan (pp, rp); // +5 MB (plan/heap-insert)
618} 618}
619 619
620 620
diff --git a/src/fs/gnunet-service-fs_pr.c b/src/fs/gnunet-service-fs_pr.c
index 1df10abd2..ceb034ba0 100644
--- a/src/fs/gnunet-service-fs_pr.c
+++ b/src/fs/gnunet-service-fs_pr.c
@@ -277,6 +277,8 @@ GSF_pending_request_create_ (enum GSF_PendingRequestOptions options,
277{ 277{
278 struct GSF_PendingRequest *pr; 278 struct GSF_PendingRequest *pr;
279 struct GSF_PendingRequest *dpr; 279 struct GSF_PendingRequest *dpr;
280 size_t extra;
281 struct GNUNET_HashCode *eptr;
280 282
281 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 283 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
282 "Creating request handle for `%s' of type %d\n", 284 "Creating request handle for `%s' of type %d\n",
@@ -284,19 +286,27 @@ GSF_pending_request_create_ (enum GSF_PendingRequestOptions options,
284 GNUNET_STATISTICS_update (GSF_stats, 286 GNUNET_STATISTICS_update (GSF_stats,
285 gettext_noop ("# Pending requests created"), 1, 287 gettext_noop ("# Pending requests created"), 1,
286 GNUNET_NO); 288 GNUNET_NO);
287 pr = GNUNET_malloc (sizeof (struct GSF_PendingRequest)); 289 extra = 0;
290 if (GNUNET_BLOCK_TYPE_FS_SBLOCK == type)
291 extra += sizeof (struct GNUNET_HashCode);
292 if (NULL != target)
293 extra += sizeof (struct GNUNET_PeerIdentity);
294 pr = GNUNET_malloc (sizeof (struct GSF_PendingRequest) + extra);
288 pr->local_result_offset = 295 pr->local_result_offset =
289 GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX); 296 GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, UINT64_MAX);
290 pr->public_data.query = *query; 297 pr->public_data.query = *query;
298 eptr = (struct GNUNET_HashCode *) &pr[1];
291 if (GNUNET_BLOCK_TYPE_FS_SBLOCK == type) 299 if (GNUNET_BLOCK_TYPE_FS_SBLOCK == type)
292 { 300 {
293 GNUNET_assert (NULL != namespace); 301 GNUNET_assert (NULL != namespace);
294 pr->public_data.namespace = *namespace; 302 pr->public_data.namespace = eptr;
303 memcpy (eptr, namespace, sizeof (struct GNUNET_HashCode));
304 eptr++;
295 } 305 }
296 if (NULL != target) 306 if (NULL != target)
297 { 307 {
298 pr->public_data.target = *target; 308 pr->public_data.target = (struct GNUNET_PeerIdentity *) eptr;
299 pr->public_data.has_target = GNUNET_YES; 309 memcpy (eptr, target, sizeof (struct GNUNET_PeerIdentity));
300 } 310 }
301 pr->public_data.anonymity_level = anonymity_level; 311 pr->public_data.anonymity_level = anonymity_level;
302 pr->public_data.priority = priority; 312 pr->public_data.priority = priority;
@@ -401,7 +411,8 @@ GSF_pending_request_is_compatible_ (struct GSF_PendingRequest *pra,
401 sizeof (struct GNUNET_HashCode))) || 411 sizeof (struct GNUNET_HashCode))) ||
402 ((pra->public_data.type == GNUNET_BLOCK_TYPE_FS_SBLOCK) && 412 ((pra->public_data.type == GNUNET_BLOCK_TYPE_FS_SBLOCK) &&
403 (0 != 413 (0 !=
404 memcmp (&pra->public_data.namespace, &prb->public_data.namespace, 414 memcmp (pra->public_data.namespace,
415 prb->public_data.namespace,
405 sizeof (struct GNUNET_HashCode))))) 416 sizeof (struct GNUNET_HashCode)))))
406 return GNUNET_NO; 417 return GNUNET_NO;
407 return GNUNET_OK; 418 return GNUNET_OK;
@@ -509,7 +520,7 @@ GSF_pending_request_get_message_ (struct GSF_PendingRequest *pr,
509 bm |= GET_MESSAGE_BIT_SKS_NAMESPACE; 520 bm |= GET_MESSAGE_BIT_SKS_NAMESPACE;
510 k++; 521 k++;
511 } 522 }
512 if (GNUNET_YES == pr->public_data.has_target) 523 if (NULL != pr->public_data.target)
513 { 524 {
514 bm |= GET_MESSAGE_BIT_TRANSMIT_TO; 525 bm |= GET_MESSAGE_BIT_TRANSMIT_TO;
515 k++; 526 k++;
@@ -545,9 +556,11 @@ GSF_pending_request_get_message_ (struct GSF_PendingRequest *pr,
545 GNUNET_PEER_resolve (pr->sender_pid, 556 GNUNET_PEER_resolve (pr->sender_pid,
546 (struct GNUNET_PeerIdentity *) &ext[k++]); 557 (struct GNUNET_PeerIdentity *) &ext[k++]);
547 if (GNUNET_BLOCK_TYPE_FS_SBLOCK == pr->public_data.type) 558 if (GNUNET_BLOCK_TYPE_FS_SBLOCK == pr->public_data.type)
548 memcpy (&ext[k++], &pr->public_data.namespace, sizeof (struct GNUNET_HashCode)); 559 memcpy (&ext[k++], pr->public_data.namespace, sizeof (struct GNUNET_HashCode));
549 if (GNUNET_YES == pr->public_data.has_target) 560 if (NULL != pr->public_data.target)
550 ext[k++] = pr->public_data.target.hashPubKey; 561 memcpy (&ext[k++],
562 pr->public_data.target,
563 sizeof (struct GNUNET_PeerIdentity));
551 if (pr->bf != NULL) 564 if (pr->bf != NULL)
552 GNUNET_assert (GNUNET_SYSERR != 565 GNUNET_assert (GNUNET_SYSERR !=
553 GNUNET_CONTAINER_bloomfilter_get_raw_data (pr->bf, 566 GNUNET_CONTAINER_bloomfilter_get_raw_data (pr->bf,
@@ -782,7 +795,7 @@ process_reply (void *cls, const struct GNUNET_HashCode * key, void *value)
782 GNUNET_NO); 795 GNUNET_NO);
783 prq->eval = 796 prq->eval =
784 GNUNET_BLOCK_evaluate (GSF_block_ctx, prq->type, key, &pr->bf, pr->mingle, 797 GNUNET_BLOCK_evaluate (GSF_block_ctx, prq->type, key, &pr->bf, pr->mingle,
785 &pr->public_data.namespace, 798 pr->public_data.namespace,
786 (prq->type == 799 (prq->type ==
787 GNUNET_BLOCK_TYPE_FS_SBLOCK) ? 800 GNUNET_BLOCK_TYPE_FS_SBLOCK) ?
788 sizeof (struct GNUNET_HashCode) : 0, prq->data, 801 sizeof (struct GNUNET_HashCode) : 0, prq->data,
@@ -1073,7 +1086,7 @@ GSF_dht_lookup_ (struct GSF_PendingRequest *pr)
1073 if (GNUNET_BLOCK_TYPE_FS_SBLOCK == pr->public_data.type) 1086 if (GNUNET_BLOCK_TYPE_FS_SBLOCK == pr->public_data.type)
1074 { 1087 {
1075 xquery = buf; 1088 xquery = buf;
1076 memcpy (buf, &pr->public_data.namespace, sizeof (struct GNUNET_HashCode)); 1089 memcpy (buf, pr->public_data.namespace, sizeof (struct GNUNET_HashCode));
1077 xquery_size = sizeof (struct GNUNET_HashCode); 1090 xquery_size = sizeof (struct GNUNET_HashCode);
1078 } 1091 }
1079 if (0 != (pr->public_data.options & GSF_PRO_FORWARD_ONLY)) 1092 if (0 != (pr->public_data.options & GSF_PRO_FORWARD_ONLY))
diff --git a/src/fs/gnunet-service-fs_pr.h b/src/fs/gnunet-service-fs_pr.h
index 10bc5c1f3..2a5fed29d 100644
--- a/src/fs/gnunet-service-fs_pr.h
+++ b/src/fs/gnunet-service-fs_pr.h
@@ -88,14 +88,16 @@ struct GSF_PendingRequestData
88 88
89 /** 89 /**
90 * Namespace to query, only set if the type is SBLOCK. 90 * Namespace to query, only set if the type is SBLOCK.
91 * Allocated after struct only if needed. Do not free!
91 */ 92 */
92 struct GNUNET_HashCode namespace; 93 const struct GNUNET_HashCode *namespace;
93 94
94 /** 95 /**
95 * Identity of a peer hosting the content, only set if 96 * Identity of a peer hosting the content, only set if
96 * 'has_target' is GNUNET_YES. 97 * 'has_target' is GNUNET_YES.
98 * Allocated after struct only if needed. Do not free!
97 */ 99 */
98 struct GNUNET_PeerIdentity target; 100 const struct GNUNET_PeerIdentity *target;
99 101
100 /** 102 /**
101 * 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.
@@ -164,11 +166,6 @@ struct GSF_PendingRequestData
164 unsigned int results_found; 166 unsigned int results_found;
165 167
166 /** 168 /**
167 * Is the 'target' value set to a valid peer identity?
168 */
169 int has_target;
170
171 /**
172 * Has this request been started yet (local/p2p operations)? Or are 169 * Has this request been started yet (local/p2p operations)? Or are
173 * we still constructing it? 170 * we still constructing it?
174 */ 171 */