diff options
Diffstat (limited to 'src/util/helper.c')
-rw-r--r-- | src/util/helper.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/util/helper.c b/src/util/helper.c index ea9895ddf..42f2fc487 100644 --- a/src/util/helper.c +++ b/src/util/helper.c | |||
@@ -159,6 +159,10 @@ struct GNUNET_HELPER_Handle | |||
159 | */ | 159 | */ |
160 | int with_control_pipe; | 160 | int with_control_pipe; |
161 | 161 | ||
162 | /** | ||
163 | * Count start attempts to increase linear back off | ||
164 | */ | ||
165 | unsigned int retry_back_off; | ||
162 | }; | 166 | }; |
163 | 167 | ||
164 | 168 | ||
@@ -346,8 +350,9 @@ helper_read (void *cls, | |||
346 | } | 350 | } |
347 | stop_helper (h, GNUNET_NO); | 351 | stop_helper (h, GNUNET_NO); |
348 | /* Restart the helper */ | 352 | /* Restart the helper */ |
349 | h->restart_task = | 353 | h->restart_task = GNUNET_SCHEDULER_add_delayed( |
350 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &restart_task, h); | 354 | GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, |
355 | h->retry_back_off), &restart_task, h); | ||
351 | return; | 356 | return; |
352 | } | 357 | } |
353 | if (0 == t) | 358 | if (0 == t) |
@@ -365,9 +370,9 @@ helper_read (void *cls, | |||
365 | } | 370 | } |
366 | stop_helper (h, GNUNET_NO); | 371 | stop_helper (h, GNUNET_NO); |
367 | /* Restart the helper */ | 372 | /* Restart the helper */ |
368 | h->restart_task = | 373 | h->restart_task = GNUNET_SCHEDULER_add_delayed( |
369 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, | 374 | GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, |
370 | &restart_task, h); | 375 | h->retry_back_off), &restart_task, h); |
371 | return; | 376 | return; |
372 | } | 377 | } |
373 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 378 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -390,9 +395,9 @@ helper_read (void *cls, | |||
390 | } | 395 | } |
391 | stop_helper (h, GNUNET_NO); | 396 | stop_helper (h, GNUNET_NO); |
392 | /* Restart the helper */ | 397 | /* Restart the helper */ |
393 | h->restart_task = | 398 | h->restart_task = GNUNET_SCHEDULER_add_delayed( |
394 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, | 399 | GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, |
395 | &restart_task, h); | 400 | h->retry_back_off), &restart_task, h); |
396 | return; | 401 | return; |
397 | } | 402 | } |
398 | } | 403 | } |
@@ -413,8 +418,9 @@ start_helper (struct GNUNET_HELPER_Handle *h) | |||
413 | /* out of file descriptors? try again later... */ | 418 | /* out of file descriptors? try again later... */ |
414 | stop_helper (h, GNUNET_NO); | 419 | stop_helper (h, GNUNET_NO); |
415 | h->restart_task = | 420 | h->restart_task = |
416 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, | 421 | GNUNET_SCHEDULER_add_delayed( |
417 | &restart_task, h); | 422 | GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, |
423 | h->retry_back_off), &restart_task, h); | ||
418 | return; | 424 | return; |
419 | } | 425 | } |
420 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 426 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -433,9 +439,9 @@ start_helper (struct GNUNET_HELPER_Handle *h) | |||
433 | { | 439 | { |
434 | /* failed to start process? try again later... */ | 440 | /* failed to start process? try again later... */ |
435 | stop_helper (h, GNUNET_NO); | 441 | stop_helper (h, GNUNET_NO); |
436 | h->restart_task = | 442 | h->restart_task = GNUNET_SCHEDULER_add_delayed( |
437 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, | 443 | GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, |
438 | &restart_task, h); | 444 | h->retry_back_off), &restart_task, h); |
439 | return; | 445 | return; |
440 | } | 446 | } |
441 | GNUNET_DISK_pipe_close_end (h->helper_out, GNUNET_DISK_PIPE_END_WRITE); | 447 | GNUNET_DISK_pipe_close_end (h->helper_out, GNUNET_DISK_PIPE_END_WRITE); |
@@ -461,6 +467,8 @@ restart_task (void *cls, | |||
461 | struct GNUNET_HELPER_Handle*h = cls; | 467 | struct GNUNET_HELPER_Handle*h = cls; |
462 | 468 | ||
463 | h->restart_task = NULL; | 469 | h->restart_task = NULL; |
470 | h->retry_back_off++; | ||
471 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "%u\n",h->retry_back_off); | ||
464 | start_helper (h); | 472 | start_helper (h); |
465 | } | 473 | } |
466 | 474 | ||
@@ -508,6 +516,7 @@ GNUNET_HELPER_start (int with_control_pipe, | |||
508 | if (NULL != cb) | 516 | if (NULL != cb) |
509 | h->mst = GNUNET_SERVER_mst_create (cb, h->cb_cls); | 517 | h->mst = GNUNET_SERVER_mst_create (cb, h->cb_cls); |
510 | h->exp_cb = exp_cb; | 518 | h->exp_cb = exp_cb; |
519 | h->retry_back_off = 0; | ||
511 | start_helper (h); | 520 | start_helper (h); |
512 | return h; | 521 | return h; |
513 | } | 522 | } |
@@ -619,9 +628,9 @@ helper_write (void *cls, | |||
619 | "Stopping and restarting helper task!\n"); | 628 | "Stopping and restarting helper task!\n"); |
620 | stop_helper (h, GNUNET_NO); | 629 | stop_helper (h, GNUNET_NO); |
621 | /* Restart the helper */ | 630 | /* Restart the helper */ |
622 | h->restart_task = | 631 | h->restart_task = GNUNET_SCHEDULER_add_delayed( |
623 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, | 632 | GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, |
624 | &restart_task, h); | 633 | h->retry_back_off), &restart_task, h); |
625 | return; | 634 | return; |
626 | } | 635 | } |
627 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 636 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |