aboutsummaryrefslogtreecommitdiff
path: root/src/fs
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2010-02-01 12:28:34 +0000
committerChristian Grothoff <christian@grothoff.org>2010-02-01 12:28:34 +0000
commit23c492b43c9f732575cce708bc8cb0f537d0e62e (patch)
tree24040168b740ac64ac6e1f06b5d667e187cbf30a /src/fs
parent1ae18596e812235ee505338bb2fbfd445ae9d6cf (diff)
downloadgnunet-23c492b43c9f732575cce708bc8cb0f537d0e62e.tar.gz
gnunet-23c492b43c9f732575cce708bc8cb0f537d0e62e.zip
fixes
Diffstat (limited to 'src/fs')
-rw-r--r--src/fs/gnunet-service-fs.c73
-rw-r--r--src/fs/test_fs_download_data.conf4
2 files changed, 55 insertions, 22 deletions
diff --git a/src/fs/gnunet-service-fs.c b/src/fs/gnunet-service-fs.c
index 2b3b44f93..6860c377a 100644
--- a/src/fs/gnunet-service-fs.c
+++ b/src/fs/gnunet-service-fs.c
@@ -30,7 +30,6 @@
30 * - detect duplicate requests (P2P and CS) 30 * - detect duplicate requests (P2P and CS)
31 * - implement: bound_priority, test_load_too_high, validate_skblock 31 * - implement: bound_priority, test_load_too_high, validate_skblock
32 * - add content migration support (store locally) 32 * - add content migration support (store locally)
33 * - add random delay
34 * - statistics 33 * - statistics
35 * 34 *
36 */ 35 */
@@ -928,17 +927,17 @@ static void
928shutdown_task (void *cls, 927shutdown_task (void *cls,
929 const struct GNUNET_SCHEDULER_TaskContext *tc) 928 const struct GNUNET_SCHEDULER_TaskContext *tc)
930{ 929{
931 GNUNET_CONTAINER_multihashmap_iterate (connected_peers,
932 &clean_peer,
933 NULL);
934 GNUNET_CONTAINER_multihashmap_destroy (connected_peers);
935 connected_peers = NULL;
936 while (client_list != NULL) 930 while (client_list != NULL)
937 handle_client_disconnect (NULL, 931 handle_client_disconnect (NULL,
938 client_list->client); 932 client_list->client);
933 GNUNET_CONTAINER_multihashmap_iterate (connected_peers,
934 &clean_peer,
935 NULL);
939 GNUNET_break (0 == GNUNET_CONTAINER_heap_get_size (requests_by_expiration_heap)); 936 GNUNET_break (0 == GNUNET_CONTAINER_heap_get_size (requests_by_expiration_heap));
940 GNUNET_CONTAINER_heap_destroy (requests_by_expiration_heap); 937 GNUNET_CONTAINER_heap_destroy (requests_by_expiration_heap);
941 requests_by_expiration_heap = 0; 938 requests_by_expiration_heap = 0;
939 GNUNET_CONTAINER_multihashmap_destroy (connected_peers);
940 connected_peers = NULL;
942 GNUNET_break (0 == GNUNET_CONTAINER_multihashmap_size (query_request_map)); 941 GNUNET_break (0 == GNUNET_CONTAINER_multihashmap_size (query_request_map));
943 GNUNET_CONTAINER_multihashmap_destroy (query_request_map); 942 GNUNET_CONTAINER_multihashmap_destroy (query_request_map);
944 query_request_map = NULL; 943 query_request_map = NULL;
@@ -1243,14 +1242,10 @@ target_reservation_cb (void *cls,
1243 char *bfdata; 1242 char *bfdata;
1244 size_t msize; 1243 size_t msize;
1245 unsigned int k; 1244 unsigned int k;
1245 int no_route;
1246 1246
1247 pr->irc = NULL; 1247 pr->irc = NULL;
1248 GNUNET_assert (peer != NULL); 1248 GNUNET_assert (peer != NULL);
1249 if (amount != DBLOCK_SIZE)
1250 {
1251 /* FIXME: call stats... */
1252 return; /* this target round failed */
1253 }
1254 // (3) transmit, update ttl/priority 1249 // (3) transmit, update ttl/priority
1255 cp = GNUNET_CONTAINER_multihashmap_get (connected_peers, 1250 cp = GNUNET_CONTAINER_multihashmap_get (connected_peers,
1256 &peer->hashPubKey); 1251 &peer->hashPubKey);
@@ -1259,8 +1254,24 @@ target_reservation_cb (void *cls,
1259 /* Peer must have just left */ 1254 /* Peer must have just left */
1260 return; 1255 return;
1261 } 1256 }
1257 no_route = GNUNET_NO;
1258 if (amount != DBLOCK_SIZE)
1259 {
1260 if (pr->pht_entry == NULL)
1261 return; /* this target round failed */
1262 /* FIXME: if we are "quite" busy, we may still want to skip
1263 this round; need more load detection code! */
1264 no_route = GNUNET_YES;
1265 }
1266
1262 /* build message and insert message into priority queue */ 1267 /* build message and insert message into priority queue */
1263 k = 0; // FIXME: count hash codes! 1268 k = 0;
1269 if (pr->namespace != NULL)
1270 k++;
1271 if (pr->target_pid != 0)
1272 k++;
1273 if (GNUNET_YES == no_route)
1274 k++;
1264 msize = sizeof (struct GetMessage) + pr->bf_size + k * sizeof(GNUNET_HashCode); 1275 msize = sizeof (struct GetMessage) + pr->bf_size + k * sizeof(GNUNET_HashCode);
1265 GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE); 1276 GNUNET_assert (msize < GNUNET_SERVER_MAX_MESSAGE_SIZE);
1266 pm = GNUNET_malloc (sizeof (struct PendingMessage) + msize); 1277 pm = GNUNET_malloc (sizeof (struct PendingMessage) + msize);
@@ -1276,7 +1287,13 @@ target_reservation_cb (void *cls,
1276 gm->hash_bitmap = htonl (42); // FIXME! 1287 gm->hash_bitmap = htonl (42); // FIXME!
1277 gm->query = pr->query; 1288 gm->query = pr->query;
1278 ext = (GNUNET_HashCode*) &gm[1]; 1289 ext = (GNUNET_HashCode*) &gm[1];
1279 // FIXME: setup "ext[0]..[k-1]" 1290 k = 0;
1291 if (pr->namespace != NULL)
1292 memcpy (&ext[k++], pr->namespace, sizeof (GNUNET_HashCode));
1293 if (pr->target_pid != 0)
1294 GNUNET_PEER_resolve (pr->target_pid, (struct GNUNET_PeerIdentity*) &ext[k++]);
1295 if (GNUNET_YES == no_route)
1296 GNUNET_PEER_resolve (pr->pht_entry->cp->pid, (struct GNUNET_PeerIdentity*) &ext[k++]);
1280 bfdata = (char *) &ext[k]; 1297 bfdata = (char *) &ext[k];
1281 if (pr->bf != NULL) 1298 if (pr->bf != NULL)
1282 GNUNET_CONTAINER_bloomfilter_get_raw_data (pr->bf, 1299 GNUNET_CONTAINER_bloomfilter_get_raw_data (pr->bf,
@@ -1288,7 +1305,6 @@ target_reservation_cb (void *cls,
1288} 1305}
1289 1306
1290 1307
1291
1292/** 1308/**
1293 * Closure used for "target_peer_select_cb". 1309 * Closure used for "target_peer_select_cb".
1294 */ 1310 */
@@ -1659,7 +1675,7 @@ process_reply (void *cls,
1659 GNUNET_break (GNUNET_YES == 1675 GNUNET_break (GNUNET_YES ==
1660 GNUNET_CONTAINER_multihashmap_remove (query_request_map, 1676 GNUNET_CONTAINER_multihashmap_remove (query_request_map,
1661 key, 1677 key,
1662 prq)); 1678 pr));
1663 break; 1679 break;
1664 case GNUNET_DATASTORE_BLOCKTYPE_SBLOCK: 1680 case GNUNET_DATASTORE_BLOCKTYPE_SBLOCK:
1665 if (0 != memcmp (pr->namespace, 1681 if (0 != memcmp (pr->namespace,
@@ -1679,7 +1695,6 @@ process_reply (void *cls,
1679 } 1695 }
1680 if (pr->client_request_list != NULL) 1696 if (pr->client_request_list != NULL)
1681 { 1697 {
1682 cl = pr->client_request_list->client_list;
1683 if (pr->replies_seen_size == pr->replies_seen_off) 1698 if (pr->replies_seen_size == pr->replies_seen_off)
1684 { 1699 {
1685 GNUNET_array_grow (pr->replies_seen, 1700 GNUNET_array_grow (pr->replies_seen,
@@ -1702,6 +1717,7 @@ process_reply (void *cls,
1702 pr->remaining_priority = 0; 1717 pr->remaining_priority = 0;
1703 if (pr->client_request_list != NULL) 1718 if (pr->client_request_list != NULL)
1704 { 1719 {
1720 cl = pr->client_request_list->client_list;
1705 msize = sizeof (struct PutMessage) + prq->size; 1721 msize = sizeof (struct PutMessage) + prq->size;
1706 creply = GNUNET_malloc (msize + sizeof (struct ClientResponseMessage)); 1722 creply = GNUNET_malloc (msize + sizeof (struct ClientResponseMessage));
1707 creply->msize = msize; 1723 creply->msize = msize;
@@ -2144,7 +2160,7 @@ handle_p2p_get (void *cls,
2144 pre->req = pr; 2160 pre->req = pr;
2145 GNUNET_CONTAINER_multihashmap_put (query_request_map, 2161 GNUNET_CONTAINER_multihashmap_put (query_request_map,
2146 &gm->query, 2162 &gm->query,
2147 pre, 2163 pr,
2148 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE); 2164 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
2149 2165
2150 pr->hnode = GNUNET_CONTAINER_heap_insert (requests_by_expiration_heap, 2166 pr->hnode = GNUNET_CONTAINER_heap_insert (requests_by_expiration_heap,
@@ -2247,8 +2263,9 @@ handle_start_search (void *cls,
2247 /* FIXME: detect duplicate request; if duplicate, simply update (merge) 2263 /* FIXME: detect duplicate request; if duplicate, simply update (merge)
2248 'pr->replies_seen'! */ 2264 'pr->replies_seen'! */
2249 pr = GNUNET_malloc (sizeof (struct PendingRequest) + 2265 pr = GNUNET_malloc (sizeof (struct PendingRequest) +
2250 (type == GNUNET_DATASTORE_BLOCKTYPE_SBLOCK)?sizeof(GNUNET_HashCode):0); 2266 ((type == GNUNET_DATASTORE_BLOCKTYPE_SBLOCK)?sizeof(GNUNET_HashCode):0));
2251 crl = GNUNET_malloc (sizeof (struct ClientRequestList)); 2267 crl = GNUNET_malloc (sizeof (struct ClientRequestList));
2268 memset (crl, 0, sizeof (struct ClientRequestList));
2252 crl->client_list = cl; 2269 crl->client_list = cl;
2253 GNUNET_CONTAINER_DLL_insert (cl->rl_head, 2270 GNUNET_CONTAINER_DLL_insert (cl->rl_head,
2254 cl->rl_tail, 2271 cl->rl_tail,
@@ -2283,6 +2300,10 @@ handle_start_search (void *cls,
2283 default: 2300 default:
2284 break; 2301 break;
2285 } 2302 }
2303 GNUNET_CONTAINER_multihashmap_put (query_request_map,
2304 &sm->query,
2305 pr,
2306 GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
2286 pr->drq = GNUNET_FS_drq_get (&sm->query, 2307 pr->drq = GNUNET_FS_drq_get (&sm->query,
2287 pr->type, 2308 pr->type,
2288 &process_local_reply, 2309 &process_local_reply,
@@ -2341,6 +2362,10 @@ main_init (struct GNUNET_SCHEDULER_Handle *s,
2341{ 2362{
2342 sched = s; 2363 sched = s;
2343 cfg = c; 2364 cfg = c;
2365 connected_peers = GNUNET_CONTAINER_multihashmap_create (128); // FIXME: get size from config
2366 query_request_map = GNUNET_CONTAINER_multihashmap_create (128); // FIXME: get size from config
2367 peer_request_map = GNUNET_CONTAINER_multihashmap_create (128); // FIXME: get size from config
2368 requests_by_expiration_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
2344 core = GNUNET_CORE_connect (sched, 2369 core = GNUNET_CORE_connect (sched,
2345 cfg, 2370 cfg,
2346 GNUNET_TIME_UNIT_FOREVER_REL, 2371 GNUNET_TIME_UNIT_FOREVER_REL,
@@ -2357,11 +2382,17 @@ main_init (struct GNUNET_SCHEDULER_Handle *s,
2357 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 2382 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
2358 _("Failed to connect to `%s' service.\n"), 2383 _("Failed to connect to `%s' service.\n"),
2359 "core"); 2384 "core");
2385 GNUNET_CONTAINER_multihashmap_destroy (connected_peers);
2386 connected_peers = NULL;
2387 GNUNET_CONTAINER_multihashmap_destroy (query_request_map);
2388 query_request_map = NULL;
2389 GNUNET_CONTAINER_heap_destroy (requests_by_expiration_heap);
2390 requests_by_expiration_heap = NULL;
2391 GNUNET_CONTAINER_multihashmap_destroy (peer_request_map);
2392 peer_request_map = NULL;
2393
2360 return GNUNET_SYSERR; 2394 return GNUNET_SYSERR;
2361 } 2395 }
2362 query_request_map = GNUNET_CONTAINER_multihashmap_create (128); // FIXME: get size from config
2363 peer_request_map = GNUNET_CONTAINER_multihashmap_create (128); // FIXME: get size from config
2364 requests_by_expiration_heap = GNUNET_CONTAINER_heap_create (GNUNET_CONTAINER_HEAP_ORDER_MIN);
2365 GNUNET_SERVER_disconnect_notify (server, 2396 GNUNET_SERVER_disconnect_notify (server,
2366 &handle_client_disconnect, 2397 &handle_client_disconnect,
2367 NULL); 2398 NULL);
diff --git a/src/fs/test_fs_download_data.conf b/src/fs/test_fs_download_data.conf
index d55191a32..5e13cd530 100644
--- a/src/fs/test_fs_download_data.conf
+++ b/src/fs/test_fs_download_data.conf
@@ -36,7 +36,9 @@ HOSTNAME = localhost
36[fs] 36[fs]
37PORT = 42471 37PORT = 42471
38HOSTNAME = localhost 38HOSTNAME = localhost
39#DEBUG = YES 39DEBUG = YES
40PREFIX = valgrind --tool=memcheck --leak-check=yes
41BINARY = /home/grothoff/bin/gnunet-service-fs
40 42
41[testing] 43[testing]
42WEAKRANDOM = YES 44WEAKRANDOM = YES