clang-tidy: add Chrome-inspired checks
[lttng-tools.git] / src / common / actions / rotate-session.cpp
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
c9e313bc
SM
8#include <common/error.hpp>
9#include <common/macros.hpp>
10#include <common/mi-lttng.hpp>
28ab034a 11
c9e313bc
SM
12#include <lttng/action/action-internal.hpp>
13#include <lttng/action/rate-policy-internal.hpp>
7f4d5b07 14#include <lttng/action/rate-policy.h>
c9e313bc 15#include <lttng/action/rotate-session-internal.hpp>
bfb2ec6a
SM
16#include <lttng/action/rotate-session.h>
17
18#define IS_ROTATE_SESSION_ACTION(action) \
17182cfd 19 (lttng_action_get_type(action) == LTTNG_ACTION_TYPE_ROTATE_SESSION)
bfb2ec6a 20
f1494934 21namespace {
bfb2ec6a
SM
22struct lttng_action_rotate_session {
23 struct lttng_action parent;
24
25 /* Owned by this. */
26 char *session_name;
7f4d5b07 27 struct lttng_rate_policy *policy;
bfb2ec6a
SM
28};
29
30struct lttng_action_rotate_session_comm {
31 /* Includes the trailing \0. */
32 uint32_t session_name_len;
33
34 /*
35 * Variable data:
36 *
37 * - session name (null terminated)
c2c58434 38 * - policy
bfb2ec6a
SM
39 */
40 char data[];
41} LTTNG_PACKED;
f1494934 42} /* namespace */
bfb2ec6a 43
7f4d5b07 44static const struct lttng_rate_policy *
28ab034a 45lttng_action_rotate_session_internal_get_rate_policy(const struct lttng_action *action);
2d57482c 46
28ab034a
JG
47static struct lttng_action_rotate_session *
48action_rotate_session_from_action(struct lttng_action *action)
bfb2ec6a 49{
a0377dfe 50 LTTNG_ASSERT(action);
bfb2ec6a 51
0114db0e 52 return lttng::utils::container_of(action, &lttng_action_rotate_session::parent);
bfb2ec6a
SM
53}
54
55static const struct lttng_action_rotate_session *
56action_rotate_session_from_action_const(const struct lttng_action *action)
57{
a0377dfe 58 LTTNG_ASSERT(action);
bfb2ec6a 59
0114db0e 60 return lttng::utils::container_of(action, &lttng_action_rotate_session::parent);
bfb2ec6a
SM
61}
62
63static bool lttng_action_rotate_session_validate(struct lttng_action *action)
64{
65 bool valid;
66 struct lttng_action_rotate_session *action_rotate_session;
67
68 if (!action) {
69 valid = false;
70 goto end;
71 }
72
73 action_rotate_session = action_rotate_session_from_action(action);
74
75 /* A non-empty session name is mandatory. */
76 if (!action_rotate_session->session_name ||
28ab034a 77 strlen(action_rotate_session->session_name) == 0) {
bfb2ec6a
SM
78 valid = false;
79 goto end;
80 }
81
82 valid = true;
83end:
84 return valid;
85}
86
28ab034a
JG
87static bool lttng_action_rotate_session_is_equal(const struct lttng_action *_a,
88 const struct lttng_action *_b)
bfb2ec6a
SM
89{
90 bool is_equal = false;
91 const struct lttng_action_rotate_session *a, *b;
92
93 a = action_rotate_session_from_action_const(_a);
94 b = action_rotate_session_from_action_const(_b);
95
96 /* Action is not valid if this is not true. */
a0377dfe
FD
97 LTTNG_ASSERT(a->session_name);
98 LTTNG_ASSERT(b->session_name);
bfb2ec6a
SM
99 if (strcmp(a->session_name, b->session_name)) {
100 goto end;
101 }
102
7f4d5b07 103 is_equal = lttng_rate_policy_is_equal(a->policy, b->policy);
bfb2ec6a
SM
104end:
105 return is_equal;
106}
28ab034a
JG
107static int lttng_action_rotate_session_serialize(struct lttng_action *action,
108 struct lttng_payload *payload)
bfb2ec6a
SM
109{
110 struct lttng_action_rotate_session *action_rotate_session;
111 struct lttng_action_rotate_session_comm comm;
112 size_t session_name_len;
113 int ret;
114
a0377dfe
FD
115 LTTNG_ASSERT(action);
116 LTTNG_ASSERT(payload);
bfb2ec6a
SM
117
118 action_rotate_session = action_rotate_session_from_action(action);
119
a0377dfe 120 LTTNG_ASSERT(action_rotate_session->session_name);
bfb2ec6a
SM
121
122 DBG("Serializing rotate session action: session-name: %s",
28ab034a 123 action_rotate_session->session_name);
bfb2ec6a
SM
124
125 session_name_len = strlen(action_rotate_session->session_name) + 1;
126 comm.session_name_len = session_name_len;
127
28ab034a 128 ret = lttng_dynamic_buffer_append(&payload->buffer, &comm, sizeof(comm));
bfb2ec6a
SM
129 if (ret) {
130 ret = -1;
131 goto end;
132 }
133
28ab034a
JG
134 ret = lttng_dynamic_buffer_append(
135 &payload->buffer, action_rotate_session->session_name, session_name_len);
bfb2ec6a
SM
136 if (ret) {
137 ret = -1;
138 goto end;
139 }
140
28ab034a 141 ret = lttng_rate_policy_serialize(action_rotate_session->policy, payload);
c2c58434
JR
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
7f4d5b07 160 lttng_rate_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
28ab034a
JG
168ssize_t lttng_action_rotate_session_create_from_payload(struct lttng_payload_view *view,
169 struct lttng_action **p_action)
bfb2ec6a 170{
c2c58434 171 ssize_t consumed_len, ret;
bfb2ec6a
SM
172 const struct lttng_action_rotate_session_comm *comm;
173 const char *session_name;
174 struct lttng_action *action;
175 enum lttng_action_status status;
cd9adb8b 176 struct lttng_rate_policy *policy = nullptr;
bfb2ec6a
SM
177
178 action = lttng_action_rotate_session_create();
179 if (!action) {
180 consumed_len = -1;
181 goto end;
182 }
183
c0a66c84 184 comm = (typeof(comm)) view->buffer.data;
bfb2ec6a
SM
185 session_name = (const char *) &comm->data;
186
187 if (!lttng_buffer_view_contains_string(
28ab034a 188 &view->buffer, session_name, comm->session_name_len)) {
bfb2ec6a
SM
189 consumed_len = -1;
190 goto end;
191 }
c2c58434
JR
192 consumed_len = sizeof(*comm) + comm->session_name_len;
193
7f4d5b07 194 /* Rate policy. */
c2c58434
JR
195 {
196 struct lttng_payload_view policy_view =
28ab034a
JG
197 lttng_payload_view_from_view(view, consumed_len, -1);
198 ret = lttng_rate_policy_create_from_payload(&policy_view, &policy);
c2c58434
JR
199 if (ret < 0) {
200 consumed_len = -1;
201 goto end;
202 }
203 consumed_len += ret;
204 }
bfb2ec6a 205
28ab034a 206 status = lttng_action_rotate_session_set_session_name(action, session_name);
bfb2ec6a
SM
207 if (status != LTTNG_ACTION_STATUS_OK) {
208 consumed_len = -1;
209 goto end;
210 }
211
a0377dfe 212 LTTNG_ASSERT(policy);
7f4d5b07 213 status = lttng_action_rotate_session_set_rate_policy(action, policy);
c2c58434
JR
214 if (status != LTTNG_ACTION_STATUS_OK) {
215 consumed_len = -1;
216 goto end;
217 }
218
bfb2ec6a 219 *p_action = action;
cd9adb8b 220 action = nullptr;
bfb2ec6a
SM
221
222end:
7f4d5b07 223 lttng_rate_policy_destroy(policy);
bfb2ec6a
SM
224 lttng_action_rotate_session_destroy(action);
225
226 return consumed_len;
227}
228
28ab034a
JG
229static enum lttng_error_code
230lttng_action_rotate_session_mi_serialize(const struct lttng_action *action,
231 struct mi_writer *writer)
6a751b95
JR
232{
233 int ret;
234 enum lttng_error_code ret_code;
235 enum lttng_action_status status;
cd9adb8b
JG
236 const char *session_name = nullptr;
237 const struct lttng_rate_policy *policy = nullptr;
6a751b95 238
a0377dfe
FD
239 LTTNG_ASSERT(action);
240 LTTNG_ASSERT(IS_ROTATE_SESSION_ACTION(action));
6a751b95 241
28ab034a 242 status = lttng_action_rotate_session_get_session_name(action, &session_name);
a0377dfe 243 LTTNG_ASSERT(status == LTTNG_ACTION_STATUS_OK);
cd9adb8b 244 LTTNG_ASSERT(session_name != nullptr);
6a751b95
JR
245
246 status = lttng_action_notify_get_rate_policy(action, &policy);
a0377dfe 247 LTTNG_ASSERT(status == LTTNG_ACTION_STATUS_OK);
cd9adb8b 248 LTTNG_ASSERT(policy != nullptr);
6a751b95
JR
249
250 /* Open action rotate session element. */
28ab034a 251 ret = mi_lttng_writer_open_element(writer, mi_lttng_element_action_rotate_session);
6a751b95
JR
252 if (ret) {
253 goto mi_error;
254 }
255
256 /* Session name. */
257 ret = mi_lttng_writer_write_element_string(
28ab034a 258 writer, mi_lttng_element_session_name, session_name);
6a751b95
JR
259 if (ret) {
260 goto mi_error;
261 }
262
263 /* Rate policy. */
264 ret_code = lttng_rate_policy_mi_serialize(policy, writer);
265 if (ret_code != LTTNG_OK) {
266 goto end;
267 }
268
269 /* Close action rotate session element. */
270 ret = mi_lttng_writer_close_element(writer);
271 if (ret) {
272 goto mi_error;
273 }
274
275 ret_code = LTTNG_OK;
276 goto end;
277
278mi_error:
279 ret_code = LTTNG_ERR_MI_IO_FAIL;
280end:
281 return ret_code;
282}
283
bfb2ec6a
SM
284struct lttng_action *lttng_action_rotate_session_create(void)
285{
cd9adb8b
JG
286 struct lttng_action_rotate_session *action_rotate = nullptr;
287 struct lttng_rate_policy *policy = nullptr;
c2c58434
JR
288 enum lttng_action_status status;
289
7f4d5b07
JR
290 /* Create a every N = 1 rate policy. */
291 policy = lttng_rate_policy_every_n_create(1);
c2c58434
JR
292 if (!policy) {
293 goto end;
294 }
bfb2ec6a 295
64803277
SM
296 action_rotate = zmalloc<lttng_action_rotate_session>();
297 if (!action_rotate) {
bfb2ec6a
SM
298 goto end;
299 }
300
64803277 301 lttng_action_init(&action_rotate->parent,
28ab034a
JG
302 LTTNG_ACTION_TYPE_ROTATE_SESSION,
303 lttng_action_rotate_session_validate,
304 lttng_action_rotate_session_serialize,
305 lttng_action_rotate_session_is_equal,
306 lttng_action_rotate_session_destroy,
307 lttng_action_rotate_session_internal_get_rate_policy,
308 lttng_action_generic_add_error_query_results,
309 lttng_action_rotate_session_mi_serialize);
310
311 status = lttng_action_rotate_session_set_rate_policy(&action_rotate->parent, policy);
c2c58434 312 if (status != LTTNG_ACTION_STATUS_OK) {
64803277 313 lttng_action_destroy(&action_rotate->parent);
cd9adb8b 314 action_rotate = nullptr;
c2c58434
JR
315 goto end;
316 }
317
bfb2ec6a 318end:
7f4d5b07 319 lttng_rate_policy_destroy(policy);
64803277 320 return action_rotate ? &action_rotate->parent : nullptr;
bfb2ec6a
SM
321}
322
28ab034a
JG
323enum lttng_action_status lttng_action_rotate_session_set_session_name(struct lttng_action *action,
324 const char *session_name)
bfb2ec6a
SM
325{
326 struct lttng_action_rotate_session *action_rotate_session;
327 enum lttng_action_status status;
328
329 if (!action || !IS_ROTATE_SESSION_ACTION(action) || !session_name ||
28ab034a 330 strlen(session_name) == 0) {
bfb2ec6a
SM
331 status = LTTNG_ACTION_STATUS_INVALID;
332 goto end;
333 }
334
335 action_rotate_session = action_rotate_session_from_action(action);
336
337 free(action_rotate_session->session_name);
338
339 action_rotate_session->session_name = strdup(session_name);
340 if (!action_rotate_session->session_name) {
341 status = LTTNG_ACTION_STATUS_ERROR;
342 goto end;
343 }
344
345 status = LTTNG_ACTION_STATUS_OK;
346end:
347 return status;
348}
349
28ab034a
JG
350enum lttng_action_status
351lttng_action_rotate_session_get_session_name(const struct lttng_action *action,
352 const char **session_name)
bfb2ec6a
SM
353{
354 const struct lttng_action_rotate_session *action_rotate_session;
355 enum lttng_action_status status;
356
357 if (!action || !IS_ROTATE_SESSION_ACTION(action) || !session_name) {
358 status = LTTNG_ACTION_STATUS_INVALID;
359 goto end;
360 }
361
362 action_rotate_session = action_rotate_session_from_action_const(action);
363
364 *session_name = action_rotate_session->session_name;
365
366 status = LTTNG_ACTION_STATUS_OK;
367end:
368 return status;
369}
c2c58434 370
28ab034a
JG
371enum lttng_action_status
372lttng_action_rotate_session_set_rate_policy(struct lttng_action *action,
373 const struct lttng_rate_policy *policy)
c2c58434
JR
374{
375 enum lttng_action_status status;
376 struct lttng_action_rotate_session *rotate_session_action;
cd9adb8b 377 struct lttng_rate_policy *copy = nullptr;
c2c58434
JR
378
379 if (!action || !policy || !IS_ROTATE_SESSION_ACTION(action)) {
380 status = LTTNG_ACTION_STATUS_INVALID;
381 goto end;
382 }
383
7f4d5b07 384 copy = lttng_rate_policy_copy(policy);
c2c58434
JR
385 if (!copy) {
386 status = LTTNG_ACTION_STATUS_ERROR;
387 goto end;
388 }
389
390 rotate_session_action = action_rotate_session_from_action(action);
391
7f4d5b07
JR
392 /* Free the previous rate policy .*/
393 lttng_rate_policy_destroy(rotate_session_action->policy);
c2c58434
JR
394
395 /* Assign the policy. */
396 rotate_session_action->policy = copy;
397 status = LTTNG_ACTION_STATUS_OK;
cd9adb8b 398 copy = nullptr;
c2c58434
JR
399
400end:
7f4d5b07 401 lttng_rate_policy_destroy(copy);
c2c58434
JR
402 return status;
403}
404
28ab034a
JG
405enum lttng_action_status
406lttng_action_rotate_session_get_rate_policy(const struct lttng_action *action,
407 const struct lttng_rate_policy **policy)
c2c58434
JR
408{
409 enum lttng_action_status status;
410 const struct lttng_action_rotate_session *rotate_session_action;
411
412 if (!action || !policy || !IS_ROTATE_SESSION_ACTION(action)) {
413 status = LTTNG_ACTION_STATUS_INVALID;
414 goto end;
415 }
416
417 rotate_session_action = action_rotate_session_from_action_const(action);
418
419 *policy = rotate_session_action->policy;
420 status = LTTNG_ACTION_STATUS_OK;
421end:
422 return status;
423}
2d57482c 424
7f4d5b07 425static const struct lttng_rate_policy *
28ab034a 426lttng_action_rotate_session_internal_get_rate_policy(const struct lttng_action *action)
2d57482c
JR
427{
428 const struct lttng_action_rotate_session *_action;
429 _action = action_rotate_session_from_action_const(action);
430
431 return _action->policy;
432}
This page took 0.062279 seconds and 4 git commands to generate.