* SOFTWARE.
*/
+#define BT_LOG_TAG "PLUGIN-CTF-LTTNG-LIVE-SRC"
+#include "logging.h"
+
#include <babeltrace/ctf-ir/packet.h>
#include <babeltrace/graph/component-source.h>
#include <babeltrace/graph/private-port.h>
#include <babeltrace/graph/notification-heap.h>
#include <babeltrace/graph/notification-iterator.h>
#include <babeltrace/graph/notification-inactivity.h>
+#include <babeltrace/graph/graph.h>
#include <babeltrace/compiler-internal.h>
#include <inttypes.h>
#include <glib.h>
#include <unistd.h>
#include <plugins-common.h>
-#define BT_LOG_TAG "PLUGIN-CTF-LTTNG-LIVE"
-#define BT_LOGLEVEL_NAME "BABELTRACE_PLUGIN_CTF_LTTNG_LIVE_LOG_LEVEL"
-
#include "data-stream.h"
#include "metadata.h"
#include "lttng-live-internal.h"
print_state(stream), stream->last_returned_inactivity_timestamp, \
stream->current_inactivity_timestamp)
-BT_HIDDEN
-int bt_lttng_live_log_level = BT_LOG_NONE;
-
BT_HIDDEN
int lttng_live_add_port(struct lttng_live_component *lttng_live,
struct lttng_live_stream_iterator *stream_iter)
}
BT_HIDDEN
-int lttng_live_add_session(struct lttng_live_component *lttng_live, uint64_t session_id)
+int lttng_live_add_session(struct lttng_live_component *lttng_live,
+ uint64_t session_id, const char *hostname,
+ const char *session_name)
{
int ret = 0;
struct lttng_live_session *s;
BT_INIT_LIST_HEAD(&s->traces);
s->lttng_live = lttng_live;
s->new_streams_needed = true;
+ s->hostname = g_string_new(hostname);
+ s->session_name = g_string_new(session_name);
- BT_LOGI("Reading from session %" PRIu64, s->id);
+ BT_LOGI("Reading from session: %" PRIu64 " hostname: %s session_name: %s",
+ s->id, hostname, session_name);
bt_list_add(&s->node, <tng_live->sessions);
goto end;
error:
BT_LOGI("Destroy session");
if (session->id != -1ULL) {
if (lttng_live_detach_session(session)) {
- /* Old relayd cannot detach sessions. */
- BT_LOGD("Unable to detach session %" PRIu64,
- session->id);
+ if (!bt_graph_is_canceled(session->lttng_live->graph)) {
+ /* Old relayd cannot detach sessions. */
+ BT_LOGD("Unable to detach session %" PRIu64,
+ session->id);
+ }
}
session->id = -1ULL;
}
lttng_live_close_trace_streams(trace);
}
bt_list_del(&session->node);
+ if (session->hostname) {
+ g_string_free(session->hostname, TRUE);
+ }
+ if (session->session_name) {
+ g_string_free(session->session_name, TRUE);
+ }
g_free(session);
}
struct lttng_live_trace *trace, *t;
if (lttng_live_attach_session(session)) {
- return BT_CTF_LTTNG_LIVE_ITERATOR_STATUS_ERROR;
+ if (bt_graph_is_canceled(lttng_live->graph)) {
+ return BT_CTF_LTTNG_LIVE_ITERATOR_STATUS_AGAIN;
+ } else {
+ return BT_CTF_LTTNG_LIVE_ITERATOR_STATUS_ERROR;
+ }
}
status = lttng_live_get_new_streams(session);
if (status != BT_CTF_LTTNG_LIVE_ITERATOR_STATUS_OK &&
}
static
-enum bt_notification_iterator_status lttng_live_iterator_next_handle_new_streams_and_metadata(
+enum bt_ctf_lttng_live_iterator_status lttng_live_iterator_next_handle_new_streams_and_metadata(
struct lttng_live_component *lttng_live)
{
enum bt_ctf_lttng_live_iterator_status ret =
struct bt_value *results = NULL;
const char *url;
struct bt_live_viewer_connection *viewer_connection = NULL;
- enum bt_value_status ret;
url_value = bt_value_map_get(params, "url");
if (!url_value || bt_value_is_null(url_value) || !bt_value_is_string(url_value)) {
goto error;
}
- ret = bt_value_string_get(url_value, &url);
- if (ret != BT_VALUE_STATUS_OK) {
+ if (bt_value_string_get(url_value, &url) != BT_VALUE_STATUS_OK) {
BT_LOGW("\"url\" parameter is required to be a string value");
goto error;
}
- viewer_connection = bt_live_viewer_connection_create(url, stderr);
+ viewer_connection = bt_live_viewer_connection_create(url, NULL);
if (!viewer_connection) {
- ret = BT_COMPONENT_STATUS_NOMEM;
goto error;
}
static
struct lttng_live_component *lttng_live_component_create(struct bt_value *params,
- struct bt_private_component *private_component)
+ struct bt_private_component *private_component,
+ struct bt_graph *graph)
{
struct lttng_live_component *lttng_live;
struct bt_value *value = NULL;
goto error;
}
lttng_live->viewer_connection =
- bt_live_viewer_connection_create(lttng_live->url->str,
- stderr);
+ bt_live_viewer_connection_create(lttng_live->url->str, lttng_live);
if (!lttng_live->viewer_connection) {
- ret = BT_COMPONENT_STATUS_NOMEM;
goto error;
}
if (lttng_live_create_viewer_session(lttng_live)) {
- ret = BT_COMPONENT_STATUS_ERROR;
goto error;
}
lttng_live->private_component = private_component;
+ lttng_live->graph = graph;
goto end;
}
BT_HIDDEN
-enum bt_component_status lttng_live_component_init(struct bt_private_component *component,
+enum bt_component_status lttng_live_component_init(
+ struct bt_private_component *private_component,
struct bt_value *params, void *init_method_data)
{
struct lttng_live_component *lttng_live;
enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+ struct bt_component *component;
+ struct bt_graph *graph;
+
+ component = bt_component_from_private_component(private_component);
+ graph = bt_component_get_graph(component);
+ bt_put(graph); /* weak */
+ bt_put(component);
/* Passes ownership of iter ref to lttng_live_component_create. */
- lttng_live = lttng_live_component_create(params, component);
+ lttng_live = lttng_live_component_create(params, private_component,
+ graph);
if (!lttng_live) {
- ret = BT_COMPONENT_STATUS_NOMEM;
+ if (bt_graph_is_canceled(graph)) {
+ ret = BT_COMPONENT_STATUS_AGAIN;
+ } else {
+ ret = BT_COMPONENT_STATUS_NOMEM;
+ }
goto end;
}
lttng_live->no_stream_iter);
lttng_live->no_stream_iter->port = lttng_live->no_stream_port;
- ret = bt_private_component_set_user_data(component, lttng_live);
+ ret = bt_private_component_set_user_data(private_component, lttng_live);
if (ret != BT_COMPONENT_STATUS_OK) {
goto error;
}
end:
return ret;
error:
- (void) bt_private_component_set_user_data(component, NULL);
+ (void) bt_private_component_set_user_data(private_component, NULL);
lttng_live_component_destroy_data(lttng_live);
return ret;
}
bt_put(self_port);
return status;
}
-
-static
-void __attribute__((constructor)) bt_lttng_live_logging_ctor(void)
-{
- enum bt_logging_level log_level = BT_LOG_NONE;
- const char *log_level_env = getenv(BT_LOGLEVEL_NAME);
-
- if (!log_level_env) {
- return;
- }
-
- if (strcmp(log_level_env, "VERBOSE") == 0) {
- log_level = BT_LOGGING_LEVEL_VERBOSE;
- } else if (strcmp(log_level_env, "DEBUG") == 0) {
- log_level = BT_LOGGING_LEVEL_DEBUG;
- } else if (strcmp(log_level_env, "INFO") == 0) {
- log_level = BT_LOGGING_LEVEL_INFO;
- } else if (strcmp(log_level_env, "WARN") == 0) {
- log_level = BT_LOGGING_LEVEL_WARN;
- } else if (strcmp(log_level_env, "ERROR") == 0) {
- log_level = BT_LOGGING_LEVEL_ERROR;
- } else if (strcmp(log_level_env, "FATAL") == 0) {
- log_level = BT_LOGGING_LEVEL_FATAL;
- } else {
- bt_lttng_live_log_level = BT_LOGGING_LEVEL_FATAL;
- BT_LOGF("Incorrect log level specified in %s",
- BT_LOGLEVEL_NAME);
- abort();
- }
-
- bt_lttng_live_log_level = log_level;
-}