From: Jérémie Galarneau Date: Tue, 7 Apr 2020 04:46:39 +0000 (-0400) Subject: Fix: lttng-load: support legacy PID tracker specification X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=commitdiff_plain;h=f7af9a72c6709249c199989685bcd7d878ba2b33 Fix: lttng-load: support legacy PID tracker specification The 2.12 release changes the way tracked process attributes are expressed in the MI and save/restore formats. While the MI schema was bumped to 4.0, the save/restore schema only undergoes a minor bump to accomodate existing users. The original commit introducing this change justified the breaking change as saved PIDs being fairly unlikely. However, even the 'INCLUDE_ALL' policy will specify a 'trackers' node, which no longer existed and made all existing configurations incompatible. A legacy load path is introduced to support the former PID tracker serialization format and preserve the compatibility with existing configurations. Configurations generated by the 2.11 releases are included to test this new legacy path. Signed-off-by: Jérémie Galarneau Change-Id: Ied6532c42cb2d1a5c9e39785cc4e47aaf89b8288 --- diff --git a/src/common/config/session-config.c b/src/common/config/session-config.c index c7f471a1c..a8ea68eda 100644 --- a/src/common/config/session-config.c +++ b/src/common/config/session-config.c @@ -154,6 +154,13 @@ LTTNG_HIDDEN const char * const config_element_process_attr_gid_value = "gid"; LTTNG_HIDDEN const char * const config_element_process_attr_vgid_value = "vgid"; LTTNG_HIDDEN const char * const config_element_process_attr_tracker_type = "process_attr_tracker_type"; +/* Used for support of legacy tracker serialization (< 2.12). */ +LTTNG_HIDDEN const char * const config_element_trackers_legacy = "trackers"; +LTTNG_HIDDEN const char * const config_element_pid_tracker_legacy = "pid_tracker"; +LTTNG_HIDDEN const char * const config_element_tracker_targets_legacy = "targets"; +LTTNG_HIDDEN const char * const config_element_tracker_pid_target_legacy = "pid_target"; +LTTNG_HIDDEN const char * const config_element_tracker_pid_legacy = "pid"; + LTTNG_HIDDEN const char * const config_element_rotation_schedules = "rotation_schedules"; LTTNG_HIDDEN const char * const config_element_rotation_schedule_periodic = "periodic"; LTTNG_HIDDEN const char * const config_element_rotation_schedule_periodic_time_us = "time_us"; @@ -2725,12 +2732,143 @@ static int get_tracker_elements(enum lttng_process_attr process_attr, return ret; } +static int process_legacy_pid_tracker_node( + xmlNodePtr trackers_node, struct lttng_handle *handle) +{ + int ret = 0, child_count; + xmlNodePtr targets_node = NULL; + xmlNodePtr node; + const char *element_id_tracker; + const char *element_target_id; + const char *element_id; + const char *element_id_alias; + const char *element_name; + enum lttng_error_code tracker_handle_ret_code; + struct lttng_process_attr_tracker_handle *tracker_handle = NULL; + enum lttng_process_attr_tracker_handle_status status; + const enum lttng_process_attr process_attr = + handle->domain.type == LTTNG_DOMAIN_UST ? + LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID : + LTTNG_PROCESS_ATTR_PROCESS_ID; + + assert(handle); + + tracker_handle_ret_code = lttng_session_get_tracker_handle( + handle->session_name, handle->domain.type, + process_attr, + &tracker_handle); + if (tracker_handle_ret_code != LTTNG_OK) { + ret = LTTNG_ERR_INVALID; + goto end; + } + + ret = get_tracker_elements(process_attr, &element_id_tracker, + &element_target_id, &element_id, &element_id_alias, + &element_name); + if (ret) { + goto end; + } + + /* Get the targets node */ + for (node = xmlFirstElementChild(trackers_node); node; + node = xmlNextElementSibling(node)) { + if (!strcmp((const char *) node->name, + config_element_tracker_targets_legacy)) { + targets_node = node; + break; + } + } + + if (!targets_node) { + ret = LTTNG_ERR_INVALID; + goto end; + } + + /* Go through all id target node */ + child_count = xmlChildElementCount(targets_node); + status = lttng_process_attr_tracker_handle_set_tracking_policy( + tracker_handle, + child_count == 0 ? LTTNG_TRACKING_POLICY_EXCLUDE_ALL : + LTTNG_TRACKING_POLICY_INCLUDE_SET); + if (status != LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_OK) { + ret = LTTNG_ERR_UNK; + goto end; + } + + /* Add all tracked values. */ + for (node = xmlFirstElementChild(targets_node); node; + node = xmlNextElementSibling(node)) { + xmlNodePtr pid_target_node = node; + + /* get pid_target node and track it */ + for (node = xmlFirstElementChild(pid_target_node); node; + node = xmlNextElementSibling(node)) { + if (!strcmp((const char *) node->name, + config_element_tracker_pid_legacy)) { + int64_t id; + xmlChar *content = xmlNodeGetContent(node); + + if (!content) { + ret = LTTNG_ERR_LOAD_INVALID_CONFIG; + goto end; + } + + ret = parse_int(content, &id); + free(content); + if (ret) { + ret = LTTNG_ERR_LOAD_INVALID_CONFIG; + goto end; + } + + switch (process_attr) { + case LTTNG_PROCESS_ATTR_PROCESS_ID: + status = lttng_process_attr_process_id_tracker_handle_add_pid( + tracker_handle, + (pid_t) id); + break; + case LTTNG_PROCESS_ATTR_VIRTUAL_PROCESS_ID: + status = lttng_process_attr_virtual_process_id_tracker_handle_add_pid( + tracker_handle, + (pid_t) id); + break; + default: + ret = LTTNG_ERR_INVALID; + goto end; + } + } + switch (status) { + case LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_OK: + continue; + case LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_INVALID: + ret = LTTNG_ERR_INVALID; + break; + case LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_EXISTS: + ret = LTTNG_ERR_PROCESS_ATTR_EXISTS; + break; + case LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_MISSING: + ret = LTTNG_ERR_PROCESS_ATTR_MISSING; + break; + case LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_ERROR: + case LTTNG_PROCESS_ATTR_TRACKER_HANDLE_STATUS_COMMUNICATION_ERROR: + default: + ret = LTTNG_ERR_UNK; + goto end; + } + } + node = pid_target_node; + } + +end: + lttng_process_attr_tracker_handle_destroy(tracker_handle); + return ret; + } + static int process_id_tracker_node(xmlNodePtr id_tracker_node, struct lttng_handle *handle, enum lttng_process_attr process_attr) { int ret = 0, child_count; - xmlNodePtr targets_node = NULL; + xmlNodePtr values_node = NULL; xmlNodePtr node; const char *element_id_tracker; const char *element_target_id; @@ -2759,23 +2897,23 @@ static int process_id_tracker_node(xmlNodePtr id_tracker_node, goto end; } - /* get the targets node */ + /* get the values node */ for (node = xmlFirstElementChild(id_tracker_node); node; node = xmlNextElementSibling(node)) { if (!strcmp((const char *) node->name, config_element_process_attr_values)) { - targets_node = node; + values_node = node; break; } } - if (!targets_node) { + if (!values_node) { ret = LTTNG_ERR_INVALID; goto end; } /* Go through all id target node */ - child_count = xmlChildElementCount(targets_node); + child_count = xmlChildElementCount(values_node); status = lttng_process_attr_tracker_handle_set_tracking_policy( tracker_handle, child_count == 0 ? LTTNG_TRACKING_POLICY_EXCLUDE_ALL : @@ -2786,7 +2924,7 @@ static int process_id_tracker_node(xmlNodePtr id_tracker_node, } /* Add all tracked values. */ - for (node = xmlFirstElementChild(targets_node); node; + for (node = xmlFirstElementChild(values_node); node; node = xmlNextElementSibling(node)) { xmlNodePtr id_target_node = node; @@ -3027,7 +3165,16 @@ int process_domain_node(xmlNodePtr domain_node, const char *session_name) for (node = xmlFirstElementChild(domain_node); node; node = xmlNextElementSibling(node)) { if (!strcmp((const char *) node->name, - config_element_process_attr_trackers)) { + config_element_process_attr_trackers) || + !strcmp((const char *) node->name, + config_element_trackers_legacy)) { + if (trackers_node) { + ERR("Only one instance of `%s` or `%s` is allowed in a session configuration", + config_element_process_attr_trackers, + config_element_trackers_legacy); + ret = -1; + goto end; + } trackers_node = node; break; } @@ -3093,6 +3240,13 @@ int process_domain_node(xmlNodePtr domain_node, const char *session_name) goto end; } } + if (!strcmp((const char *) node->name, + config_element_pid_tracker_legacy)) { + ret = process_legacy_pid_tracker_node(node, handle); + if (ret) { + goto end; + } + } } end: diff --git a/src/common/config/session.xsd b/src/common/config/session.xsd index 814723b2a..986fb2dda 100644 --- a/src/common/config/session.xsd +++ b/src/common/config/session.xsd @@ -394,6 +394,35 @@ by its signed 32-bit representation when converted to msec. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -401,6 +430,8 @@ by its signed 32-bit representation when converted to msec. + + diff --git a/tests/regression/tools/save-load/Makefile.am b/tests/regression/tools/save-load/Makefile.am index f833661f3..3361744e9 100644 --- a/tests/regression/tools/save-load/Makefile.am +++ b/tests/regression/tools/save-load/Makefile.am @@ -2,7 +2,8 @@ noinst_SCRIPTS = test_save test_load test_autoload EXTRA_DIST = $(noinst_SCRIPTS) load-42.lttng load-42-complex.lttng \ - load-42-trackers.lttng + load-42-trackers.lttng tracker_legacy_none.lttng \ + tracker_legacy_all.lttng tracker_legacy_selective.lttng SUBDIRS = configuration diff --git a/tests/regression/tools/save-load/test_load b/tests/regression/tools/save-load/test_load index db54a177a..4f18dec2d 100755 --- a/tests/regression/tools/save-load/test_load +++ b/tests/regression/tools/save-load/test_load @@ -16,7 +16,7 @@ EVENT_NAME="tp:tptest" DIR=$(readlink -f $TESTDIR) -NUM_TESTS=72 +NUM_TESTS=75 source $TESTDIR/utils/utils.sh @@ -101,6 +101,9 @@ function test_all_load() destroy_lttng_session_ok $SESSION_NAME destroy_lttng_session_ok "$SESSION_NAME-complex" destroy_lttng_session_ok "$SESSION_NAME-trackers" + destroy_lttng_session_ok "tracker_legacy_all" + destroy_lttng_session_ok "tracker_legacy_none" + destroy_lttng_session_ok "tracker_legacy_selective" stop_lttng_relayd } diff --git a/tests/regression/tools/save-load/tracker_legacy_all.lttng b/tests/regression/tools/save-load/tracker_legacy_all.lttng new file mode 100644 index 000000000..5552345f3 --- /dev/null +++ b/tests/regression/tools/save-load/tracker_legacy_all.lttng @@ -0,0 +1,63 @@ + + + + tracker_legacy_all + + + UST + PER_UID + + + channel0 + true + DISCARD + 524288 + 4 + 0 + 0 + MMAP + 0 + 1000000 + 0 + 0 + 0 + + + * + true + TRACEPOINT + ALL + + + + + + + + + JUL + PER_UID + + + + LOG4J + PER_UID + + + + PYTHON + PER_UID + + + + false + + + true + + /tmp/2.11/home/lttng-traces/tracker_legacy_all-20200406-221343 + + + + + diff --git a/tests/regression/tools/save-load/tracker_legacy_none.lttng b/tests/regression/tools/save-load/tracker_legacy_none.lttng new file mode 100644 index 000000000..47aeb29fb --- /dev/null +++ b/tests/regression/tools/save-load/tracker_legacy_none.lttng @@ -0,0 +1,67 @@ + + + + tracker_legacy_none + + + UST + PER_UID + + + channel0 + true + DISCARD + 524288 + 4 + 0 + 0 + MMAP + 0 + 1000000 + 0 + 0 + 0 + + + * + true + TRACEPOINT + ALL + + + + + + + + + + + + + JUL + PER_UID + + + + LOG4J + PER_UID + + + + PYTHON + PER_UID + + + + false + + + true + + /tmp/2.11/home/lttng-traces/tracker_legacy_none-20200406-221335 + + + + + diff --git a/tests/regression/tools/save-load/tracker_legacy_selective.lttng b/tests/regression/tools/save-load/tracker_legacy_selective.lttng new file mode 100644 index 000000000..11c0169aa --- /dev/null +++ b/tests/regression/tools/save-load/tracker_legacy_selective.lttng @@ -0,0 +1,74 @@ + + + + tracker_legacy_selective + + + UST + PER_UID + + + channel0 + true + DISCARD + 524288 + 4 + 0 + 0 + MMAP + 0 + 1000000 + 0 + 0 + 0 + + + * + true + TRACEPOINT + ALL + + + + + + + + + + 42 + + + 1337 + + + + + + + JUL + PER_UID + + + + LOG4J + PER_UID + + + + PYTHON + PER_UID + + + + false + + + true + + /tmp/2.11/home/lttng-traces/tracker_legacy_selective-20200406-221328 + + + + +