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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }