Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-15-SP2:Update
collectd
dpdk_telemetry-plugin-remove-while-loop-from-in...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File dpdk_telemetry-plugin-remove-while-loop-from-init-and-read-callbacks.patch of Package collectd
From: Reshma Pattan <reshma.pattan@intel.com> Subject: dpdk_telemetry plugin: remove while loop from init and read callbacks References: jsc#SLE-23472 Patch-Mainline: collectd-5.11.0 Git-commit: f6c603a41badc54b929f6e92ce345348232d4cf4 Git-repo: git://github.com/collectd/collectd.git.git Remove socket reconnect logic from init callbacks. Read callbacks will try to connect to the socket if not connected. Signed-off-by: Reshma Pattan <reshma.pattan@intel.com> Signed-off-by: <trenn@suse.com> diff --git a/src/dpdk_telemetry.c b/src/dpdk_telemetry.c index 9ae9fd32..94bba602 100755 --- a/src/dpdk_telemetry.c +++ b/src/dpdk_telemetry.c @@ -63,7 +63,6 @@ typedef struct client_info client_info_t; static client_info_t client; static char g_client_path[BUF_SIZE]; static char g_dpdk_path[BUF_SIZE]; -cdtime_t dpdk_tel_interval = 0; static int dpdk_telemetry_config(oconfig_item_t *ci) { int ret, i; @@ -91,7 +90,6 @@ static int dpdk_telemetry_config(oconfig_item_t *ci) { } } - dpdk_tel_interval = plugin_get_interval(); return 0; } @@ -261,14 +259,13 @@ static int dpdk_telemetry_socket_init(void) { if (client.s_send < 0) { ERROR(PLUGIN_NAME ": Failed to open socket errno(%d), error(%s)", errno, strerror(errno)); - dpdk_telemetry_cleanup(); return -1; } client.s_recv = socket(AF_UNIX, SOCK_SEQPACKET, 0); if (client.s_recv < 0) { ERROR(PLUGIN_NAME ": Failed to open message socket errno(%d), error(%s)", errno, strerror(errno)); - dpdk_telemetry_cleanup(); + close(client.s_send); return -1; } client.addr.sun_family = AF_UNIX; @@ -278,7 +275,8 @@ static int dpdk_telemetry_socket_init(void) { sizeof(client.addr)) < 0) { ERROR(PLUGIN_NAME ": Failed to connect errno(%d), error(%s)", errno, strerror(errno)); - dpdk_telemetry_cleanup(); + close(client.s_send); + close(client.s_recv); return -1; } client.addrs.sun_family = AF_UNIX; @@ -289,13 +287,15 @@ static int dpdk_telemetry_socket_init(void) { sizeof(client.addrs)) < 0) { ERROR(PLUGIN_NAME ": Failed to bind errno(%d), error(%s)", errno, strerror(errno)); - dpdk_telemetry_cleanup(); + close(client.s_send); + close(client.s_recv); return -1; } if (listen(client.s_recv, 1) < 0) { ERROR(PLUGIN_NAME ": Listen failed errno(%d), error(%s)", errno, strerror(errno)); - dpdk_telemetry_cleanup(); + close(client.s_send); + close(client.s_recv); return -1; } snprintf(message, sizeof(message), @@ -305,14 +305,16 @@ static int dpdk_telemetry_socket_init(void) { if (send(client.s_send, message, strlen(message), 0) < 0) { ERROR(PLUGIN_NAME ": Could not send register message errno(%d), error(%s)", errno, strerror(errno)); - dpdk_telemetry_cleanup(); + close(client.s_send); + close(client.s_recv); return -1; } client.fd = accept(client.s_recv, NULL, NULL); if (client.fd < 0) { ERROR(PLUGIN_NAME ": Failed to accept errno(%d), error(%s)", errno, strerror(errno)); - dpdk_telemetry_cleanup(); + close(client.s_send); + close(client.s_recv); return -1; } return 0; @@ -341,61 +343,35 @@ static int dpdk_telemetry_read(user_data_t *ud) { INFO(PLUGIN_NAME ": %s:%d", __FUNCTION__, __LINE__); char buffer[BUF_SIZE]; int bytes = 0, ret; - cdtime_t prev = 0; char *json_string[MAX_COMMANDS] = {"{\"action\":0,\"command\":" "\"ports_all_stat_values\",\"data\":null}", "{\"action\":0,\"command\":" "\"global_stat_values\",\"data\":null}"}; size_t size = sizeof(json_string) / sizeof(json_string[0]); - prev = cdtime(); for (int i = 0; i < size; i++) { - /* Exit the read function after passing the half of the - * plugin interval to avoid blocking of other collectd plugins. - */ - if ((cdtime() - prev) > (dpdk_tel_interval / 2)) { - ERROR(PLUGIN_NAME ":Cannot read after the interval %d", __LINE__); - return -1; - } - while (1) { - /* Exit the read function after passing the half of the plugin - * interval in order to avoid blocking of other collectd - * plugins. - * - * For send() and parse_json() failures, try reconnecting - * to the socket, as we don't know what exactly happened on - * server side. - */ - if ((cdtime() - prev) > (dpdk_tel_interval / 2)) { - ERROR(PLUGIN_NAME ":Cannot read after interval %d", __LINE__); - return -1; + if (send(client.fd, json_string[i], strlen(json_string[i]), 0) < 0) { + ERROR(PLUGIN_NAME + ": Could not send request for stats errno(%d), error(%s)", + errno, strerror(errno)); + if (errno == EBADF || errno == ECONNRESET || errno == ENOTCONN || + errno == EPIPE) { + dpdk_telemetry_cleanup(); + dpdk_telemetry_socket_init(); + send(client.fd, json_string[i], strlen(json_string[i]), 0); } - if (send(client.fd, json_string[i], strlen(json_string[i]), 0) < 0) { - ERROR(PLUGIN_NAME ": Could not send stats errno(%d), error(%s)", errno, - strerror(errno)); - if (errno == EBADF || errno == ECONNRESET || errno == ENOTCONN || - errno == EPIPE) { - dpdk_telemetry_cleanup(); - if (dpdk_telemetry_socket_init() < 0) - continue; - } + } else { + bytes = recv(client.fd, buffer, sizeof(buffer) - 1, 0); + if (bytes < 0) { + ERROR(PLUGIN_NAME ": Could not receive stats errno(%d), error(%s)", + errno, strerror(errno)); + dpdk_telemetry_cleanup(); + dpdk_telemetry_socket_init(); } else { - bytes = recv(client.fd, buffer, sizeof(buffer) - 1, 0); - if (bytes < 0) { - ERROR(PLUGIN_NAME ": Could not receive stats errno(%d), error(%s)", - errno, strerror(errno)); - continue; - } else { - buffer[bytes] = '\0'; - ret = parse_json(buffer); - if (ret < 0) { - ERROR(PLUGIN_NAME ": Parsing failed"); - dpdk_telemetry_cleanup(); - dpdk_telemetry_socket_init(); - continue; - } - break; - } + buffer[bytes] = '\0'; + ret = parse_json(buffer); + if (ret < 0) + ERROR(PLUGIN_NAME ": Parsing failed"); } } } @@ -403,27 +379,17 @@ static int dpdk_telemetry_read(user_data_t *ud) { } static int dpdk_telemetry_init(void) { - cdtime_t prev = 0; - - prev = cdtime(); - while (1) { - /* If server socket is already not running, try connecting - * for period of 6 seconds to provide resiliency. - * If server doesn't shows up even after 6seconds, mark the - * initialization as failure. - */ - if ((cdtime() - prev) > dpdk_tel_interval) { - ERROR(PLUGIN_NAME ":Cannot retry initialization after the interval"); - return -1; - } - if (dpdk_telemetry_socket_init() < 0) { - ERROR(PLUGIN_NAME ": Socket initialization failed"); - continue; - } - break; - } - plugin_register_complex_read(NULL, PLUGIN_NAME, dpdk_telemetry_read, - dpdk_tel_interval, NULL); + + INFO(PLUGIN_NAME ": %s:%d", __FUNCTION__, __LINE__); + + client.s_send = -1; + client.s_recv = -1; + client.fd = -1; + if (dpdk_telemetry_socket_init() < 0) + ERROR(PLUGIN_NAME ": Socket initialization failed."); + + plugin_register_complex_read(NULL, PLUGIN_NAME, dpdk_telemetry_read, 0, NULL); + return 0; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor