X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Frelayd%2Frelayd.c;h=745bde816aa7471222f871c3859d981389e22638;hp=242abbedff15c5c2f079460cb8805dbc567268cd;hb=272839375cd306a6a824bab1018655a65b39fd9d;hpb=d73bf3d793ee0b0c5b56cb47cb50c27d1789d3bd diff --git a/src/common/relayd/relayd.c b/src/common/relayd/relayd.c index 242abbedf..745bde816 100644 --- a/src/common/relayd/relayd.c +++ b/src/common/relayd/relayd.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -119,12 +120,67 @@ error: } /* - * Starting at 2.4, RELAYD_CREATE_SESSION takes additional parameters to + * Starting from 2.11, RELAYD_CREATE_SESSION payload (session_name & hostname) + * have no length restriction on the sender side. + * Length for both payloads is stored in the msg struct. A new dynamic size + * payload size is introduced. + */ +static int relayd_create_session_2_11(struct lttcomm_relayd_sock *rsock, + char *session_name, char *hostname, + int session_live_timer, unsigned int snapshot) +{ + int ret; + struct lttcomm_relayd_create_session_2_11 *msg = NULL; + size_t session_name_len; + size_t hostname_len; + size_t msg_length; + + /* The two names are sent with a '\0' delimiter between them. */ + session_name_len = strlen(session_name) + 1; + hostname_len = strlen(hostname) + 1; + + msg_length = sizeof(*msg) + session_name_len + hostname_len; + msg = zmalloc(msg_length); + if (!msg) { + PERROR("zmalloc create_session_2_11 command message"); + ret = -1; + goto error; + } + + assert(session_name_len <= UINT32_MAX); + msg->session_name_len = htobe32(session_name_len); + + assert(hostname_len <= UINT32_MAX); + msg->hostname_len = htobe32(hostname_len); + + if (lttng_strncpy(msg->names, session_name, session_name_len)) { + ret = -1; + goto error; + } + if (lttng_strncpy(msg->names + session_name_len, hostname, hostname_len)) { + ret = -1; + goto error; + } + + msg->live_timer = htobe32(session_live_timer); + msg->snapshot = !!snapshot; + + /* Send command */ + ret = send_command(rsock, RELAYD_CREATE_SESSION, msg, msg_length, 0); + if (ret < 0) { + goto error; + } +error: + free(msg); + return ret; +} +/* + * From 2.4 to 2.10, RELAYD_CREATE_SESSION takes additional parameters to * support the live reading capability. */ static int relayd_create_session_2_4(struct lttcomm_relayd_sock *rsock, - uint64_t *session_id, char *session_name, char *hostname, - int session_live_timer, unsigned int snapshot) + char *session_name, char *hostname, int session_live_timer, + unsigned int snapshot) { int ret; struct lttcomm_relayd_create_session_2_4 msg; @@ -154,8 +210,7 @@ error: /* * RELAYD_CREATE_SESSION from 2.1 to 2.3. */ -static int relayd_create_session_2_1(struct lttcomm_relayd_sock *rsock, - uint64_t *session_id) +static int relayd_create_session_2_1(struct lttcomm_relayd_sock *rsock) { int ret; @@ -188,17 +243,17 @@ int relayd_create_session(struct lttcomm_relayd_sock *rsock, uint64_t *session_i DBG("Relayd create session"); - switch(rsock->minor) { - case 1: - case 2: - case 3: - ret = relayd_create_session_2_1(rsock, session_id); - break; - case 4: - default: - ret = relayd_create_session_2_4(rsock, session_id, session_name, - hostname, session_live_timer, snapshot); - break; + if (rsock->minor < 4) { + /* From 2.1 to 2.3 */ + ret = relayd_create_session_2_1(rsock); + } else if (rsock->minor >= 4 && rsock->minor < 11) { + /* From 2.4 to 2.10 */ + ret = relayd_create_session_2_4(rsock, session_name, + hostname, session_live_timer, snapshot); + } else { + /* From 2.11 to ... */ + ret = relayd_create_session_2_11(rsock, session_name, + hostname, session_live_timer, snapshot); } if (ret < 0) { @@ -230,6 +285,119 @@ error: return ret; } +static int relayd_add_stream_2_1(struct lttcomm_relayd_sock *rsock, + const char *channel_name, const char *pathname) +{ + int ret; + struct lttcomm_relayd_add_stream msg; + + memset(&msg, 0, sizeof(msg)); + if (lttng_strncpy(msg.channel_name, channel_name, + sizeof(msg.channel_name))) { + ret = -1; + goto error; + } + + if (lttng_strncpy(msg.pathname, pathname, + sizeof(msg.pathname))) { + ret = -1; + goto error; + } + + /* Send command */ + ret = send_command(rsock, RELAYD_ADD_STREAM, (void *) &msg, sizeof(msg), 0); + if (ret < 0) { + ret = -1; + goto error; + } + ret = 0; +error: + return ret; +} + +static int relayd_add_stream_2_2(struct lttcomm_relayd_sock *rsock, + const char *channel_name, const char *pathname, + uint64_t tracefile_size, uint64_t tracefile_count) +{ + int ret; + struct lttcomm_relayd_add_stream_2_2 msg; + + memset(&msg, 0, sizeof(msg)); + /* Compat with relayd 2.2 to 2.10 */ + if (lttng_strncpy(msg.channel_name, channel_name, + sizeof(msg.channel_name))) { + ret = -1; + goto error; + } + if (lttng_strncpy(msg.pathname, pathname, + sizeof(msg.pathname))) { + ret = -1; + goto error; + } + msg.tracefile_size = htobe64(tracefile_size); + msg.tracefile_count = htobe64(tracefile_count); + + /* Send command */ + ret = send_command(rsock, RELAYD_ADD_STREAM, (void *) &msg, sizeof(msg), 0); + if (ret < 0) { + goto error; + } + ret = 0; +error: + return ret; +} + +static int relayd_add_stream_2_11(struct lttcomm_relayd_sock *rsock, + const char *channel_name, const char *pathname, + uint64_t tracefile_size, uint64_t tracefile_count) +{ + int ret; + struct lttcomm_relayd_add_stream_2_11 *msg = NULL; + size_t channel_name_len; + size_t pathname_len; + size_t msg_length; + + /* The two names are sent with a '\0' delimiter between them. */ + channel_name_len = strlen(channel_name) + 1; + pathname_len = strlen(pathname) + 1; + + msg_length = sizeof(*msg) + channel_name_len + pathname_len; + msg = zmalloc(msg_length); + if (!msg) { + PERROR("zmalloc add_stream_2_11 command message"); + ret = -1; + goto error; + } + + assert(channel_name_len <= UINT32_MAX); + msg->channel_name_len = htobe32(channel_name_len); + + assert(pathname_len <= UINT32_MAX); + msg->pathname_len = htobe32(pathname_len); + + if (lttng_strncpy(msg->names, channel_name, channel_name_len)) { + ret = -1; + goto error; + } + if (lttng_strncpy(msg->names + channel_name_len, pathname, pathname_len)) { + ret = -1; + goto error; + } + + msg->tracefile_size = htobe64(tracefile_size); + msg->tracefile_count = htobe64(tracefile_count); + + /* Send command */ + ret = send_command(rsock, RELAYD_ADD_STREAM, (void *) msg, msg_length, 0); + if (ret < 0) { + goto error; + } + ret = 0; +error: + free(msg); + return ret; +} + /* * Add stream on the relayd and assign stream handle to the stream_id argument. * @@ -237,11 +405,10 @@ error: */ int relayd_add_stream(struct lttcomm_relayd_sock *rsock, const char *channel_name, const char *pathname, uint64_t *stream_id, - uint64_t tracefile_size, uint64_t tracefile_count) + uint64_t tracefile_size, uint64_t tracefile_count, + uint64_t trace_archive_id) { int ret; - struct lttcomm_relayd_add_stream msg; - struct lttcomm_relayd_add_stream_2_2 msg_2_2; struct lttcomm_relayd_status_stream reply; /* Code flow error. Safety net. */ @@ -253,44 +420,22 @@ int relayd_add_stream(struct lttcomm_relayd_sock *rsock, const char *channel_nam /* Compat with relayd 2.1 */ if (rsock->minor == 1) { - memset(&msg, 0, sizeof(msg)); - if (lttng_strncpy(msg.channel_name, channel_name, - sizeof(msg.channel_name))) { - ret = -1; - goto error; - } - if (lttng_strncpy(msg.pathname, pathname, - sizeof(msg.pathname))) { - ret = -1; - goto error; - } - - /* Send command */ - ret = send_command(rsock, RELAYD_ADD_STREAM, (void *) &msg, sizeof(msg), 0); - if (ret < 0) { - goto error; - } + /* For 2.1 */ + ret = relayd_add_stream_2_1(rsock, channel_name, pathname); + + } else if (rsock->minor > 1 && rsock->minor < 11) { + /* From 2.2 to 2.10 */ + ret = relayd_add_stream_2_2(rsock, channel_name, pathname, + tracefile_size, tracefile_count); } else { - memset(&msg_2_2, 0, sizeof(msg_2_2)); - /* Compat with relayd 2.2+ */ - if (lttng_strncpy(msg_2_2.channel_name, channel_name, - sizeof(msg_2_2.channel_name))) { - ret = -1; - goto error; - } - if (lttng_strncpy(msg_2_2.pathname, pathname, - sizeof(msg_2_2.pathname))) { - ret = -1; - goto error; - } - msg_2_2.tracefile_size = htobe64(tracefile_size); - msg_2_2.tracefile_count = htobe64(tracefile_count); + /* From 2.11 to ...*/ + ret = relayd_add_stream_2_11(rsock, channel_name, pathname, + tracefile_size, tracefile_count); + } - /* Send command */ - ret = send_command(rsock, RELAYD_ADD_STREAM, (void *) &msg_2_2, sizeof(msg_2_2), 0); - if (ret < 0) { - goto error; - } + if (ret) { + ret = -1; + goto error; } /* Waiting for reply */ @@ -314,7 +459,7 @@ int relayd_add_stream(struct lttcomm_relayd_sock *rsock, const char *channel_nam } DBG("Relayd stream added successfully with handle %" PRIu64, - reply.handle); + reply.handle); error: return ret; @@ -958,7 +1103,7 @@ int relayd_rotate_stream(struct lttcomm_relayd_sock *rsock, uint64_t stream_id, DBG("Sending rotate stream id %" PRIu64 " command to relayd", stream_id); /* Account for the trailing NULL. */ - len = strnlen(new_pathname, LTTNG_PATH_MAX) + 1; + len = lttng_strnlen(new_pathname, LTTNG_PATH_MAX) + 1; if (len > LTTNG_PATH_MAX) { ERR("Path used in relayd rotate stream command exceeds the maximal allowed length"); ret = -1; @@ -1086,6 +1231,56 @@ error: return ret; } +int relayd_rotate_pending(struct lttcomm_relayd_sock *rsock, uint64_t chunk_id) +{ + int ret; + struct lttcomm_relayd_rotate_pending msg; + struct lttcomm_relayd_rotate_pending_reply reply; + + /* Code flow error. Safety net. */ + assert(rsock); + + DBG("Querying relayd for rotate pending with chunk_id %" PRIu64, + chunk_id); + + memset(&msg, 0, sizeof(msg)); + msg.chunk_id = htobe64(chunk_id); + + /* Send command */ + ret = send_command(rsock, RELAYD_ROTATE_PENDING, (void *) &msg, + sizeof(msg), 0); + if (ret < 0) { + goto error; + } + + /* Receive response */ + ret = recv_reply(rsock, (void *) &reply, sizeof(reply)); + if (ret < 0) { + goto error; + } + + reply.generic.ret_code = be32toh(reply.generic.ret_code); + + /* Return session id or negative ret code. */ + if (reply.generic.ret_code != LTTNG_OK) { + ret = -reply.generic.ret_code; + ERR("Relayd rotate pending replied with error %d", ret); + goto error; + } else { + /* No error, just rotate pending state */ + if (reply.is_pending == 0 || reply.is_pending == 1) { + ret = reply.is_pending; + DBG("Relayd rotate pending command completed successfully with result \"%s\"", + ret ? "rotation pending" : "rotation NOT pending"); + } else { + ret = -LTTNG_ERR_UNK; + } + } + +error: + return ret; +} + int relayd_mkdir(struct lttcomm_relayd_sock *rsock, const char *path) { int ret;