Mercurial > dovecot > core-2.2
annotate src/lib/log-throttle.c @ 23007:36e01285b5b8
lib: buffer - Improve header comment for buffer_insert() and buffer_delete().
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Mon, 18 Mar 2019 00:52:37 +0100 |
parents | cb108f786fb4 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
1 /* Copyright (c) 2016-2018 Dovecot authors, see the included COPYING file */ |
20582
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
2 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
5 #include "time-util.h" |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
6 #include "log-throttle.h" |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
7 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
8 struct log_throttle { |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
9 struct log_throttle_settings set; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
10 log_throttle_callback_t *callback; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
11 void *context; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
12 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
13 struct timeval last_time; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
14 unsigned int last_count; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
15 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
16 struct timeout *to_throttled; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
17 }; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
18 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
19 #undef log_throttle_init |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
20 struct log_throttle * |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
21 log_throttle_init(const struct log_throttle_settings *set, |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
22 log_throttle_callback_t *callback, void *context) |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
23 { |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
24 struct log_throttle *throttle; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
25 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
26 i_assert(set->throttle_at_max_per_interval > 0); |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
27 i_assert(set->unthrottle_at_max_per_interval > 0); |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
28 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
29 throttle = i_new(struct log_throttle, 1); |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
30 throttle->set = *set; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
31 if (throttle->set.interval_msecs == 0) |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
32 throttle->set.interval_msecs = 1000; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
33 throttle->callback = callback; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
34 throttle->context = context; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
35 return throttle; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
36 } |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
37 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
38 void log_throttle_deinit(struct log_throttle **_throttle) |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
39 { |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
40 struct log_throttle *throttle = *_throttle; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
41 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
42 *_throttle = NULL; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
43 if (throttle->to_throttled != NULL) |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
44 timeout_remove(&throttle->to_throttled); |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
45 i_free(throttle); |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
46 } |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
47 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
48 static void log_throttle_callback(struct log_throttle *throttle) |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
49 { |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
50 if (throttle->last_count > 0) |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
51 throttle->callback(throttle->last_count, throttle->context); |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
52 if (throttle->last_count < throttle->set.unthrottle_at_max_per_interval) |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
53 timeout_remove(&throttle->to_throttled); |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
54 throttle->last_count = 0; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
55 } |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
56 |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
57 bool log_throttle_accept(struct log_throttle *throttle) |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
58 { |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
59 if (throttle->to_throttled != NULL) { |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
60 /* unthrottling and last_count resets are done only by |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
61 the callback */ |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
62 throttle->last_count++; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
63 return FALSE; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
64 } else if (timeval_diff_msecs(&ioloop_timeval, &throttle->last_time) >= |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
65 (int)throttle->set.interval_msecs) { |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
66 throttle->last_time = ioloop_timeval; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
67 throttle->last_count = 1; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
68 return TRUE; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
69 } else if (++throttle->last_count <= throttle->set.throttle_at_max_per_interval) { |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
70 return TRUE; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
71 } else { |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
72 throttle->last_count = 1; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
73 throttle->to_throttled = |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
74 timeout_add(throttle->set.interval_msecs, |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
75 log_throttle_callback, throttle); |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
76 return FALSE; |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
77 } |
3e02c55136a6
lib: Added log throttling API.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
78 } |