summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
bb2452c)
When tracing is inactive (before start/after stop), the current behavior
is to track all applications registered as UST data producers and
allocate buffers and files.
However, we guarantee that the trace is readable (invariant) after a
"stop" command has waited for data pending to complete. Unfortunately,
tracking additional applications (and adding their files) after tracing
is stopped (for each pid in per-pid buffers, for new uid in per-uid
buffers) does not respect this guarantee.
Fix this by *not* allocating channels, events, contexts when tracing
is inactive, but rather allocate those lazily just before tracing
starts.
One reason why this was not originally done was to ensure we could
have a fast start command. There are however other ways to achieve this
in the future that will respect the stop invariant guarantees.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
DBG2("UST app disabling channel %s from global domain for session id %" PRIu64,
uchan->name, usess->id);
DBG2("UST app disabling channel %s from global domain for session id %" PRIu64,
uchan->name, usess->id);
+ if (!usess->active) {
+ goto end;
+ }
+
rcu_read_lock();
/* For every registered applications */
rcu_read_lock();
/* For every registered applications */
rcu_read_unlock();
error:
rcu_read_unlock();
error:
DBG2("UST app enabling channel %s to global domain for session id %" PRIu64,
uchan->name, usess->id);
DBG2("UST app enabling channel %s to global domain for session id %" PRIu64,
uchan->name, usess->id);
+ if (!usess->active) {
+ goto end;
+ }
+
rcu_read_lock();
/* For every registered applications */
rcu_read_lock();
/* For every registered applications */
rcu_read_unlock();
error:
rcu_read_unlock();
error:
"%s for session id %" PRIu64,
uevent->attr.name, uchan->name, usess->id);
"%s for session id %" PRIu64,
uevent->attr.name, uchan->name, usess->id);
+ if (!usess->active) {
+ goto end;
+ }
+
rcu_read_lock();
/* For all registered applications */
rcu_read_lock();
/* For all registered applications */
DBG2("UST app adding channel %s to UST domain for session id %" PRIu64,
uchan->name, usess->id);
DBG2("UST app adding channel %s to UST domain for session id %" PRIu64,
uchan->name, usess->id);
+ if (!usess->active) {
+ goto end;
+ }
+
rcu_read_lock();
/* For every registered applications */
rcu_read_lock();
/* For every registered applications */
error_rcu_unlock:
rcu_read_unlock();
error_rcu_unlock:
rcu_read_unlock();
DBG("UST app enabling event %s for all apps for session id %" PRIu64,
uevent->attr.name, usess->id);
DBG("UST app enabling event %s for all apps for session id %" PRIu64,
uevent->attr.name, usess->id);
+ if (!usess->active) {
+ goto end;
+ }
+
/*
* NOTE: At this point, this function is called only if the session and
* channel passed are already created for all apps. and enabled on the
/*
* NOTE: At this point, this function is called only if the session and
* channel passed are already created for all apps. and enabled on the
error:
rcu_read_unlock();
error:
rcu_read_unlock();
DBG("UST app creating event %s for all apps for session id %" PRIu64,
uevent->attr.name, usess->id);
DBG("UST app creating event %s for all apps for session id %" PRIu64,
uevent->attr.name, usess->id);
+ if (!usess->active) {
+ goto end;
+ }
+
rcu_read_lock();
/* For all registered applications */
rcu_read_lock();
/* For all registered applications */
*/
(void) ust_app_clear_quiescent_session(usess);
*/
(void) ust_app_clear_quiescent_session(usess);
+ cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
+ ust_app_global_update(usess, app);
+ }
+
cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
ret = ust_app_start_trace(usess, app);
if (ret < 0) {
cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
ret = ust_app_start_trace(usess, app);
if (ret < 0) {
/* App session already created. */
goto end;
}
/* App session already created. */
goto end;
}
+ if (!usess->active) {
+ goto end;
+ }
assert(ua_sess);
pthread_mutex_lock(&ua_sess->lock);
assert(ua_sess);
pthread_mutex_lock(&ua_sess->lock);
pthread_mutex_unlock(&ua_sess->lock);
pthread_mutex_unlock(&ua_sess->lock);
- if (usess->active) {
- ret = ust_app_start_trace(usess, app);
- if (ret < 0) {
- goto error;
- }
-
- DBG2("UST trace started for app pid %d", app->pid);
+ ret = ust_app_start_trace(usess, app);
+ if (ret < 0) {
+ goto error;
+
+ DBG2("UST trace started for app pid %d", app->pid);
end:
/* Everything went well at this point. */
return;
end:
/* Everything went well at this point. */
return;
if (!app->compatible) {
return;
}
if (!app->compatible) {
return;
}
+ if (!usess->active) {
+ return;
+ }
if (trace_ust_pid_tracker_lookup(usess, app->pid)) {
ust_app_global_create(usess, app);
} else {
if (trace_ust_pid_tracker_lookup(usess, app->pid)) {
ust_app_global_create(usess, app);
} else {
struct lttng_ht_iter iter;
struct ust_app *app;
struct lttng_ht_iter iter;
struct ust_app *app;
+ if (!usess->active) {
+ return;
+ }
rcu_read_lock();
cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
ust_app_global_update(usess, app);
rcu_read_lock();
cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
ust_app_global_update(usess, app);
struct ust_app_session *ua_sess;
struct ust_app *app;
struct ust_app_session *ua_sess;
struct ust_app *app;
+ if (!usess->active) {
+ goto end;
+ }
+
rcu_read_lock();
cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
rcu_read_lock();
cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {