X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Flttng-live%2Fviewer-connection.c;h=f094a8f96553f3c9e098c373d3a177df9fc0eecf;hb=f797424a5aa3b965937203073b27d666c25a6987;hp=8c02be02faf4091cd35e8df27e015589334ea324;hpb=3fa1b6a32830525df702234513c7fd6264f59bb8;p=babeltrace.git diff --git a/src/plugins/ctf/lttng-live/viewer-connection.c b/src/plugins/ctf/lttng-live/viewer-connection.c index 8c02be02..f094a8f9 100644 --- a/src/plugins/ctf/lttng-live/viewer-connection.c +++ b/src/plugins/ctf/lttng-live/viewer-connection.c @@ -74,8 +74,11 @@ ssize_t lttng_live_recv(struct live_viewer_connection *viewer_connection, } } } while (ret > 0 && to_copy > 0); - if (ret > 0) + + if (ret > 0) { ret = copied; + } + /* ret = 0 means orderly shutdown, ret == BT_SOCKET_ERROR is error. */ return ret; } @@ -117,15 +120,14 @@ int parse_url(struct live_viewer_connection *viewer_connection) goto end; } - lttng_live_url_parts = bt_common_parse_lttng_live_url(path, - error_buf, sizeof(error_buf)); + lttng_live_url_parts = bt_common_parse_lttng_live_url(path, error_buf, + sizeof(error_buf)); if (!lttng_live_url_parts.proto) { BT_COMP_LOGW("Invalid LTTng live URL format: %s", error_buf); goto end; } - viewer_connection->relay_hostname = - lttng_live_url_parts.hostname; + viewer_connection->relay_hostname = lttng_live_url_parts.hostname; lttng_live_url_parts.hostname = NULL; if (lttng_live_url_parts.port >= 0) { @@ -134,26 +136,23 @@ int parse_url(struct live_viewer_connection *viewer_connection) viewer_connection->port = LTTNG_DEFAULT_NETWORK_VIEWER_PORT; } - viewer_connection->target_hostname = - lttng_live_url_parts.target_hostname; + viewer_connection->target_hostname = lttng_live_url_parts.target_hostname; lttng_live_url_parts.target_hostname = NULL; if (lttng_live_url_parts.session_name) { - viewer_connection->session_name = - lttng_live_url_parts.session_name; + viewer_connection->session_name = lttng_live_url_parts.session_name; lttng_live_url_parts.session_name = NULL; } BT_COMP_LOGI("Connecting to hostname : %s, port : %d, " - "target hostname : %s, session name : %s, " - "proto : %s", - viewer_connection->relay_hostname->str, - viewer_connection->port, - !viewer_connection->target_hostname ? - "" : viewer_connection->target_hostname->str, - !viewer_connection->session_name ? - "" : viewer_connection->session_name->str, - lttng_live_url_parts.proto->str); + "target hostname : %s, session name : %s, proto : %s", + viewer_connection->relay_hostname->str, + viewer_connection->port, + !viewer_connection->target_hostname ? + "" : viewer_connection->target_hostname->str, + !viewer_connection->session_name ? + "" : viewer_connection->session_name->str, + lttng_live_url_parts.proto->str); ret = 0; end: @@ -309,29 +308,19 @@ int list_update_session(bt_value *results, bool *_found, struct live_viewer_connection *viewer_connection) { int ret = 0; + uint64_t i, len; bt_value *map = NULL; bt_value *hostname = NULL; bt_value *session_name = NULL; bt_value *btval = NULL; - int i, len; bool found = false; - len = bt_value_array_get_size(results); - if (len < 0) { - BT_COMP_LOGE_STR("Error getting size of array."); - ret = -1; - goto end; - } + len = bt_value_array_get_length(results); for (i = 0; i < len; i++) { const char *hostname_str = NULL; const char *session_name_str = NULL; - map = bt_value_array_borrow_element_by_index(results, (size_t) i); - if (!map) { - BT_COMP_LOGE_STR("Error borrowing map."); - ret = -1; - goto end; - } + map = bt_value_array_borrow_element_by_index(results, i); hostname = bt_value_map_borrow_entry_value(map, "target-hostname"); if (!hostname) { BT_COMP_LOGE_STR("Error borrowing \"target-hostname\" entry."); @@ -361,10 +350,10 @@ int list_update_session(bt_value *results, ret = -1; goto end; } - val = bt_value_integer_signed_get(btval); + val = bt_value_integer_unsigned_get(btval); /* sum */ val += streams; - bt_value_integer_signed_set(btval, val); + bt_value_integer_unsigned_set(btval, val); btval = bt_value_map_borrow_entry_value(map, "client-count"); if (!btval) { @@ -372,10 +361,10 @@ int list_update_session(bt_value *results, ret = -1; goto end; } - val = bt_value_integer_signed_get(btval); + val = bt_value_integer_unsigned_get(btval); /* max */ val = bt_max_t(int64_t, clients, val); - bt_value_integer_signed_set(btval, val); + bt_value_integer_unsigned_set(btval, val); } if (found) { @@ -469,7 +458,7 @@ int list_append_session(bt_value *results, { uint32_t live_timer = be32toh(session->live_timer); - insert_status = bt_value_map_insert_signed_integer_entry( + insert_status = bt_value_map_insert_unsigned_integer_entry( map, "timer-us", live_timer); if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) { BT_COMP_LOGE_STR("Error inserting \"timer-us\" entry."); @@ -485,7 +474,7 @@ int list_append_session(bt_value *results, { uint32_t streams = be32toh(session->streams); - insert_status = bt_value_map_insert_signed_integer_entry(map, + insert_status = bt_value_map_insert_unsigned_integer_entry(map, "stream-count", streams); if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) { BT_COMP_LOGE_STR("Error inserting \"stream-count\" entry."); @@ -501,7 +490,7 @@ int list_append_session(bt_value *results, { uint32_t clients = be32toh(session->clients); - insert_status = bt_value_map_insert_signed_integer_entry(map, + insert_status = bt_value_map_insert_unsigned_integer_entry(map, "client-count", clients); if (insert_status != BT_VALUE_MAP_INSERT_ENTRY_STATUS_OK) { BT_COMP_LOGE_STR("Error inserting \"client-count\" entry."); @@ -573,10 +562,6 @@ bt_component_class_query_method_status live_viewer_connection_list_sessions( uint32_t i, sessions_count; ssize_t ret_len; - if (lttng_live_handshake(viewer_connection)) { - goto error; - } - result = bt_value_array_create(); if (!result) { BT_COMP_LOGE("Error creating array"); @@ -770,9 +755,9 @@ int receive_streams(struct lttng_live_session *session, ssize_t ret_len; uint32_t i; struct lttng_live_msg_iter *lttng_live_msg_iter = - session->lttng_live_msg_iter; + session->lttng_live_msg_iter; struct live_viewer_connection *viewer_connection = - lttng_live_msg_iter->viewer_connection; + lttng_live_msg_iter->viewer_connection; BT_COMP_LOGI("Getting %" PRIu32 " new streams:", stream_count); for (i = 0; i < stream_count; i++) { @@ -798,8 +783,7 @@ int receive_streams(struct lttng_live_session *session, if (stream.metadata_flag) { BT_COMP_LOGI(" metadata stream %" PRIu64 " : %s/%s", - stream_id, stream.path_name, - stream.channel_name); + stream_id, stream.path_name, stream.channel_name); if (lttng_live_metadata_create_stream(session, ctf_trace_id, stream_id, stream.path_name)) { @@ -810,8 +794,7 @@ int receive_streams(struct lttng_live_session *session, session->lazy_stream_msg_init = true; } else { BT_COMP_LOGI(" stream %" PRIu64 " : %s/%s", - stream_id, stream.path_name, - stream.channel_name); + stream_id, stream.path_name, stream.channel_name); live_stream = lttng_live_stream_iterator_create(session, ctf_trace_id, stream_id); if (!live_stream) { @@ -832,14 +815,15 @@ int lttng_live_attach_session(struct lttng_live_session *session) struct lttng_viewer_cmd cmd; struct lttng_viewer_attach_session_request rq; struct lttng_viewer_attach_session_response rp; - ssize_t ret_len; - struct lttng_live_msg_iter *lttng_live_msg_iter = session->lttng_live_msg_iter; + struct lttng_live_msg_iter *lttng_live_msg_iter = + session->lttng_live_msg_iter; struct live_viewer_connection *viewer_connection = - lttng_live_msg_iter->viewer_connection; + lttng_live_msg_iter->viewer_connection; uint64_t session_id = session->id; uint32_t streams_count; const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq); char cmd_buf[cmd_buf_len]; + ssize_t ret_len; cmd.cmd = htobe32(LTTNG_VIEWER_ATTACH_SESSION); cmd.data_size = htobe64((uint64_t) sizeof(rq)); @@ -918,9 +902,10 @@ int lttng_live_detach_session(struct lttng_live_session *session) struct lttng_viewer_detach_session_request rq; struct lttng_viewer_detach_session_response rp; ssize_t ret_len; - struct lttng_live_msg_iter *lttng_live_msg_iter = session->lttng_live_msg_iter; + struct lttng_live_msg_iter *lttng_live_msg_iter = + session->lttng_live_msg_iter; struct live_viewer_connection *viewer_connection = - lttng_live_msg_iter->viewer_connection; + lttng_live_msg_iter->viewer_connection; uint64_t session_id = session->id; const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq); char cmd_buf[cmd_buf_len]; @@ -984,21 +969,22 @@ error: } BT_HIDDEN -ssize_t lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, - FILE *fp) +enum lttng_live_get_one_metadata_status lttng_live_get_one_metadata_packet( + struct lttng_live_trace *trace, FILE *fp, size_t *reply_len) { uint64_t len = 0; - int ret; + enum lttng_live_get_one_metadata_status metadata_status; struct lttng_viewer_cmd cmd; struct lttng_viewer_get_metadata rq; struct lttng_viewer_metadata_packet rp; char *data = NULL; ssize_t ret_len; struct lttng_live_session *session = trace->session; - struct lttng_live_msg_iter *lttng_live_msg_iter = session->lttng_live_msg_iter; + struct lttng_live_msg_iter *lttng_live_msg_iter = + session->lttng_live_msg_iter; struct lttng_live_metadata *metadata = trace->metadata; struct live_viewer_connection *viewer_connection = - lttng_live_msg_iter->viewer_connection; + lttng_live_msg_iter->viewer_connection; const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq); char cmd_buf[cmd_buf_len]; @@ -1034,15 +1020,21 @@ ssize_t lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, switch (be32toh(rp.status)) { case LTTNG_VIEWER_METADATA_OK: - BT_COMP_LOGD("get_metadata : OK"); + BT_COMP_LOGD("Received get_metadata response : OK"); break; case LTTNG_VIEWER_NO_NEW_METADATA: - BT_COMP_LOGD("get_metadata : NO NEW"); - ret = 0; + BT_COMP_LOGD("Received get_metadata response: no new"); + metadata_status = LTTNG_LIVE_GET_ONE_METADATA_STATUS_END; goto end; case LTTNG_VIEWER_METADATA_ERR: - BT_COMP_LOGD("get_metadata : ERR"); - goto error; + /* + * The Relayd cannot find this stream id. Maybe its + * gone already. This can happen in short lived UST app + * in a per-pid session. + */ + BT_COMP_LOGD("Received get_metadata response: error"); + metadata_status = LTTNG_LIVE_GET_ONE_METADATA_STATUS_CLOSED; + goto end; default: BT_COMP_LOGD("get_metadata : UNKNOWN"); goto error; @@ -1079,14 +1071,18 @@ ssize_t lttng_live_get_one_metadata_packet(struct lttng_live_trace *trace, } BT_ASSERT(ret_len == len); free(data); - ret = len; -end: - return ret; + *reply_len = len; + metadata_status = LTTNG_LIVE_GET_ONE_METADATA_STATUS_OK; + + goto end; error_free_data: free(data); error: - return -1; + metadata_status = LTTNG_LIVE_GET_ONE_METADATA_STATUS_ERROR; + +end: + return metadata_status; } /* @@ -1115,16 +1111,15 @@ enum lttng_live_iterator_status lttng_live_get_next_index( { struct lttng_viewer_cmd cmd; struct lttng_viewer_get_next_index rq; - ssize_t ret_len; struct lttng_viewer_index rp; - uint32_t flags, status; - enum lttng_live_iterator_status retstatus = - LTTNG_LIVE_ITERATOR_STATUS_OK; + enum lttng_live_iterator_status retstatus = LTTNG_LIVE_ITERATOR_STATUS_OK; struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection; struct lttng_live_trace *trace = stream->trace; const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq); char cmd_buf[cmd_buf_len]; + uint32_t flags, status; + ssize_t ret_len; cmd.cmd = htobe32(LTTNG_VIEWER_GET_NEXT_INDEX); cmd.data_size = htobe64((uint64_t) sizeof(rq)); @@ -1221,6 +1216,7 @@ enum lttng_live_iterator_status lttng_live_get_next_index( index->offset = EOF; retstatus = LTTNG_LIVE_ITERATOR_STATUS_END; stream->state = LTTNG_LIVE_STREAM_EOF; + stream->has_stream_hung_up = true; break; case LTTNG_VIEWER_INDEX_ERR: BT_COMP_LOGE("get_next_index: error"); @@ -1252,16 +1248,16 @@ enum bt_msg_iter_medium_status lttng_live_get_stream_bytes( uint64_t offset, uint64_t req_len, uint64_t *recv_len) { enum bt_msg_iter_medium_status retstatus = BT_MSG_ITER_MEDIUM_STATUS_OK; + struct lttng_viewer_trace_packet rp; struct lttng_viewer_cmd cmd; struct lttng_viewer_get_packet rq; - struct lttng_viewer_trace_packet rp; - ssize_t ret_len; - uint32_t flags, status; struct live_viewer_connection *viewer_connection = lttng_live_msg_iter->viewer_connection; struct lttng_live_trace *trace = stream->trace; const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq); char cmd_buf[cmd_buf_len]; + uint32_t flags, status; + ssize_t ret_len; BT_COMP_LOGD("lttng_live_get_stream_bytes: offset=%" PRIu64 ", req_len=%" PRIu64, offset, req_len); @@ -1380,7 +1376,6 @@ enum lttng_live_iterator_status lttng_live_get_new_streams( struct lttng_viewer_cmd cmd; struct lttng_viewer_new_streams_request rq; struct lttng_viewer_new_streams_response rp; - ssize_t ret_len; struct lttng_live_msg_iter *lttng_live_msg_iter = session->lttng_live_msg_iter; struct live_viewer_connection *viewer_connection = @@ -1388,6 +1383,7 @@ enum lttng_live_iterator_status lttng_live_get_new_streams( uint32_t streams_count; const size_t cmd_buf_len = sizeof(cmd) + sizeof(rq); char cmd_buf[cmd_buf_len]; + ssize_t ret_len; if (!session->new_streams_needed) { return LTTNG_LIVE_ITERATOR_STATUS_OK; @@ -1466,18 +1462,23 @@ error: BT_HIDDEN struct live_viewer_connection *live_viewer_connection_create( const char *url, bool in_query, - struct lttng_live_msg_iter *lttng_live_msg_iter) + struct lttng_live_msg_iter *lttng_live_msg_iter, + bt_logging_level log_level) { struct live_viewer_connection *viewer_connection; viewer_connection = g_new0(struct live_viewer_connection, 1); - if (bt_socket_init(lttng_live_msg_iter->log_level) != 0) { + if (bt_socket_init(log_level) != 0) { goto error; } - viewer_connection->log_level = lttng_live_msg_iter->log_level; - viewer_connection->self_comp = lttng_live_msg_iter->self_comp; + viewer_connection->log_level = log_level; + + if (lttng_live_msg_iter) { + viewer_connection->self_comp = lttng_live_msg_iter->self_comp; + } + bt_object_init_shared(&viewer_connection->obj, connection_release); viewer_connection->control_sock = BT_INVALID_SOCKET; viewer_connection->port = -1; @@ -1498,7 +1499,10 @@ struct live_viewer_connection *live_viewer_connection_create( error_report: BT_COMP_LOGW("Failure to establish connection to url \"%s\"", url); error: - g_free(viewer_connection); + if (viewer_connection) { + live_viewer_connection_destroy(viewer_connection); + } + return NULL; } @@ -1508,7 +1512,9 @@ void live_viewer_connection_destroy( { BT_COMP_LOGI("Closing connection to url \"%s\"", viewer_connection->url->str); lttng_live_disconnect_viewer(viewer_connection); - g_string_free(viewer_connection->url, true); + if (viewer_connection->url) { + g_string_free(viewer_connection->url, true); + } if (viewer_connection->relay_hostname) { g_string_free(viewer_connection->relay_hostname, true); }