diff options
author | Christian Grothoff <christian@grothoff.org> | 2014-12-12 00:03:49 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2014-12-12 00:03:49 +0000 |
commit | 1224b6d62b7214a4afca27695ff7d789fb6f93d3 (patch) | |
tree | 66fb08633714e7e0eab91df29ca12e7a7d95f8b9 /src/fs/fs_search.c | |
parent | 9a112a7aa7c1703a9489da7306293ee1b9df7331 (diff) | |
download | gnunet-1224b6d62b7214a4afca27695ff7d789fb6f93d3.tar.gz gnunet-1224b6d62b7214a4afca27695ff7d789fb6f93d3.zip |
start fewer FS probes concurrently, run them all in the same task to avoid undue pressure on the scheduler
Diffstat (limited to 'src/fs/fs_search.c')
-rw-r--r-- | src/fs/fs_search.c | 99 |
1 files changed, 64 insertions, 35 deletions
diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c index a9c9389c4..c85d6d3df 100644 --- a/src/fs/fs_search.c +++ b/src/fs/fs_search.c | |||
@@ -171,7 +171,9 @@ struct GetResultContext | |||
171 | * @return #GNUNET_OK | 171 | * @return #GNUNET_OK |
172 | */ | 172 | */ |
173 | static int | 173 | static int |
174 | get_result_present (void *cls, const struct GNUNET_HashCode * key, void *value) | 174 | get_result_present (void *cls, |
175 | const struct GNUNET_HashCode *key, | ||
176 | void *value) | ||
175 | { | 177 | { |
176 | struct GetResultContext *grc = cls; | 178 | struct GetResultContext *grc = cls; |
177 | struct GNUNET_FS_SearchResult *sr = value; | 179 | struct GNUNET_FS_SearchResult *sr = value; |
@@ -216,7 +218,8 @@ signal_probe_result (struct GNUNET_FS_SearchResult *sr) | |||
216 | * @param tc scheduler context | 218 | * @param tc scheduler context |
217 | */ | 219 | */ |
218 | static void | 220 | static void |
219 | probe_failure_handler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | 221 | probe_failure_handler (void *cls, |
222 | const struct GNUNET_SCHEDULER_TaskContext *tc) | ||
220 | { | 223 | { |
221 | struct GNUNET_FS_SearchResult *sr = cls; | 224 | struct GNUNET_FS_SearchResult *sr = cls; |
222 | 225 | ||
@@ -224,11 +227,7 @@ probe_failure_handler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
224 | sr->availability_trials++; | 227 | sr->availability_trials++; |
225 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | 228 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); |
226 | sr->probe_ctx = NULL; | 229 | sr->probe_ctx = NULL; |
227 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task) | 230 | GNUNET_FS_stop_probe_ping_task_ (sr); |
228 | { | ||
229 | GNUNET_SCHEDULER_cancel (sr->probe_ping_task); | ||
230 | sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK; | ||
231 | } | ||
232 | GNUNET_FS_search_result_sync_ (sr); | 231 | GNUNET_FS_search_result_sync_ (sr); |
233 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 232 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
234 | "Probe #%u for search result %p failed\n", | 233 | "Probe #%u for search result %p failed\n", |
@@ -245,7 +244,8 @@ probe_failure_handler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
245 | * @param tc scheduler context | 244 | * @param tc scheduler context |
246 | */ | 245 | */ |
247 | static void | 246 | static void |
248 | probe_success_handler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | 247 | probe_success_handler (void *cls, |
248 | const struct GNUNET_SCHEDULER_TaskContext *tc) | ||
249 | { | 249 | { |
250 | struct GNUNET_FS_SearchResult *sr = cls; | 250 | struct GNUNET_FS_SearchResult *sr = cls; |
251 | 251 | ||
@@ -254,11 +254,7 @@ probe_success_handler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
254 | sr->availability_success++; | 254 | sr->availability_success++; |
255 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | 255 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); |
256 | sr->probe_ctx = NULL; | 256 | sr->probe_ctx = NULL; |
257 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task) | 257 | GNUNET_FS_stop_probe_ping_task_ (sr); |
258 | { | ||
259 | GNUNET_SCHEDULER_cancel (sr->probe_ping_task); | ||
260 | sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK; | ||
261 | } | ||
262 | GNUNET_FS_search_result_sync_ (sr); | 258 | GNUNET_FS_search_result_sync_ (sr); |
263 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 259 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
264 | "Probe #%u for search result %p succeeded\n", | 260 | "Probe #%u for search result %p succeeded\n", |
@@ -367,20 +363,64 @@ GNUNET_FS_search_probe_progress_ (void *cls, | |||
367 | /** | 363 | /** |
368 | * Task run periodically to remind clients that a probe is active. | 364 | * Task run periodically to remind clients that a probe is active. |
369 | * | 365 | * |
370 | * @param cls the 'struct GNUNET_FS_SearchResult' that we are probing for | 366 | * @param cls the `struct GNUNET_FS_SearchResult` that we are probing for |
371 | * @param tc scheduler context | 367 | * @param tc scheduler context |
372 | */ | 368 | */ |
373 | static void | 369 | static void |
374 | probe_ping_task (void *cls, | 370 | probe_ping_task_cb (void *cls, |
375 | const struct GNUNET_SCHEDULER_TaskContext *tc) | 371 | const struct GNUNET_SCHEDULER_TaskContext *tc) |
376 | { | 372 | { |
377 | struct GNUNET_FS_SearchResult *sr = cls; | 373 | struct GNUNET_FS_Handle *h = cls; |
374 | struct GNUNET_FS_SearchResult *sr; | ||
378 | 375 | ||
379 | signal_probe_result (sr); | 376 | for (sr = h->probes_head; NULL != sr; sr = sr->next) |
380 | sr->probe_ping_task | 377 | if (NULL != sr->probe_ctx->client) |
378 | signal_probe_result (sr); | ||
379 | h->probe_ping_task | ||
381 | = GNUNET_SCHEDULER_add_delayed (GNUNET_FS_PROBE_UPDATE_FREQUENCY, | 380 | = GNUNET_SCHEDULER_add_delayed (GNUNET_FS_PROBE_UPDATE_FREQUENCY, |
382 | &probe_ping_task, | 381 | &probe_ping_task_cb, |
383 | sr); | 382 | h); |
383 | } | ||
384 | |||
385 | |||
386 | /** | ||
387 | * Start the ping task for this search result. | ||
388 | * | ||
389 | * @param sr result to start pinging for. | ||
390 | */ | ||
391 | static void | ||
392 | start_probe_ping_task (struct GNUNET_FS_SearchResult *sr) | ||
393 | { | ||
394 | struct GNUNET_FS_Handle *h = sr->h; | ||
395 | |||
396 | GNUNET_CONTAINER_DLL_insert (h->probes_head, | ||
397 | h->probes_tail, | ||
398 | sr); | ||
399 | if (GNUNET_SCHEDULER_NO_TASK == h->probe_ping_task) | ||
400 | h->probe_ping_task | ||
401 | = GNUNET_SCHEDULER_add_now (&probe_ping_task_cb, | ||
402 | h); | ||
403 | } | ||
404 | |||
405 | |||
406 | /** | ||
407 | * Stop the ping task for this search result. | ||
408 | * | ||
409 | * @param sr result to start pinging for. | ||
410 | */ | ||
411 | void | ||
412 | GNUNET_FS_stop_probe_ping_task_ (struct GNUNET_FS_SearchResult *sr) | ||
413 | { | ||
414 | struct GNUNET_FS_Handle *h = sr->h; | ||
415 | |||
416 | GNUNET_CONTAINER_DLL_remove (h->probes_head, | ||
417 | h->probes_tail, | ||
418 | sr); | ||
419 | if (NULL == h->probes_head) | ||
420 | { | ||
421 | GNUNET_SCHEDULER_cancel (h->probe_ping_task); | ||
422 | h->probe_ping_task = GNUNET_SCHEDULER_NO_TASK; | ||
423 | } | ||
384 | } | 424 | } |
385 | 425 | ||
386 | 426 | ||
@@ -431,9 +471,7 @@ GNUNET_FS_search_start_probe_ (struct GNUNET_FS_SearchResult *sr) | |||
431 | len, sr->anonymity, | 471 | len, sr->anonymity, |
432 | GNUNET_FS_DOWNLOAD_NO_TEMPORARIES | | 472 | GNUNET_FS_DOWNLOAD_NO_TEMPORARIES | |
433 | GNUNET_FS_DOWNLOAD_IS_PROBE, sr, NULL); | 473 | GNUNET_FS_DOWNLOAD_IS_PROBE, sr, NULL); |
434 | sr->probe_ping_task | 474 | start_probe_ping_task (sr); |
435 | = GNUNET_SCHEDULER_add_now (&probe_ping_task, | ||
436 | sr); | ||
437 | } | 475 | } |
438 | 476 | ||
439 | 477 | ||
@@ -480,11 +518,7 @@ GNUNET_FS_search_stop_probe_ (struct GNUNET_FS_SearchResult *sr) | |||
480 | { | 518 | { |
481 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | 519 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); |
482 | sr->probe_ctx = NULL; | 520 | sr->probe_ctx = NULL; |
483 | } | 521 | GNUNET_FS_stop_probe_ping_task_ (sr); |
484 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task) | ||
485 | { | ||
486 | GNUNET_SCHEDULER_cancel (sr->probe_ping_task); | ||
487 | sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK; | ||
488 | } | 522 | } |
489 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) | 523 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) |
490 | { | 524 | { |
@@ -1410,11 +1444,7 @@ search_result_freeze_probes (void *cls, | |||
1410 | { | 1444 | { |
1411 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); | 1445 | GNUNET_FS_download_stop (sr->probe_ctx, GNUNET_YES); |
1412 | sr->probe_ctx = NULL; | 1446 | sr->probe_ctx = NULL; |
1413 | } | 1447 | GNUNET_FS_stop_probe_ping_task_ (sr); |
1414 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_ping_task) | ||
1415 | { | ||
1416 | GNUNET_SCHEDULER_cancel (sr->probe_ping_task); | ||
1417 | sr->probe_ping_task = GNUNET_SCHEDULER_NO_TASK; | ||
1418 | } | 1448 | } |
1419 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) | 1449 | if (GNUNET_SCHEDULER_NO_TASK != sr->probe_cancel_task) |
1420 | { | 1450 | { |
@@ -1692,7 +1722,6 @@ search_result_free (void *cls, | |||
1692 | } | 1722 | } |
1693 | GNUNET_break (NULL == sr->probe_ctx); | 1723 | GNUNET_break (NULL == sr->probe_ctx); |
1694 | GNUNET_break (GNUNET_SCHEDULER_NO_TASK == sr->probe_cancel_task); | 1724 | GNUNET_break (GNUNET_SCHEDULER_NO_TASK == sr->probe_cancel_task); |
1695 | GNUNET_break (GNUNET_SCHEDULER_NO_TASK == sr->probe_ping_task); | ||
1696 | GNUNET_break (NULL == sr->client_info); | 1725 | GNUNET_break (NULL == sr->client_info); |
1697 | GNUNET_free_non_null (sr->serialization); | 1726 | GNUNET_free_non_null (sr->serialization); |
1698 | GNUNET_FS_uri_destroy (sr->uri); | 1727 | GNUNET_FS_uri_destroy (sr->uri); |