diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-02-01 12:28:34 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-02-01 12:28:34 +0000 |
commit | 23c492b43c9f732575cce708bc8cb0f537d0e62e (patch) | |
tree | 24040168b740ac64ac6e1f06b5d667e187cbf30a /src/fs | |
parent | 1ae18596e812235ee505338bb2fbfd445ae9d6cf (diff) | |
download | gnunet-23c492b43c9f732575cce708bc8cb0f537d0e62e.tar.gz gnunet-23c492b43c9f732575cce708bc8cb0f537d0e62e.zip |
fixes
Diffstat (limited to 'src/fs')
-rw-r--r-- | src/fs/gnunet-service-fs.c | 73 | ||||
-rw-r--r-- | src/fs/test_fs_download_data.conf | 4 |
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 | |||
928 | shutdown_task (void *cls, | 927 | shutdown_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] |
37 | PORT = 42471 | 37 | PORT = 42471 |
38 | HOSTNAME = localhost | 38 | HOSTNAME = localhost |
39 | #DEBUG = YES | 39 | DEBUG = YES |
40 | PREFIX = valgrind --tool=memcheck --leak-check=yes | ||
41 | BINARY = /home/grothoff/bin/gnunet-service-fs | ||
40 | 42 | ||
41 | [testing] | 43 | [testing] |
42 | WEAKRANDOM = YES | 44 | WEAKRANDOM = YES |