There is no need to keep the dump_virtio code in a separate library. Revert libserialclient changes and move the code to libmetrics. --- vm-dump-metrics tries to access the metrics disk without a check of the transport methods because the access is located in the libmetrics constructor this can't be changed in vm-dump-metrics. libmetrics.c: void __attribute__ ((constructor)) libmetrics_init(void) ... if (read_mdisk(mdisk) != 0) { libmsg("%s(): Unable to read metrics disk\n", __func__); Whith virtio transport we can't expect a metrics disk and should avoid the error. One option is to remove read_mdisk() from the constructor, initialize mdisk->sum and rely on the read_mdisk() call in read_mdisk_sum(). This should be discussed and fixed in another patch. libmetrics/Makefile.am | 18 +--- libmetrics/libmetrics.c | 131 ++++++++++++++++++++++++++ libmetrics/libmetrics.h | 4 - libmetrics/libserialclient.c | 172 ----------------------------------- libmetrics/libserialclient.h | 30 ------ 5 files changed, 133 insertions(+), 222 deletions(-) delete mode 100644 libmetrics/libserialclient.c delete mode 100644 libmetrics/libserialclient.h diff --git a/libmetrics/Makefile.am b/libmetrics/Makefile.am index 468f08f..254b2c8 100644 --- a/libmetrics/Makefile.am +++ b/libmetrics/Makefile.am @@ -6,7 +6,7 @@ if WITH_XENSTORE AM_CFLAGS += -DWITH_XENSTORE endif -lib_LTLIBRARIES=libmetrics.la libserialclient.la +lib_LTLIBRARIES=libmetrics.la libmetricsincdir=$(includedir)/vhostmd libmetricsinc_HEADERS = libmetrics.h @@ -15,21 +15,7 @@ libmetrics_la_SOURCES = \ libmetrics.c \ vm_metrics.c \ host_metrics.c \ - libserialclient.c \ libmetrics.h libmetrics_la_DEPENDENCIES = \ - libmetrics.h \ - libserialclient.h - - -libserialclientincdir= -libserialclientinc_HEADERS = libserialclient.h - -libserialclient_la_SOURCES = \ - libserialclient.c \ - libserialclient.h - -libserialclient_la_DEPENDENCIES = \ - libserialclient.h - + libmetrics.h diff --git a/libmetrics/libmetrics.c b/libmetrics/libmetrics.c index bc3ba1d..0a5e3ee 100644 --- a/libmetrics/libmetrics.c +++ b/libmetrics/libmetrics.c @@ -775,3 +775,134 @@ out: } #endif +/* + * dump metrics from virtio serial port to buffer + */ +static char *get_virtio_metrics(void) +{ + const char request[] = "GET /metrics/XML\n\n", end_token[] = "\n\n"; + const char dev[] = "/dev/virtio-ports/org.github.vhostmd.1"; + + char *response = NULL; + int fd = -1; + size_t pos; + size_t buf_size = (1 << 16); + const size_t req_len = (size_t) strlen(request); + const time_t start_time = time(NULL); + + response = calloc(1UL, buf_size); + if (response == NULL) + goto error; + + fd = open(dev, O_RDWR | O_NONBLOCK); + + if (fd < 0) { + libmsg("Error, unable to export metrics: open(%s) %s\n", + dev, strerror(errno)); + goto error; + } + + pos = 0; + while (pos < req_len) { + ssize_t len = write(fd, &request[pos], req_len - pos); + if (len > 0) + pos += (size_t) len; + else { + if (errno == EAGAIN) + usleep(10000); + else + goto error; + } + } + + pos = 0; + do { + ssize_t len = read(fd, &response[pos], buf_size - pos - 1); + if (len > 0) { + pos += (size_t) len; + response[pos] = 0; + + if ((pos + 1) >= buf_size) { + buf_size = buf_size << 1; /* increase response buffer */ + if (buf_size > (1 << 24)) /* max 16MB */ + goto error; + + response = realloc(response, buf_size); + if (response == NULL) + goto error; + + memset(&response[pos], 0, buf_size - pos); + } + } else { + if (errno == EAGAIN) { + usleep(10000); + if (time(NULL) > (start_time + 30)) { + libmsg("Error, unable to read metrics" + " - timeout after 30s\n"); + goto error; + } + } else + goto error; + } + } while ((pos < (size_t) strlen(end_token) || + strcmp(end_token, &response[pos - (size_t) strlen(end_token)]) != 0) && + pos < buf_size); + + if (fd >= 0) + close(fd); + + return response; + + error: + if (fd >= 0) + close(fd); + if (response) + free(response); + + return NULL; +} + +/* + * dump metrics from virtio serial port to xml formatted file + */ +int dump_virtio_metrics(const char *dest_file) +{ + FILE *fp = stdout; + char *response = NULL; + size_t len; + + response = get_virtio_metrics(); + if (response == NULL) + goto error; + + len = strlen(response); + + if (dest_file) { + fp = fopen(dest_file, "w"); + if (fp == NULL) { + libmsg("Error, unable to dump metrics: fopen(%s) %s\n", + dest_file, strerror(errno)); + goto error; + } + } + + if (fwrite(response, 1UL, len, fp) != len) { + libmsg("Error, unable to export metrics to file:%s %s\n", + dest_file ? dest_file : "stdout", strerror(errno)); + goto error; + } + + if (response) + free(response); + + return 0; + + error: + if (dest_file && fp) + fclose(fp); + + if (response) + free(response); + + return -1; +} diff --git a/libmetrics/libmetrics.h b/libmetrics/libmetrics.h index 1908de8..c4873ff 100644 --- a/libmetrics/libmetrics.h +++ b/libmetrics/libmetrics.h @@ -102,8 +102,4 @@ int dump_xenstore_metrics(const char *dest_file); /* dump metrics from virtio serial port to xml formatted file */ int dump_virtio_metrics(const char *dest_file); - -/* dump metrics from virtio serial port to buffer */ -const char *get_virtio_metrics(const char *dev_name); - #endif diff --git a/libmetrics/libserialclient.c b/libmetrics/libserialclient.c deleted file mode 100644 index d3a4af5..0000000 --- a/libmetrics/libserialclient.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (C) 2018 SAP SE - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Author: Michael Trapp <michael.trapp@xxxxxxx> - */ - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <string.h> -#include <fcntl.h> -#include <unistd.h> -#include <errno.h> - -#include "libserialclient.h" - - -/* - * dump metrics from virtio serial port to xml formatted file - */ -int dump_virtio_metrics(const char *dest_file) -{ - FILE *fp = stdout; - char *response; - size_t len; - - response = get_virtio_metrics(NULL); - if (response == NULL) - goto error; - - len = strlen(response); - - if (dest_file) { - fp = fopen(dest_file, "w"); - if (fp == NULL) { - fprintf(stderr, - "LIB_SERIALCLIENT: Error, unable to dump metrics: fopen(%s) %s\n", - dest_file, strerror(errno)); - goto error; - } - } - - if (fwrite(response, 1UL, len, fp) != len) { - fprintf(stderr, - "LIB_SERIALCLIENT: Error, unable to export metrics to file:%s - error:%s\n", - dest_file ? dest_file : "STDOUT", strerror(errno)); - goto error; - } - - if (response) - free(response); - - return 0; - - error: - if (dest_file && fp) - fclose(fp); - - if (response) - free(response); - - return -1; -} - -/* - * dump metrics from virtio serial port to buffer - */ -char *get_virtio_metrics(const char *dev_name) -{ - const char request[] = "GET /metrics/XML\n\n", end_token[] = "\n\n"; - const char *dev; - char *response = NULL; - int fd = -1; - size_t pos; - size_t buf_size = (1 << 16); - const size_t req_len = (size_t) strlen(request); - const time_t start_time = time(NULL); - - if (dev_name) - dev = dev_name; - else - dev = "/dev/virtio-ports/org.github.vhostmd.1"; - - response = calloc(1UL, buf_size); - if (response == NULL) - goto error; - - fd = open(dev, O_RDWR | O_NONBLOCK); - - if (fd < 0) { - fprintf(stderr, - "LIB_SERIALCLIENT: Error, unable to dump metrics: open(%s) %s\n", - dev, strerror(errno)); - goto error; - } - - pos = 0; - while (pos < req_len) { - ssize_t len = write(fd, &request[pos], req_len - pos); - if (len > 0) - pos += (size_t) len; - else { - if (errno == EAGAIN) - usleep(10000); - else - goto error; - } - } - - pos = 0; - do { - ssize_t len = read(fd, &response[pos], buf_size - pos - 1); - if (len > 0) { - pos += (size_t) len; - response[pos] = 0; - - if ((pos + 1) >= buf_size) { - buf_size = buf_size << 1; /* increase response buffer */ - if (buf_size > (1 << 24)) /* max 16MB */ - goto error; - - response = realloc(response, buf_size); - if (response == NULL) - goto error; - - memset(&response[pos], 0, buf_size - pos); - } - } else { - if (errno == EAGAIN) { - usleep(10000); - if (time(NULL) > (start_time + 30)) { - fprintf(stderr, - "LIB_SERIALCLIENT: Error, unable to read metrics" - " - timeout after 30s\n"); - goto error; - } - } else - goto error; - } - } while ((pos < (size_t) strlen(end_token) || - strcmp(end_token, &response[pos - (size_t) strlen(end_token)]) != 0) && - pos < buf_size); - - if (fd >= 0) - close(fd); - - return response; - - error: - if (fd >= 0) - close(fd); - if (response) - free(response); - - return NULL; -} diff --git a/libmetrics/libserialclient.h b/libmetrics/libserialclient.h deleted file mode 100644 index 887c6a5..0000000 --- a/libmetrics/libserialclient.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2018 SAP SE - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Author: Michael Trapp <michael.trapp@xxxxxxx> - */ - -#ifndef __LIBSERIALCLIENT_H__ -#define __LIBSERIALCLIENT_H__ - -/* dump metrics from virtio serial port to xml formatted file */ -int dump_virtio_metrics(const char *dest_file); - -/* dump metrics from virtio serial port to buffer */ -char *get_virtio_metrics(const char *dev_name); - -#endif -- 2.17.2 (Apple Git-113) _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list