X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fplugins%2Fctf%2Flttng-live%2Flttng-live.c;h=7760daf650099e25f89d9929396e859bf09531dc;hb=4a39caef874f11e1684e67fd33ad8f86b0a6d651;hp=62dc28f0d8b4ebfe28e06a585362c1271d6ad2c8;hpb=3c729b9af1b926f739be5bbba4ec20a296746023;p=babeltrace.git diff --git a/src/plugins/ctf/lttng-live/lttng-live.c b/src/plugins/ctf/lttng-live/lttng-live.c index 62dc28f0..7760daf6 100644 --- a/src/plugins/ctf/lttng-live/lttng-live.c +++ b/src/plugins/ctf/lttng-live/lttng-live.c @@ -793,6 +793,34 @@ end: return ret; } +static +enum lttng_live_iterator_status lttng_live_iterator_close_stream( + struct lttng_live_msg_iter *lttng_live_msg_iter, + struct lttng_live_stream_iterator *stream_iter, + bt_message **curr_msg) +{ + enum lttng_live_iterator_status live_status = + LTTNG_LIVE_ITERATOR_STATUS_OK; + /* + * The viewer has hung up on us so we are closing the stream. The + * `bt_msg_iter` should simply realize that it needs to close the + * stream properly by emitting the necessary stream end message. + */ + enum bt_msg_iter_status status = + bt_msg_iter_get_next_message(stream_iter->msg_iter, + lttng_live_msg_iter->self_msg_iter, curr_msg); + + if (status == BT_MSG_ITER_STATUS_ERROR) { + live_status = LTTNG_LIVE_ITERATOR_STATUS_ERROR; + goto end; + } + + BT_ASSERT(status == BT_MSG_ITER_STATUS_OK); + +end: + return live_status; +} + /* * helper function: * handle_no_data_streams() @@ -851,6 +879,17 @@ enum lttng_live_iterator_status lttng_live_iterator_next_on_stream( bt_self_component *self_comp = lttng_live_msg_iter->self_comp; enum lttng_live_iterator_status live_status; + if (stream_iter->has_stream_hung_up) { + /* + * The stream has hung up and the stream was properly closed + * during the last call to the current function. Return _END + * status now so that this stream iterator is removed for the + * stream iterator list. + */ + live_status = LTTNG_LIVE_ITERATOR_STATUS_END; + goto end; + } + retry: print_stream_state(stream_iter); live_status = lttng_live_iterator_handle_new_streams_and_metadata( @@ -860,7 +899,16 @@ retry: } live_status = lttng_live_iterator_next_handle_one_no_data_stream( lttng_live_msg_iter, stream_iter); + if (live_status != LTTNG_LIVE_ITERATOR_STATUS_OK) { + if (live_status == LTTNG_LIVE_ITERATOR_STATUS_END) { + /* + * We overwrite `live_status` since `curr_msg` is + * likely set to a valid message in this function. + */ + live_status = lttng_live_iterator_close_stream( + lttng_live_msg_iter, stream_iter, curr_msg); + } goto end; } live_status = lttng_live_iterator_next_handle_one_quiescent_stream( @@ -1337,7 +1385,7 @@ bt_component_class_message_iterator_init_method_status lttng_live_msg_iter_init( lttng_live_msg_iter->viewer_connection = live_viewer_connection_create(lttng_live->params.url->str, false, - lttng_live_msg_iter); + lttng_live_msg_iter, log_level); if (!lttng_live_msg_iter->viewer_connection) { goto error; } @@ -1372,6 +1420,17 @@ bt_component_class_message_iterator_init_method_status lttng_live_msg_iter_init( SESS_NOT_FOUND_ACTION_END_STR, lttng_live->params.url->str); break; + case SESSION_NOT_FOUND_ACTION_UNKNOWN: + default: + /* Fallthrough */ + BT_COMP_LOGE("Unknown action for session not found" + "error. Fail the message iterator" + "initialization because of %s=\"%s\" " + "component parameter: url =\"%s\"", + SESS_NOT_FOUND_ACTION_PARAM, + SESS_NOT_FOUND_ACTION_FAIL_STR, + lttng_live->params.url->str); + break; } } @@ -1413,7 +1472,8 @@ bt_component_class_query_method_status lttng_live_query_list_sessions( url = bt_value_string_get(url_value); - viewer_connection = live_viewer_connection_create(url, true, NULL); + viewer_connection = live_viewer_connection_create(url, true, NULL, + log_level); if (!viewer_connection) { goto error; } @@ -1445,6 +1505,7 @@ bt_component_class_query_method_status lttng_live_query( bt_self_component_class_source *comp_class, bt_private_query_executor *priv_query_exec, const char *object, const bt_value *params, + __attribute__((unused)) void *method_data, const bt_value **result) { bt_component_class_query_method_status status = @@ -1505,7 +1566,7 @@ enum session_not_found_action parse_session_not_found_action_param( } else if (strcmp(no_session_act_str, SESS_NOT_FOUND_ACTION_END_STR) == 0) { action = SESSION_NOT_FOUND_ACTION_END; } else { - action = -1; + action = SESSION_NOT_FOUND_ACTION_UNKNOWN; } return action; @@ -1545,7 +1606,7 @@ struct lttng_live_component *lttng_live_component_create(const bt_value *params, if (value && bt_value_is_string(value)) { lttng_live->params.sess_not_found_act = parse_session_not_found_action_param(value); - if (lttng_live->params.sess_not_found_act == -1) { + if (lttng_live->params.sess_not_found_act == SESSION_NOT_FOUND_ACTION_UNKNOWN) { BT_COMP_LOGE("Unexpected value for `%s` parameter: " "value=\"%s\"", SESS_NOT_FOUND_ACTION_PARAM, bt_value_string_get(value));