telemetry: fix mapping of statistics

If we have two NIC ports which have a different set of NIC stats we can
end up having two different stats registered with xstats with the same
name. [Since the stats are updated in bulk as a contiguous set, the
second driver re-using the registration of the first is not possible.]

This causes issues with the invalid stat for one driver being found due to
a lookup by name which is unnecessary. Instead of getting stat names
involved do the lookup by ID instead.

Fixes: 1b756087db ("telemetry: add parser for client socket messages")
Cc: stable@dpdk.org

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Kevin Laatz <kevin.laatz@intel.com>
This commit is contained in:
Bruce Richardson 2019-03-28 15:30:45 +00:00 committed by Thomas Monjalon
parent f73477e276
commit c12cefa379

View File

@ -256,7 +256,7 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
int action, json_t *data)
{
int ret, num_metrics, i, p;
struct rte_metric_name *names;
struct rte_metric_value *values;
uint64_t num_port_ids = 0;
uint32_t port_ids[RTE_MAX_ETHPORTS];
@ -281,7 +281,7 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
return -1;
}
num_metrics = rte_metrics_get_names(NULL, 0);
num_metrics = rte_metrics_get_values(0, NULL, 0);
if (num_metrics < 0) {
TELEMETRY_LOG_ERR("Cannot get metrics count");
@ -300,8 +300,8 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
return -1;
}
names = malloc(sizeof(struct rte_metric_name) * num_metrics);
if (names == NULL) {
values = malloc(sizeof(struct rte_metric_value) * num_metrics);
if (values == NULL) {
TELEMETRY_LOG_ERR("Cannot allocate memory");
ret = rte_telemetry_send_error_response(telemetry,
-ENOMEM);
@ -310,7 +310,6 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
return -1;
}
const char *stat_names[num_metrics];
uint32_t stat_ids[num_metrics];
RTE_ETH_FOREACH_DEV(p) {
@ -328,16 +327,13 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
goto fail;
}
ret = rte_metrics_get_names(names, num_metrics);
for (i = 0; i < num_metrics; i++)
stat_names[i] = names[i].name;
ret = rte_telemetry_stat_names_to_ids(telemetry, stat_names, stat_ids,
num_metrics);
ret = rte_metrics_get_values(port_ids[0], values, num_metrics);
if (ret < 0) {
TELEMETRY_LOG_ERR("Could not convert stat names to IDs");
TELEMETRY_LOG_ERR("Could not get stat values");
goto fail;
}
for (i = 0; i < num_metrics; i++)
stat_ids[i] = values[i].key;
ret = rte_telemetry_send_ports_stats_values(stat_ids, num_metrics,
port_ids, num_port_ids, telemetry);
@ -349,7 +345,7 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
return 0;
fail:
free(names);
free(values);
return -1;
}