Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 :
4 : Utility routines
5 :
6 : Copyright (C) 2020 Ralph Boehme <slow@samba.org>
7 :
8 : This program is free software; you can redistribute it and/or modify
9 : it under the terms of the GNU General Public License as published by
10 : the Free Software Foundation; either version 3 of the License, or
11 : (at your option) any later version.
12 :
13 : This program is distributed in the hope that it will be useful,
14 : but WITHOUT ANY WARRANTY; without even the implied warranty of
15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 : GNU General Public License for more details.
17 :
18 : You should have received a copy of the GNU General Public License
19 : along with this program. If not, see <http://www.gnu.org/licenses/>.
20 : */
21 :
22 : #include "includes.h"
23 : #include "lib/tevent/tevent.h"
24 : #include "lib/util/unix_privs.h"
25 : #include "server_util.h"
26 :
27 : struct samba_tevent_trace_state {
28 : size_t events;
29 : time_t last_logsize_check;
30 : };
31 :
32 135 : struct samba_tevent_trace_state *create_samba_tevent_trace_state(
33 : TALLOC_CTX *mem_ctx)
34 : {
35 135 : return talloc_zero(mem_ctx, struct samba_tevent_trace_state);
36 : }
37 :
38 44055324 : void samba_tevent_trace_callback(enum tevent_trace_point point,
39 : void *private_data)
40 : {
41 38637279 : struct samba_tevent_trace_state *state =
42 5418045 : talloc_get_type_abort(private_data,
43 : struct samba_tevent_trace_state);
44 44055324 : time_t now = time(NULL);
45 44055324 : bool do_check_logs = false;
46 44055324 : void *priv = NULL;
47 :
48 44055324 : switch (point) {
49 9441275 : case TEVENT_TRACE_BEFORE_WAIT:
50 9441275 : break;
51 34614049 : default:
52 34614049 : return;
53 : }
54 :
55 9441275 : state->events++;
56 :
57 : /*
58 : * Throttling by some random numbers. smbd uses a similar logic
59 : * checking every 50 SMB requests. Assuming 4 events per request
60 : * we get to the number of 200.
61 : */
62 9441275 : if ((state->events % 200) == 0) {
63 46866 : do_check_logs = true;
64 : }
65 : /*
66 : * Throttling by some delay, choosing 29 to avoid lockstep with
67 : * the default tevent tickle timer.
68 : */
69 9441275 : if ((state->last_logsize_check + 29) < now) {
70 9441275 : do_check_logs = true;
71 : }
72 :
73 9441275 : if (!do_check_logs) {
74 0 : return;
75 : }
76 :
77 : /*
78 : * need_to_check_log_size() checks both the number of messages
79 : * that have been logged and if the logging backend is actually
80 : * going to file. We want to bypass the "number of messages"
81 : * check, so we have to call force_check_log_size() before.
82 : */
83 9441275 : force_check_log_size();
84 9441275 : if (!need_to_check_log_size()) {
85 9441275 : return;
86 : }
87 :
88 0 : priv = root_privileges();
89 0 : check_log_size();
90 0 : TALLOC_FREE(priv);
91 :
92 0 : state->last_logsize_check = now;
93 0 : return;
94 : }
|