X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Flive.c;h=0fd41f1a804f61c2e0582e4bb5b6118bdac831a4;hp=9029a5955a4ad2a4f7551fb033e371914b905bee;hb=7e0a437914bdad867b9cdfa61d7cba163dfc4c8b;hpb=b6025e9476332b75eb8184345c3eb3e924780088 diff --git a/src/bin/lttng-relayd/live.c b/src/bin/lttng-relayd/live.c index 9029a5955..0fd41f1a8 100644 --- a/src/bin/lttng-relayd/live.c +++ b/src/bin/lttng-relayd/live.c @@ -452,10 +452,11 @@ struct lttcomm_sock *init_socket(struct lttng_uri *uri) if (ret < 0) { goto error; } - DBG("Listening on sock %d for live", sock->fd); + DBG("Listening on sock %d for lttng-live", sock->fd); ret = sock->ops->bind(sock); if (ret < 0) { + PERROR("Failed to bind lttng-live socket"); goto error; } @@ -834,6 +835,11 @@ int viewer_list_sessions(struct relay_connection *conn) health_code_update(); + if (session->connection_closed) { + /* Skip closed session */ + continue; + } + if (count >= buf_count) { struct lttng_viewer_session *newbuf; uint32_t new_buf_count = buf_count << 1; @@ -1038,12 +1044,12 @@ int viewer_attach_session(struct relay_connection *conn) session = session_get_by_id(be64toh(request.session_id)); if (!session) { DBG("Relay session %" PRIu64 " not found", - be64toh(request.session_id)); + (uint64_t) be64toh(request.session_id)); response.status = htobe32(LTTNG_VIEWER_ATTACH_UNK); goto send_reply; } DBG("Attach session ID %" PRIu64 " received", - be64toh(request.session_id)); + (uint64_t) be64toh(request.session_id)); if (session->live_timer == 0) { DBG("Not live session"); @@ -1088,7 +1094,7 @@ int viewer_attach_session(struct relay_connection *conn) if (closed) { send_streams = 0; response.streams_count = 0; - response.status = htobe32(LTTNG_VIEWER_NEW_STREAMS_HUP); + response.status = htobe32(LTTNG_VIEWER_ATTACH_UNK); goto send_reply; } @@ -1300,7 +1306,7 @@ int viewer_get_next_index(struct relay_connection *conn) vstream = viewer_stream_get_by_id(be64toh(request_index.stream_id)); if (!vstream) { DBG("Client requested index of unknown stream id %" PRIu64, - be64toh(request_index.stream_id)); + (uint64_t) be64toh(request_index.stream_id)); viewer_index.status = htobe32(LTTNG_VIEWER_INDEX_ERR); goto send_reply; } @@ -1414,7 +1420,7 @@ int viewer_get_next_index(struct relay_connection *conn) */ DBG("Sending viewer index for stream %" PRIu64 " offset %" PRIu64, rstream->stream_handle, - be64toh(packet_index.offset)); + (uint64_t) be64toh(packet_index.offset)); viewer_index.offset = packet_index.offset; viewer_index.packet_size = packet_index.packet_size; viewer_index.content_size = packet_index.content_size; @@ -1483,12 +1489,12 @@ static int viewer_get_packet(struct relay_connection *conn) { int ret; - char *data = NULL; + off_t lseek_ret; + char *reply = NULL; struct lttng_viewer_get_packet get_packet_info; - struct lttng_viewer_trace_packet reply; + struct lttng_viewer_trace_packet reply_header; struct relay_viewer_stream *vstream = NULL; - bool skip_send_data = false; - uint32_t send_len = sizeof(reply); + uint32_t reply_size = sizeof(reply_header); uint32_t packet_data_len = 0; ssize_t read_len; @@ -1504,52 +1510,49 @@ int viewer_get_packet(struct relay_connection *conn) health_code_update(); /* From this point on, the error label can be reached. */ - memset(&reply, 0, sizeof(reply)); + memset(&reply_header, 0, sizeof(reply_header)); vstream = viewer_stream_get_by_id(be64toh(get_packet_info.stream_id)); if (!vstream) { - skip_send_data = true; DBG("Client requested packet of unknown stream id %" PRIu64, - be64toh(get_packet_info.stream_id)); - reply.status = htobe32(LTTNG_VIEWER_GET_PACKET_ERR); + (uint64_t) be64toh(get_packet_info.stream_id)); + reply_header.status = htobe32(LTTNG_VIEWER_GET_PACKET_ERR); + goto send_reply_nolock; } else { packet_data_len = be32toh(get_packet_info.len); - send_len += packet_data_len; + reply_size += packet_data_len; } - data = zmalloc(send_len); - if (!data) { - PERROR("relay data zmalloc"); + reply = zmalloc(reply_size); + if (!reply) { + PERROR("packet reply zmalloc"); + reply_size = sizeof(reply_header); goto error; } - if (skip_send_data) { - goto send_reply_nolock; - } - pthread_mutex_lock(&vstream->stream->lock); - ret = lseek(vstream->stream_fd->fd, be64toh(get_packet_info.offset), + lseek_ret = lseek(vstream->stream_fd->fd, be64toh(get_packet_info.offset), SEEK_SET); - if (ret < 0) { + if (lseek_ret < 0) { PERROR("lseek fd %d to offset %" PRIu64, vstream->stream_fd->fd, - be64toh(get_packet_info.offset)); + (uint64_t) be64toh(get_packet_info.offset)); goto error; } read_len = lttng_read(vstream->stream_fd->fd, - data + sizeof(reply), + reply + sizeof(reply_header), packet_data_len); if (read_len < packet_data_len) { PERROR("Relay reading trace file, fd: %d, offset: %" PRIu64, vstream->stream_fd->fd, - be64toh(get_packet_info.offset)); + (uint64_t) be64toh(get_packet_info.offset)); goto error; } - reply.status = htobe32(LTTNG_VIEWER_GET_PACKET_OK); - reply.len = htobe32(packet_data_len); + reply_header.status = htobe32(LTTNG_VIEWER_GET_PACKET_OK); + reply_header.len = htobe32(packet_data_len); goto send_reply; error: - reply.status = htobe32(LTTNG_VIEWER_GET_PACKET_ERR); + reply_header.status = htobe32(LTTNG_VIEWER_GET_PACKET_ERR); send_reply: if (vstream) { @@ -1559,20 +1562,26 @@ send_reply_nolock: health_code_update(); - memcpy(data, &reply, sizeof(reply)); - health_code_update(); - ret = send_response(conn->sock, data, send_len); + if (reply) { + memcpy(reply, &reply_header, sizeof(reply_header)); + ret = send_response(conn->sock, reply, reply_size); + } else { + /* No reply to send. */ + ret = send_response(conn->sock, &reply_header, + reply_size); + } + health_code_update(); if (ret < 0) { PERROR("sendmsg of packet data failed"); goto end_free; } - DBG("Sent %u bytes for stream %" PRIu64, send_len, - be64toh(get_packet_info.stream_id)); + DBG("Sent %u bytes for stream %" PRIu64, reply_size, + (uint64_t) be64toh(get_packet_info.stream_id)); end_free: - free(data); + free(reply); end: if (vstream) { viewer_stream_put(vstream); @@ -1621,7 +1630,7 @@ int viewer_get_metadata(struct relay_connection *conn) * find it. */ DBG("Client requested metadata of unknown stream id %" PRIu64, - be64toh(request.stream_id)); + (uint64_t) be64toh(request.stream_id)); reply.status = htobe32(LTTNG_VIEWER_METADATA_ERR); goto send_reply; } @@ -1707,7 +1716,7 @@ send_reply: } DBG("Sent %" PRIu64 " bytes of metadata for stream %" PRIu64, len, - be64toh(request.stream_id)); + (uint64_t) be64toh(request.stream_id)); DBG("Metadata sent"); @@ -1796,7 +1805,7 @@ int viewer_detach_session(struct relay_connection *conn) session = session_get_by_id(be64toh(request.session_id)); if (!session) { DBG("Relay session %" PRIu64 " not found", - be64toh(request.session_id)); + (uint64_t) be64toh(request.session_id)); response.status = htobe32(LTTNG_VIEWER_DETACH_SESSION_UNK); goto send_reply; } @@ -2071,7 +2080,7 @@ exit: error: lttng_poll_clean(&events); - /* Cleanup reamaining connection object. */ + /* Cleanup remaining connection object. */ rcu_read_lock(); cds_lfht_for_each_entry(viewer_connections_ht->ht, &iter.iter, destroy_conn,