- MSG("Tracing started for session %s", session_name);
- if (lttng_opt_mi) {
- ret = mi_print_session(session_name, 1);
- if (ret) {
- ret = CMD_ERROR;
- goto free_name;
+ for (const auto& session : sessions) {
+ cmd_error_code sub_ret;
+
+ try {
+ sub_ret = start_tracing(session.name);
+ } catch (const lttng::ctl::error& ctl_exception) {
+ switch (ctl_exception.code()) {
+ case LTTNG_ERR_TRACE_ALREADY_STARTED:
+ WARN_FMT("Tracing already started for session `{}`", session.name);
+ sub_ret = CMD_SUCCESS;
+ break;
+ case LTTNG_ERR_NO_SESSION:
+ if (spec.type != session_spec::type::NAME) {
+ /* Session destroyed during command, ignore and carry-on. */
+ sub_ret = CMD_SUCCESS;
+ break;
+ } else {
+ sub_ret = CMD_ERROR;
+ break;
+ }
+ case LTTNG_ERR_NO_SESSIOND:
+ /* Don't keep going on a fatal error. */
+ return CMD_FATAL;
+ default:
+ /* Generic error. */
+ sub_ret = CMD_ERROR;
+ ERR_FMT("Failed to start session `{}` ({})",
+ session.name,
+ lttng_strerror(-ctl_exception.code()));
+ break;
+ }