Changeset a2e53dc0c9ff0d9e50eb095b926924850a6c8ff8
- Timestamp:
- 02/02/08 23:20:43
(5 years ago)
- Author:
- Theo Schlossnagle <jesus@omniti.com>
- git-committer:
- Theo Schlossnagle <jesus@omniti.com> 1201994443 +0000
- git-parent:
[57a327349609ef60a33dc6da15017c5d6642320a]
- git-author:
- Theo Schlossnagle <jesus@omniti.com> 1201994443 +0000
- Message:
implement staggered start skilz
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r57a3273 |
ra2e53dc |
|
| 718 | 718 | } |
|---|
| 719 | 719 | static int serf_schedule_next(noit_module_t *self, |
|---|
| 720 | | eventer_t e, noit_check_t *check, |
|---|
| | 720 | struct timeval *last_check, noit_check_t *check, |
|---|
| 721 | 721 | struct timeval *now) { |
|---|
| 722 | 722 | eventer_t newe; |
|---|
| 723 | | struct timeval last_check = { 0L, 0L }; |
|---|
| 724 | 723 | struct timeval period, earliest; |
|---|
| 725 | 724 | serf_closure_t *ccl; |
|---|
| … | … | |
| 734 | 733 | else |
|---|
| 735 | 734 | gettimeofday(&earliest, NULL); |
|---|
| 736 | | if(e) memcpy(&last_check, &e->whence, sizeof(last_check)); |
|---|
| 737 | 735 | period.tv_sec = check->period / 1000; |
|---|
| 738 | 736 | period.tv_usec = (check->period % 1000) * 1000; |
|---|
| 739 | 737 | |
|---|
| 740 | 738 | newe = eventer_alloc(); |
|---|
| 741 | | memcpy(&newe->whence, &last_check, sizeof(last_check)); |
|---|
| | 739 | memcpy(&newe->whence, last_check, sizeof(*last_check)); |
|---|
| 742 | 740 | add_timeval(newe->whence, period, &newe->whence); |
|---|
| 743 | 741 | if(compare_timeval(newe->whence, earliest) < 0) |
|---|
| … | … | |
| 757 | 755 | struct timeval *now) { |
|---|
| 758 | 756 | serf_closure_t *cl = (serf_closure_t *)closure; |
|---|
| 759 | | serf_schedule_next(cl->self, e, cl->check, now); |
|---|
| | 757 | serf_schedule_next(cl->self, &e->whence, cl->check, now); |
|---|
| 760 | 758 | serf_initiate(cl->self, cl->check); |
|---|
| 761 | 759 | free(cl); |
|---|
| … | … | |
| 770 | 768 | } |
|---|
| 771 | 769 | /* If check->fire_event, we're already scheduled... */ |
|---|
| 772 | | if(!check->fire_event) |
|---|
| 773 | | serf_schedule_next(self, NULL, check, NULL); |
|---|
| | 770 | if(!check->fire_event) { |
|---|
| | 771 | struct timeval epoch = { 0L, 0L }; |
|---|
| | 772 | noit_check_fake_last_check(check, &epoch, NULL); |
|---|
| | 773 | serf_schedule_next(self, &epoch, check, NULL); |
|---|
| | 774 | } |
|---|
| 774 | 775 | return 0; |
|---|
| 775 | 776 | } |
|---|
| … | … | |
| 782 | 783 | return 0; |
|---|
| 783 | 784 | } |
|---|
| 784 | | if(!check->fire_event) |
|---|
| 785 | | serf_schedule_next(self, NULL, check, NULL); |
|---|
| | 785 | if(!check->fire_event) { |
|---|
| | 786 | struct timeval epoch = { 0L, 0L }; |
|---|
| | 787 | noit_check_fake_last_check(check, &epoch, NULL); |
|---|
| | 788 | serf_schedule_next(self, &epoch, check, NULL); |
|---|
| | 789 | } |
|---|
| 786 | 790 | return 0; |
|---|
| 787 | 791 | } |
|---|
| r57a3273 |
ra2e53dc |
|
| 415 | 415 | } |
|---|
| 416 | 416 | static int ping_icmp_schedule_next(noit_module_t *self, |
|---|
| 417 | | eventer_t e, noit_check_t *check, |
|---|
| | 417 | struct timeval *last_check, |
|---|
| | 418 | noit_check_t *check, |
|---|
| 418 | 419 | struct timeval *now) { |
|---|
| 419 | 420 | eventer_t newe; |
|---|
| 420 | | struct timeval last_check = { 0L, 0L }; |
|---|
| 421 | 421 | struct timeval period, earliest; |
|---|
| 422 | 422 | struct ping_closure *pcl; |
|---|
| … | … | |
| 431 | 431 | else |
|---|
| 432 | 432 | gettimeofday(&earliest, NULL); |
|---|
| 433 | | if(e) memcpy(&last_check, &e->whence, sizeof(last_check)); |
|---|
| 434 | 433 | period.tv_sec = check->period / 1000; |
|---|
| 435 | 434 | period.tv_usec = (check->period % 1000) * 1000; |
|---|
| 436 | 435 | |
|---|
| 437 | 436 | newe = eventer_alloc(); |
|---|
| 438 | | memcpy(&newe->whence, &last_check, sizeof(last_check)); |
|---|
| | 437 | memcpy(&newe->whence, last_check, sizeof(*last_check)); |
|---|
| 439 | 438 | add_timeval(newe->whence, period, &newe->whence); |
|---|
| 440 | 439 | if(compare_timeval(newe->whence, earliest) < 0) |
|---|
| … | … | |
| 454 | 453 | struct timeval *now) { |
|---|
| 455 | 454 | struct ping_closure *cl = (struct ping_closure *)closure; |
|---|
| 456 | | ping_icmp_schedule_next(cl->self, e, cl->check, now); |
|---|
| | 455 | ping_icmp_schedule_next(cl->self, &e->whence, cl->check, now); |
|---|
| 457 | 456 | ping_icmp_send(cl->self, cl->check); |
|---|
| 458 | 457 | free(cl); |
|---|
| … | … | |
| 466 | 465 | return 0; |
|---|
| 467 | 466 | } |
|---|
| 468 | | if(!check->fire_event) |
|---|
| 469 | | ping_icmp_schedule_next(self, NULL, check, NULL); |
|---|
| | 467 | if(!check->fire_event) { |
|---|
| | 468 | struct timeval epoch; |
|---|
| | 469 | noit_check_fake_last_check(check, &epoch, NULL); |
|---|
| | 470 | ping_icmp_schedule_next(self, &epoch, check, NULL); |
|---|
| | 471 | } |
|---|
| 470 | 472 | return 0; |
|---|
| 471 | 473 | } |
|---|
| r57a3273 |
ra2e53dc |
|
| 7 | 7 | |
|---|
| 8 | 8 | #include <stdio.h> |
|---|
| | 9 | #include <stdlib.h> |
|---|
| 9 | 10 | #include <unistd.h> |
|---|
| 10 | 11 | #include <assert.h> |
|---|
| … | … | |
| 20 | 21 | #include "eventer/eventer.h" |
|---|
| 21 | 22 | |
|---|
| | 23 | /* 60 seconds of possible stutter */ |
|---|
| | 24 | #define MAX_INITIAL_STUTTER (60*1000) |
|---|
| | 25 | |
|---|
| 22 | 26 | static noit_hash_table polls = NOIT_HASH_EMPTY; |
|---|
| 23 | 27 | static noit_skiplist polls_by_name = { 0 }; |
|---|
| … | … | |
| 54 | 58 | if((rv = strcmp(ac->name, bc->name)) != 0) return rv; |
|---|
| 55 | 59 | return 0; |
|---|
| | 60 | } |
|---|
| | 61 | int |
|---|
| | 62 | noit_check_max_initial_stutter() { |
|---|
| | 63 | return MAX_INITIAL_STUTTER; |
|---|
| | 64 | } |
|---|
| | 65 | void |
|---|
| | 66 | noit_check_fake_last_check(noit_check_t *check, |
|---|
| | 67 | struct timeval *lc, struct timeval *_now) { |
|---|
| | 68 | struct timeval now, period; |
|---|
| | 69 | double r; |
|---|
| | 70 | int offset; |
|---|
| | 71 | |
|---|
| | 72 | r = drand48(); |
|---|
| | 73 | offset = r * (MIN(MAX_INITIAL_STUTTER, check->period)); |
|---|
| | 74 | period.tv_sec = (check->period - offset) / 1000; |
|---|
| | 75 | period.tv_usec = ((check->period - offset) % 1000) * 1000; |
|---|
| | 76 | if(!_now) { |
|---|
| | 77 | gettimeofday(&now, NULL); |
|---|
| | 78 | _now = &now; |
|---|
| | 79 | } |
|---|
| | 80 | sub_timeval(*_now, period, lc); |
|---|
| 56 | 81 | } |
|---|
| 57 | 82 | void |
|---|
| r57a3273 |
ra2e53dc |
|
| 96 | 96 | API_EXPORT(void) noit_poller_load_checks(); |
|---|
| 97 | 97 | |
|---|
| | 98 | API_EXPORT(void) |
|---|
| | 99 | noit_check_fake_last_check(noit_check_t *check, |
|---|
| | 100 | struct timeval *lc, struct timeval *_now); |
|---|
| | 101 | API_EXPORT(int) noit_check_max_initial_stutter(); |
|---|
| | 102 | |
|---|
| 98 | 103 | API_EXPORT(int) |
|---|
| 99 | 104 | noit_poller_schedule(const char *target, |
|---|