projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sessiond: cmd_rotate_session: introduce command argument
[lttng-tools.git]
/
src
/
bin
/
lttng-sessiond
/
client.c
diff --git
a/src/bin/lttng-sessiond/client.c
b/src/bin/lttng-sessiond/client.c
index 02eac96e422f8c8f3067df10c7c040c9eb1d02cd..551295efbe6d5d7194b8e2d59d4346e712a43ef3 100644
(file)
--- a/
src/bin/lttng-sessiond/client.c
+++ b/
src/bin/lttng-sessiond/client.c
@@
-44,6
+44,7
@@
static bool is_root;
static struct thread_state {
sem_t ready;
bool running;
static struct thread_state {
sem_t ready;
bool running;
+ int client_sock;
} thread_state;
static void set_thread_status(bool running)
} thread_state;
static void set_thread_status(bool running)
@@
-410,7
+411,7
@@
error:
* Should *NOT* be called with RCU read-side lock held.
*/
static int create_ust_session(struct ltt_session *session,
* Should *NOT* be called with RCU read-side lock held.
*/
static int create_ust_session(struct ltt_session *session,
- struct lttng_domain *domain)
+
const
struct lttng_domain *domain)
{
int ret;
struct ltt_ust_session *lus = NULL;
{
int ret;
struct ltt_ust_session *lus = NULL;
@@
-478,7
+479,7
@@
static int create_kernel_session(struct ltt_session *session)
DBG("Creating kernel session");
DBG("Creating kernel session");
- ret = kernel_create_session(session
, kernel_tracer_fd
);
+ ret = kernel_create_session(session);
if (ret < 0) {
ret = LTTNG_ERR_KERN_SESS_FAIL;
goto error_create;
if (ret < 0) {
ret = LTTNG_ERR_KERN_SESS_FAIL;
goto error_create;
@@
-879,6
+880,15
@@
static int process_client_msg(struct command_ctx *cmd_ctx, int *sock,
goto error;
}
goto error;
}
+ /* Kernel tracer check */
+ if (!kernel_tracer_is_initialized()) {
+ /* Basically, load kernel tracer modules */
+ ret = init_kernel_tracer();
+ if (ret != 0) {
+ goto error;
+ }
+ }
+
/* Consumer is in an ERROR state. Report back to client */
if (uatomic_read(&kernel_consumerd_state) == CONSUMER_ERROR) {
ret = LTTNG_ERR_NO_KERNCONSUMERD;
/* Consumer is in an ERROR state. Report back to client */
if (uatomic_read(&kernel_consumerd_state) == CONSUMER_ERROR) {
ret = LTTNG_ERR_NO_KERNCONSUMERD;
@@
-941,7
+951,7
@@
static int process_client_msg(struct command_ctx *cmd_ctx, int *sock,
/* Create UST session if none exist. */
if (cmd_ctx->session->ust_session == NULL) {
ret = create_ust_session(cmd_ctx->session,
/* Create UST session if none exist. */
if (cmd_ctx->session->ust_session == NULL) {
ret = create_ust_session(cmd_ctx->session,
-
&cmd_ctx->lsm->domain
);
+
ALIGNED_CONST_PTR(cmd_ctx->lsm->domain)
);
if (ret != LTTNG_OK) {
goto error;
}
if (ret != LTTNG_OK) {
goto error;
}
@@
-1130,7
+1140,7
@@
skip_domain:
ret = cmd_add_context(cmd_ctx->session,
cmd_ctx->lsm->domain.type,
cmd_ctx->lsm->u.context.channel_name,
ret = cmd_add_context(cmd_ctx->session,
cmd_ctx->lsm->domain.type,
cmd_ctx->lsm->u.context.channel_name,
-
&cmd_ctx->lsm->u.context.ctx
,
+
ALIGNED_CONST_PTR(cmd_ctx->lsm->u.context.ctx)
,
kernel_poll_pipe[1]);
cmd_ctx->lsm->u.context.ctx.u.app_ctx.provider_name = NULL;
kernel_poll_pipe[1]);
cmd_ctx->lsm->u.context.ctx.u.app_ctx.provider_name = NULL;
@@
-1178,18
+1188,18
@@
error_add_context:
count -= (size_t) ret;
}
}
count -= (size_t) ret;
}
}
- /* FIXME: passing packed structure to non-packed pointer */
ret = cmd_disable_event(cmd_ctx->session, cmd_ctx->lsm->domain.type,
cmd_ctx->lsm->u.disable.channel_name,
ret = cmd_disable_event(cmd_ctx->session, cmd_ctx->lsm->domain.type,
cmd_ctx->lsm->u.disable.channel_name,
-
&cmd_ctx->lsm->u.disable.event
);
+
ALIGNED_CONST_PTR(cmd_ctx->lsm->u.disable.event)
);
break;
}
case LTTNG_ENABLE_CHANNEL:
{
cmd_ctx->lsm->u.channel.chan.attr.extended.ptr =
(struct lttng_channel_extended *) &cmd_ctx->lsm->u.channel.extended;
break;
}
case LTTNG_ENABLE_CHANNEL:
{
cmd_ctx->lsm->u.channel.chan.attr.extended.ptr =
(struct lttng_channel_extended *) &cmd_ctx->lsm->u.channel.extended;
- ret = cmd_enable_channel(cmd_ctx->session, &cmd_ctx->lsm->domain,
- &cmd_ctx->lsm->u.channel.chan,
+ ret = cmd_enable_channel(cmd_ctx->session,
+ ALIGNED_CONST_PTR(cmd_ctx->lsm->domain),
+ ALIGNED_CONST_PTR(cmd_ctx->lsm->u.channel.chan),
kernel_poll_pipe[1]);
break;
}
kernel_poll_pipe[1]);
break;
}
@@
-1311,7
+1321,7
@@
error_add_context:
}
}
}
}
- ev = lttng_event_copy(
&cmd_ctx->lsm->u.enable.event
);
+ ev = lttng_event_copy(
ALIGNED_CONST_PTR(cmd_ctx->lsm->u.enable.event)
);
if (!ev) {
DBG("Failed to copy event: %s",
cmd_ctx->lsm->u.enable.event.name);
if (!ev) {
DBG("Failed to copy event: %s",
cmd_ctx->lsm->u.enable.event.name);
@@
-1335,7
+1345,8
@@
error_add_context:
}
}
}
}
- ret = cmd_enable_event(cmd_ctx->session, &cmd_ctx->lsm->domain,
+ ret = cmd_enable_event(cmd_ctx->session,
+ ALIGNED_CONST_PTR(cmd_ctx->lsm->domain),
cmd_ctx->lsm->u.enable.channel_name,
ev,
filter_expression, bytecode, exclusion,
cmd_ctx->lsm->u.enable.channel_name,
ev,
filter_expression, bytecode, exclusion,
@@
-1703,13
+1714,16
@@
error_add_context:
}
case LTTNG_SNAPSHOT_ADD_OUTPUT:
{
}
case LTTNG_SNAPSHOT_ADD_OUTPUT:
{
+ uint32_t snapshot_id;
struct lttcomm_lttng_output_id reply;
ret = cmd_snapshot_add_output(cmd_ctx->session,
struct lttcomm_lttng_output_id reply;
ret = cmd_snapshot_add_output(cmd_ctx->session,
- &cmd_ctx->lsm->u.snapshot_output.output, &reply.id);
+ ALIGNED_CONST_PTR(cmd_ctx->lsm->u.snapshot_output.output),
+ &snapshot_id);
if (ret != LTTNG_OK) {
goto error;
}
if (ret != LTTNG_OK) {
goto error;
}
+ reply.id = snapshot_id;
ret = setup_lttng_msg_no_cmd_header(cmd_ctx, &reply,
sizeof(reply));
ret = setup_lttng_msg_no_cmd_header(cmd_ctx, &reply,
sizeof(reply));
@@
-1724,7
+1738,7
@@
error_add_context:
case LTTNG_SNAPSHOT_DEL_OUTPUT:
{
ret = cmd_snapshot_del_output(cmd_ctx->session,
case LTTNG_SNAPSHOT_DEL_OUTPUT:
{
ret = cmd_snapshot_del_output(cmd_ctx->session,
-
&cmd_ctx->lsm->u.snapshot_output.output
);
+
ALIGNED_CONST_PTR(cmd_ctx->lsm->u.snapshot_output.output)
);
break;
}
case LTTNG_SNAPSHOT_LIST_OUTPUT:
break;
}
case LTTNG_SNAPSHOT_LIST_OUTPUT:
@@
-1753,7
+1767,7
@@
error_add_context:
case LTTNG_SNAPSHOT_RECORD:
{
ret = cmd_snapshot_record(cmd_ctx->session,
case LTTNG_SNAPSHOT_RECORD:
{
ret = cmd_snapshot_record(cmd_ctx->session,
-
&cmd_ctx->lsm->u.snapshot_record.output
,
+
ALIGNED_CONST_PTR(cmd_ctx->lsm->u.snapshot_record.output)
,
cmd_ctx->lsm->u.snapshot_record.wait);
break;
}
cmd_ctx->lsm->u.snapshot_record.wait);
break;
}
@@
-1836,7
+1850,8
@@
error_add_context:
}
ret = cmd_rotate_session(cmd_ctx->session, &rotate_return,
}
ret = cmd_rotate_session(cmd_ctx->session, &rotate_return,
- false);
+ false,
+ LTTNG_TRACE_CHUNK_COMMAND_TYPE_MOVE_TO_COMPLETED);
if (ret < 0) {
ret = -ret;
goto error;
if (ret < 0) {
ret = -ret;
goto error;
@@
-1972,8
+1987,11
@@
static int create_client_sock(void)
/* File permission MUST be 660 */
ret = chmod(config.client_unix_sock_path.value, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (ret < 0) {
/* File permission MUST be 660 */
ret = chmod(config.client_unix_sock_path.value, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (ret < 0) {
- ERR("Set file permissions failed: %s", config.client_unix_sock_path.value);
+ ERR("Set file permissions failed: %s",
+ config.client_unix_sock_path.value);
PERROR("chmod");
PERROR("chmod");
+ (void) lttcomm_close_unix_sock(client_sock);
+ ret = -1;
goto end;
}
DBG("Created client socket (fd = %i)", client_sock);
goto end;
}
DBG("Created client socket (fd = %i)", client_sock);
@@
-2006,7
+2024,7
@@
static void *thread_manage_clients(void *data)
uint32_t revents, nb_fd;
struct command_ctx *cmd_ctx = NULL;
struct lttng_poll_event events;
uint32_t revents, nb_fd;
struct command_ctx *cmd_ctx = NULL;
struct lttng_poll_event events;
-
int client_sock = -1
;
+
const int client_sock = thread_state.client_sock
;
struct lttng_pipe *quit_pipe = data;
const int thread_quit_pipe_fd = lttng_pipe_get_readfd(quit_pipe);
struct lttng_pipe *quit_pipe = data;
const int thread_quit_pipe_fd = lttng_pipe_get_readfd(quit_pipe);
@@
-2015,10
+2033,6
@@
static void *thread_manage_clients(void *data)
is_root = (getuid() == 0);
pthread_cleanup_push(thread_init_cleanup, NULL);
is_root = (getuid() == 0);
pthread_cleanup_push(thread_init_cleanup, NULL);
- client_sock = create_client_sock();
- if (client_sock < 0) {
- goto error_listen;
- }
rcu_register_thread();
rcu_register_thread();
@@
-2257,11
+2271,9
@@
error:
error_listen:
error_create_poll:
unlink(config.client_unix_sock_path.value);
error_listen:
error_create_poll:
unlink(config.client_unix_sock_path.value);
- if (client_sock >= 0) {
- ret = close(client_sock);
- if (ret) {
- PERROR("close");
- }
+ ret = close(client_sock);
+ if (ret) {
+ PERROR("close");
}
if (err) {
}
if (err) {
@@
-2290,7
+2302,8
@@
struct lttng_thread *launch_client_thread(void)
{
bool thread_running;
struct lttng_pipe *client_quit_pipe;
{
bool thread_running;
struct lttng_pipe *client_quit_pipe;
- struct lttng_thread *thread;
+ struct lttng_thread *thread = NULL;
+ int client_sock_fd = -1;
sem_init(&thread_state.ready, 0, 0);
client_quit_pipe = lttng_pipe_open(FD_CLOEXEC);
sem_init(&thread_state.ready, 0, 0);
client_quit_pipe = lttng_pipe_open(FD_CLOEXEC);
@@
-2298,6
+2311,12
@@
struct lttng_thread *launch_client_thread(void)
goto error;
}
goto error;
}
+ client_sock_fd = create_client_sock();
+ if (client_sock_fd < 0) {
+ goto error;
+ }
+
+ thread_state.client_sock = client_sock_fd;
thread = lttng_thread_create("Client management",
thread_manage_clients,
shutdown_client_thread,
thread = lttng_thread_create("Client management",
thread_manage_clients,
shutdown_client_thread,
@@
-2306,6
+2325,9
@@
struct lttng_thread *launch_client_thread(void)
if (!thread) {
goto error;
}
if (!thread) {
goto error;
}
+ /* The client thread now owns the client sock fd and the quit pipe. */
+ client_sock_fd = -1;
+ client_quit_pipe = NULL;
/*
* This thread is part of the threads that need to be fully
/*
* This thread is part of the threads that need to be fully
@@
-2313,11
+2335,16
@@
struct lttng_thread *launch_client_thread(void)
*/
thread_running = wait_thread_status();
if (!thread_running) {
*/
thread_running = wait_thread_status();
if (!thread_running) {
- lttng_thread_put(thread);
- thread = NULL;
+ goto error;
}
return thread;
error:
}
return thread;
error:
+ if (client_sock_fd >= 0) {
+ if (close(client_sock_fd)) {
+ PERROR("Failed to close client socket");
+ }
+ }
+ lttng_thread_put(thread);
cleanup_client_thread(client_quit_pipe);
return NULL;
}
cleanup_client_thread(client_quit_pipe);
return NULL;
}
This page took
0.028301 seconds
and
4
git commands to generate.