aboutsummaryrefslogtreecommitdiff
path: root/src/fs/fs_search.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2014-12-12 00:03:49 +0000
committerChristian Grothoff <christian@grothoff.org>2014-12-12 00:03:49 +0000
commit1224b6d62b7214a4afca27695ff7d789fb6f93d3 (patch)
tree66fb08633714e7e0eab91df29ca12e7a7d95f8b9 /src/fs/fs_search.c
parent9a112a7aa7c1703a9489da7306293ee1b9df7331 (diff)
downloadgnunet-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.c99
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 */
173static int 173static int
174get_result_present (void *cls, const struct GNUNET_HashCode * key, void *value) 174get_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 */
218static void 220static void
219probe_failure_handler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 221probe_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 */
247static void 246static void
248probe_success_handler (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) 247probe_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 */
373static void 369static void
374probe_ping_task (void *cls, 370probe_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 */
391static void
392start_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 */
411void
412GNUNET_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);