action-executor: consider action firing policy on action execution
[lttng-tools.git] / src / common / actions / rotate-session.c
CommitLineData
bfb2ec6a
SM
1/*
2 * Copyright (C) 2019 Simon Marchi <simon.marchi@efficios.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-only
5 *
6 */
7
8#include <assert.h>
9#include <common/error.h>
10#include <common/macros.h>
11#include <lttng/action/action-internal.h>
c2c58434
JR
12#include <lttng/action/firing-policy-internal.h>
13#include <lttng/action/firing-policy.h>
bfb2ec6a
SM
14#include <lttng/action/rotate-session-internal.h>
15#include <lttng/action/rotate-session.h>
16
17#define IS_ROTATE_SESSION_ACTION(action) \
17182cfd 18 (lttng_action_get_type(action) == LTTNG_ACTION_TYPE_ROTATE_SESSION)
bfb2ec6a
SM
19
20struct lttng_action_rotate_session {
21 struct lttng_action parent;
22
23 /* Owned by this. */
24 char *session_name;
c2c58434 25 struct lttng_firing_policy *policy;
bfb2ec6a
SM
26};
27
28struct lttng_action_rotate_session_comm {
29 /* Includes the trailing \0. */
30 uint32_t session_name_len;
31
32 /*
33 * Variable data:
34 *
35 * - session name (null terminated)
c2c58434 36 * - policy
bfb2ec6a
SM
37 */
38 char data[];
39} LTTNG_PACKED;
40
2d57482c
JR
41static const struct lttng_firing_policy *
42lttng_action_rotate_session_internal_get_firing_policy(
43 const struct lttng_action *action);
44
bfb2ec6a
SM
45static struct lttng_action_rotate_session *action_rotate_session_from_action(
46 struct lttng_action *action)
47{
48 assert(action);
49
50 return container_of(action, struct lttng_action_rotate_session, parent);
51}
52
53static const struct lttng_action_rotate_session *
54action_rotate_session_from_action_const(const struct lttng_action *action)
55{
56 assert(action);
57
58 return container_of(action, struct lttng_action_rotate_session, parent);
59}
60
61static bool lttng_action_rotate_session_validate(struct lttng_action *action)
62{
63 bool valid;
64 struct lttng_action_rotate_session *action_rotate_session;
65
66 if (!action) {
67 valid = false;
68 goto end;
69 }
70
71 action_rotate_session = action_rotate_session_from_action(action);
72
73 /* A non-empty session name is mandatory. */
74 if (!action_rotate_session->session_name ||
75 strlen(action_rotate_session->session_name) == 0) {
76 valid = false;
77 goto end;
78 }
79
80 valid = true;
81end:
82 return valid;
83}
84
85static bool lttng_action_rotate_session_is_equal(
86 const struct lttng_action *_a, const struct lttng_action *_b)
87{
88 bool is_equal = false;
89 const struct lttng_action_rotate_session *a, *b;
90
91 a = action_rotate_session_from_action_const(_a);
92 b = action_rotate_session_from_action_const(_b);
93
94 /* Action is not valid if this is not true. */
95 assert(a->session_name);
96 assert(b->session_name);
97 if (strcmp(a->session_name, b->session_name)) {
98 goto end;
99 }
100
c2c58434 101 is_equal = lttng_firing_policy_is_equal(a->policy, b->policy);
bfb2ec6a
SM
102end:
103 return is_equal;
104}
105static int lttng_action_rotate_session_serialize(
c0a66c84 106 struct lttng_action *action, struct lttng_payload *payload)
bfb2ec6a
SM
107{
108 struct lttng_action_rotate_session *action_rotate_session;
109 struct lttng_action_rotate_session_comm comm;
110 size_t session_name_len;
111 int ret;
112
113 assert(action);
c0a66c84 114 assert(payload);
bfb2ec6a
SM
115
116 action_rotate_session = action_rotate_session_from_action(action);
117
118 assert(action_rotate_session->session_name);
119
120 DBG("Serializing rotate session action: session-name: %s",
121 action_rotate_session->session_name);
122
123 session_name_len = strlen(action_rotate_session->session_name) + 1;
124 comm.session_name_len = session_name_len;
125
c0a66c84
JG
126 ret = lttng_dynamic_buffer_append(
127 &payload->buffer, &comm, sizeof(comm));
bfb2ec6a
SM
128 if (ret) {
129 ret = -1;
130 goto end;
131 }
132
c0a66c84 133 ret = lttng_dynamic_buffer_append(&payload->buffer,
bfb2ec6a
SM
134 action_rotate_session->session_name, session_name_len);
135 if (ret) {
136 ret = -1;
137 goto end;
138 }
139
c2c58434
JR
140 ret = lttng_firing_policy_serialize(
141 action_rotate_session->policy, payload);
142 if (ret) {
143 ret = -1;
144 goto end;
145 }
bfb2ec6a
SM
146end:
147 return ret;
148}
149
150static void lttng_action_rotate_session_destroy(struct lttng_action *action)
151{
152 struct lttng_action_rotate_session *action_rotate_session;
153
154 if (!action) {
155 goto end;
156 }
157
158 action_rotate_session = action_rotate_session_from_action(action);
159
c2c58434 160 lttng_firing_policy_destroy(action_rotate_session->policy);
bfb2ec6a
SM
161 free(action_rotate_session->session_name);
162 free(action_rotate_session);
163
164end:
165 return;
166}
167
c0a66c84
JG
168ssize_t lttng_action_rotate_session_create_from_payload(
169 struct lttng_payload_view *view,
bfb2ec6a
SM
170 struct lttng_action **p_action)
171{
c2c58434 172 ssize_t consumed_len, ret;
bfb2ec6a
SM
173 const struct lttng_action_rotate_session_comm *comm;
174 const char *session_name;
175 struct lttng_action *action;
176 enum lttng_action_status status;
c2c58434 177 struct lttng_firing_policy *policy = NULL;
bfb2ec6a
SM
178
179 action = lttng_action_rotate_session_create();
180 if (!action) {
181 consumed_len = -1;
182 goto end;
183 }
184
c0a66c84 185 comm = (typeof(comm)) view->buffer.data;
bfb2ec6a
SM
186 session_name = (const char *) &comm->data;
187
188 if (!lttng_buffer_view_contains_string(
c0a66c84 189 &view->buffer, session_name, comm->session_name_len)) {
bfb2ec6a
SM
190 consumed_len = -1;
191 goto end;
192 }
c2c58434
JR
193 consumed_len = sizeof(*comm) + comm->session_name_len;
194
195 /* Firing policy. */
196 {
197 struct lttng_payload_view policy_view =
198 lttng_payload_view_from_view(
199 view, consumed_len, -1);
200 ret = lttng_firing_policy_create_from_payload(
201 &policy_view, &policy);
202 if (ret < 0) {
203 consumed_len = -1;
204 goto end;
205 }
206 consumed_len += ret;
207 }
bfb2ec6a
SM
208
209 status = lttng_action_rotate_session_set_session_name(
210 action, session_name);
211 if (status != LTTNG_ACTION_STATUS_OK) {
212 consumed_len = -1;
213 goto end;
214 }
215
c2c58434
JR
216 assert(policy);
217 status = lttng_action_rotate_session_set_firing_policy(action, policy);
218 if (status != LTTNG_ACTION_STATUS_OK) {
219 consumed_len = -1;
220 goto end;
221 }
222
bfb2ec6a
SM
223 *p_action = action;
224 action = NULL;
225
226end:
c2c58434 227 lttng_firing_policy_destroy(policy);
bfb2ec6a
SM
228 lttng_action_rotate_session_destroy(action);
229
230 return consumed_len;
231}
232
233struct lttng_action *lttng_action_rotate_session_create(void)
234{
c2c58434
JR
235 struct lttng_action *action = NULL;
236 struct lttng_firing_policy *policy = NULL;
237 enum lttng_action_status status;
238
239 /* Create a every N = 1 firing policy. */
240 policy = lttng_firing_policy_every_n_create(1);
241 if (!policy) {
242 goto end;
243 }
bfb2ec6a
SM
244
245 action = zmalloc(sizeof(struct lttng_action_rotate_session));
246 if (!action) {
247 goto end;
248 }
249
250 lttng_action_init(action, LTTNG_ACTION_TYPE_ROTATE_SESSION,
251 lttng_action_rotate_session_validate,
252 lttng_action_rotate_session_serialize,
253 lttng_action_rotate_session_is_equal,
2d57482c
JR
254 lttng_action_rotate_session_destroy,
255 lttng_action_rotate_session_internal_get_firing_policy);
bfb2ec6a 256
c2c58434
JR
257 status = lttng_action_rotate_session_set_firing_policy(action, policy);
258 if (status != LTTNG_ACTION_STATUS_OK) {
259 free(action);
260 action = NULL;
261 goto end;
262 }
263
bfb2ec6a 264end:
c2c58434 265 lttng_firing_policy_destroy(policy);
bfb2ec6a
SM
266 return action;
267}
268
269enum lttng_action_status lttng_action_rotate_session_set_session_name(
270 struct lttng_action *action, const char *session_name)
271{
272 struct lttng_action_rotate_session *action_rotate_session;
273 enum lttng_action_status status;
274
275 if (!action || !IS_ROTATE_SESSION_ACTION(action) || !session_name ||
276 strlen(session_name) == 0) {
277 status = LTTNG_ACTION_STATUS_INVALID;
278 goto end;
279 }
280
281 action_rotate_session = action_rotate_session_from_action(action);
282
283 free(action_rotate_session->session_name);
284
285 action_rotate_session->session_name = strdup(session_name);
286 if (!action_rotate_session->session_name) {
287 status = LTTNG_ACTION_STATUS_ERROR;
288 goto end;
289 }
290
291 status = LTTNG_ACTION_STATUS_OK;
292end:
293 return status;
294}
295
296enum lttng_action_status lttng_action_rotate_session_get_session_name(
297 const struct lttng_action *action, const char **session_name)
298{
299 const struct lttng_action_rotate_session *action_rotate_session;
300 enum lttng_action_status status;
301
302 if (!action || !IS_ROTATE_SESSION_ACTION(action) || !session_name) {
303 status = LTTNG_ACTION_STATUS_INVALID;
304 goto end;
305 }
306
307 action_rotate_session = action_rotate_session_from_action_const(action);
308
309 *session_name = action_rotate_session->session_name;
310
311 status = LTTNG_ACTION_STATUS_OK;
312end:
313 return status;
314}
c2c58434
JR
315
316enum lttng_action_status lttng_action_rotate_session_set_firing_policy(
317 struct lttng_action *action,
318 const struct lttng_firing_policy *policy)
319{
320 enum lttng_action_status status;
321 struct lttng_action_rotate_session *rotate_session_action;
322 struct lttng_firing_policy *copy = NULL;
323
324 if (!action || !policy || !IS_ROTATE_SESSION_ACTION(action)) {
325 status = LTTNG_ACTION_STATUS_INVALID;
326 goto end;
327 }
328
329 copy = lttng_firing_policy_copy(policy);
330 if (!copy) {
331 status = LTTNG_ACTION_STATUS_ERROR;
332 goto end;
333 }
334
335 rotate_session_action = action_rotate_session_from_action(action);
336
337 /* Free the previous firing policy .*/
338 lttng_firing_policy_destroy(rotate_session_action->policy);
339
340 /* Assign the policy. */
341 rotate_session_action->policy = copy;
342 status = LTTNG_ACTION_STATUS_OK;
343 copy = NULL;
344
345end:
346 lttng_firing_policy_destroy(copy);
347 return status;
348}
349
350enum lttng_action_status lttng_action_rotate_session_get_firing_policy(
351 const struct lttng_action *action,
352 const struct lttng_firing_policy **policy)
353{
354 enum lttng_action_status status;
355 const struct lttng_action_rotate_session *rotate_session_action;
356
357 if (!action || !policy || !IS_ROTATE_SESSION_ACTION(action)) {
358 status = LTTNG_ACTION_STATUS_INVALID;
359 goto end;
360 }
361
362 rotate_session_action = action_rotate_session_from_action_const(action);
363
364 *policy = rotate_session_action->policy;
365 status = LTTNG_ACTION_STATUS_OK;
366end:
367 return status;
368}
2d57482c
JR
369
370static const struct lttng_firing_policy *
371lttng_action_rotate_session_internal_get_firing_policy(
372 const struct lttng_action *action)
373{
374 const struct lttng_action_rotate_session *_action;
375 _action = action_rotate_session_from_action_const(action);
376
377 return _action->policy;
378}
This page took 0.039475 seconds and 4 git commands to generate.