aboutsummaryrefslogtreecommitdiff
path: root/src/util/helper.c
diff options
context:
space:
mode:
authorMatthias Wachs <wachs@net.in.tum.de>2015-02-20 12:46:17 +0000
committerMatthias Wachs <wachs@net.in.tum.de>2015-02-20 12:46:17 +0000
commitcacd1bd4aa5b91638bbf6217fbbdcc4aa5d14df6 (patch)
tree0be4fc4f374485dbbdf1840e41daf16a4cb899c4 /src/util/helper.c
parent3edb2af8cdb0b5691801eadf322500899080e57e (diff)
downloadgnunet-cacd1bd4aa5b91638bbf6217fbbdcc4aa5d14df6.tar.gz
gnunet-cacd1bd4aa5b91638bbf6217fbbdcc4aa5d14df6.zip
implement linear back off for restart attempts
Diffstat (limited to 'src/util/helper.c')
-rw-r--r--src/util/helper.c41
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,