All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Traynor <ktraynor@redhat.com>
To: Bruce Richardson <bruce.richardson@intel.com>, dev@dpdk.org
Cc: Ciara Power <ciara.power@intel.com>,
	David Marchand <david.marchand@redhat.com>,
	Anatoly Burakov <anatoly.burakov@intel.com>
Subject: Re: [dpdk-dev] [PATCH v8 2/4] telemetry: fix socket path conflicts for in-memory mode
Date: Thu, 14 Oct 2021 10:40:07 +0100	[thread overview]
Message-ID: <ac63a92e-17ae-b902-47be-0895015dcac9@redhat.com> (raw)
In-Reply-To: <20211012163908.758767-3-bruce.richardson@intel.com>

On 12/10/2021 17:39, Bruce Richardson wrote:
> When running using in-memory mode, multiple processes can use the same
> runtime dir, leading to conflicts with the telemetry sockets in that
> directory. We can resolve this by appending a suffix to each socket
> beyond the first, with the suffix being an increasing counter value.
> Each process uses the first unused socket counter value.
> 
> Fixes: 6dd571fd07c3 ("telemetry: introduce new functionality")
> 
> Reported-by: David Marchand <david.marchand@redhat.com>
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> Acked-by: Ciara Power <ciara.power@intel.com>

Thanks Bruce, lgtm. Nice solution to keep existing name where possible 
and to give as predictable as you can names for others.

Acked-by: Kevin Traynor <ktraynor@redhat.com>

> ---
>   lib/telemetry/telemetry.c | 65 +++++++++++++++++++++++++++++----------
>   1 file changed, 49 insertions(+), 16 deletions(-)
> 
> diff --git a/lib/telemetry/telemetry.c b/lib/telemetry/telemetry.c
> index 48f4c7ba46..a7483167d4 100644
> --- a/lib/telemetry/telemetry.c
> +++ b/lib/telemetry/telemetry.c
> @@ -457,28 +457,45 @@ create_socket(char *path)
>   
>   	struct sockaddr_un sun = {.sun_family = AF_UNIX};
>   	strlcpy(sun.sun_path, path, sizeof(sun.sun_path));
> -	unlink(sun.sun_path);
> +	TMTY_LOG(DEBUG, "Attempting socket bind to path '%s'\n", path);
> +
>   	if (bind(sock, (void *) &sun, sizeof(sun)) < 0) {
>   		struct stat st;
>   
> -		TMTY_LOG(ERR, "Error binding socket: %s\n", strerror(errno));
> -		if (stat(socket_dir, &st) < 0 || !S_ISDIR(st.st_mode))
> +		TMTY_LOG(DEBUG, "Initial bind to socket '%s' failed.\n", path);
> +
> +		/* first check if we have a runtime dir */
> +		if (stat(socket_dir, &st) < 0 || !S_ISDIR(st.st_mode)) {
>   			TMTY_LOG(ERR, "Cannot access DPDK runtime directory: %s\n", socket_dir);
> -		sun.sun_path[0] = 0;
> -		goto error;
> +			close(sock);
> +			return -ENOENT;
> +		}
> +
> +		/* check if current socket is active */
> +		if (connect(sock, (void *)&sun, sizeof(sun)) == 0) {
> +			close(sock);
> +			return -EADDRINUSE;
> +		}
> +
> +		/* socket is not active, delete and attempt rebind */
> +		TMTY_LOG(DEBUG, "Attempting unlink and retrying bind\n");
> +		unlink(sun.sun_path);
> +		if (bind(sock, (void *) &sun, sizeof(sun)) < 0) {
> +			TMTY_LOG(ERR, "Error binding socket: %s\n", strerror(errno));
> +			close(sock);
> +			return -errno; /* if unlink failed, this will be -EADDRINUSE as above */
> +		}
>   	}
>   
>   	if (listen(sock, 1) < 0) {
>   		TMTY_LOG(ERR, "Error calling listen for socket: %s\n", strerror(errno));
> -		goto error;
> +		unlink(sun.sun_path);
> +		close(sock);
> +		return -errno;
>   	}
> +	TMTY_LOG(DEBUG, "Socket creation and binding ok\n");
>   
>   	return sock;
> -
> -error:
> -	close(sock);
> -	unlink_sockets();
> -	return -1;
>   }
>   
>   static void
> @@ -511,8 +528,10 @@ telemetry_legacy_init(void)
>   		return -1;
>   	}
>   	v1_socket.sock = create_socket(v1_socket.path);
> -	if (v1_socket.sock < 0)
> +	if (v1_socket.sock < 0) {
> +		v1_socket.path[0] = '\0';
>   		return -1;
> +	}
>   	rc = pthread_create(&t_old, NULL, socket_listener, &v1_socket);
>   	if (rc != 0) {
>   		TMTY_LOG(ERR, "Error with create legcay socket thread: %s\n",
> @@ -533,7 +552,9 @@ telemetry_legacy_init(void)
>   static int
>   telemetry_v2_init(void)
>   {
> +	char spath[sizeof(v2_socket.path)];
>   	pthread_t t_new;
> +	short suffix = 0;
>   	int rc;
>   
>   	v2_socket.num_clients = &v2_clients;
> @@ -544,15 +565,27 @@ telemetry_v2_init(void)
>   	rte_telemetry_register_cmd("/help", command_help,
>   			"Returns help text for a command. Parameters: string command");
>   	v2_socket.fn = client_handler;
> -	if (strlcpy(v2_socket.path, get_socket_path(socket_dir, 2),
> -			sizeof(v2_socket.path)) >= sizeof(v2_socket.path)) {
> +	if (strlcpy(spath, get_socket_path(socket_dir, 2), sizeof(spath)) >= sizeof(spath)) {
>   		TMTY_LOG(ERR, "Error with socket binding, path too long\n");
>   		return -1;
>   	}
> +	memcpy(v2_socket.path, spath, sizeof(v2_socket.path));
>   
>   	v2_socket.sock = create_socket(v2_socket.path);
> -	if (v2_socket.sock < 0)
> -		return -1;
> +	while (v2_socket.sock < 0) {
> +		/* bail out on unexpected error, or suffix wrap-around */
> +		if (v2_socket.sock != -EADDRINUSE || suffix < 0) {
> +			v2_socket.path[0] = '\0'; /* clear socket path */
> +			return -1;
> +		}
> +		/* add a suffix to the path if the basic version fails */
> +		if (snprintf(v2_socket.path, sizeof(v2_socket.path), "%s:%d",
> +				spath, ++suffix) >= (int)sizeof(v2_socket.path)) {
> +			TMTY_LOG(ERR, "Error with socket binding, path too long\n");
> +			return -1;
> +		}
> +		v2_socket.sock = create_socket(v2_socket.path);
> +	}
>   	rc = pthread_create(&t_new, NULL, socket_listener, &v2_socket);
>   	if (rc != 0) {
>   		TMTY_LOG(ERR, "Error with create socket thread: %s\n",
> 


  parent reply	other threads:[~2021-10-14  9:40 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-15 14:10 [dpdk-dev] [PATCH] telemetry: fix "in-memory" process socket conflicts Bruce Richardson
2021-09-22  8:43 ` Power, Ciara
2021-09-24 16:18 ` [dpdk-dev] [PATCH v2] " Bruce Richardson
2021-09-29  8:50   ` Power, Ciara
2021-09-29 12:28   ` Kevin Traynor
2021-09-29 13:32     ` Bruce Richardson
2021-09-29 13:51       ` Bruce Richardson
2021-09-29 14:54       ` Kevin Traynor
2021-09-29 15:24         ` Bruce Richardson
2021-09-29 15:31           ` Bruce Richardson
2021-09-29 16:01             ` Kevin Traynor
2021-09-29 13:54 ` [dpdk-dev] [PATCH v3] " Bruce Richardson
2021-10-05 11:47   ` Ferruh Yigit
2021-10-01 11:15 ` [dpdk-dev] [PATCH v4 0/5] improve telemetry support with in-memory mode Bruce Richardson
2021-10-01 11:15   ` [dpdk-dev] [PATCH v4 1/5] eal: limit telemetry to primary processes Bruce Richardson
2021-10-01 11:15   ` [dpdk-dev] [PATCH v4 2/5] telemetry: fix deletion of active sockets Bruce Richardson
2021-10-01 11:15   ` [dpdk-dev] [PATCH v4 3/5] telemetry: use unique socket paths for in-memory mode Bruce Richardson
2021-10-01 11:15   ` [dpdk-dev] [PATCH v4 4/5] usertools/dpdk-telemetry: connect to in-memory processes Bruce Richardson
2021-10-01 11:15   ` [dpdk-dev] [PATCH v4 5/5] usertools/dpdk-telemetry: provide info on available sockets Bruce Richardson
2021-10-01 16:22 ` [dpdk-dev] [PATCH v5 0/5] improve telemetry support with in-memory mode Bruce Richardson
2021-10-01 16:22   ` [dpdk-dev] [PATCH v5 1/5] eal: limit telemetry to primary processes Bruce Richardson
2021-10-01 16:22   ` [dpdk-dev] [PATCH v5 2/5] telemetry: fix deletion of active sockets Bruce Richardson
2021-10-01 16:22   ` [dpdk-dev] [PATCH v5 3/5] telemetry: use unique socket paths for in-memory mode Bruce Richardson
2021-10-01 16:22   ` [dpdk-dev] [PATCH v5 4/5] usertools/dpdk-telemetry: connect to in-memory processes Bruce Richardson
2021-10-01 16:22   ` [dpdk-dev] [PATCH v5 5/5] usertools/dpdk-telemetry: provide info on available sockets Bruce Richardson
2021-10-05 13:59 ` [dpdk-dev] [PATCH v6 0/5] improve telemetry support with in-memory mode Bruce Richardson
2021-10-05 13:59   ` [dpdk-dev] [PATCH v6 1/5] eal: limit telemetry to primary processes Bruce Richardson
2021-10-07 13:11     ` Power, Ciara
2021-10-05 13:59   ` [dpdk-dev] [PATCH v6 2/5] telemetry: fix deletion of active sockets Bruce Richardson
2021-10-05 15:18     ` Conor Walsh
2021-10-05 13:59   ` [dpdk-dev] [PATCH v6 3/5] telemetry: use unique socket paths for in-memory mode Bruce Richardson
2021-10-05 14:41     ` Kevin Traynor
2021-10-05 14:52       ` Bruce Richardson
2021-10-05 15:14         ` Kevin Traynor
2021-10-07 13:39           ` Power, Ciara
2021-10-05 15:19         ` Conor Walsh
2021-10-05 13:59   ` [dpdk-dev] [PATCH v6 4/5] usertools/dpdk-telemetry: connect to in-memory processes Bruce Richardson
2021-10-05 15:19     ` Conor Walsh
2021-10-05 13:59   ` [dpdk-dev] [PATCH v6 5/5] usertools/dpdk-telemetry: provide info on available sockets Bruce Richardson
2021-10-05 15:19     ` Conor Walsh
2021-10-08 17:18 ` [dpdk-dev] [PATCH v7 0/5] improve telemetry support with in-memory mode Bruce Richardson
2021-10-08 17:18   ` [dpdk-dev] [PATCH v7 1/5] eal: limit telemetry to primary processes Bruce Richardson
2021-10-08 17:18   ` [dpdk-dev] [PATCH v7 2/5] telemetry: fix deletion of active sockets Bruce Richardson
2021-10-08 17:18   ` [dpdk-dev] [PATCH v7 3/5] telemetry: use unique socket paths for in-memory mode Bruce Richardson
2021-10-12 15:37     ` Power, Ciara
2021-10-12 15:40       ` Bruce Richardson
2021-10-12 15:47         ` Power, Ciara
2021-10-08 17:18   ` [dpdk-dev] [PATCH v7 4/5] usertools/dpdk-telemetry: connect to separate instances Bruce Richardson
2021-10-12 15:37     ` Power, Ciara
2021-10-08 17:18   ` [dpdk-dev] [PATCH v7 5/5] usertools/dpdk-telemetry: provide info on available sockets Bruce Richardson
2021-10-12 15:37     ` Power, Ciara
2021-10-12 16:39 ` [dpdk-dev] [PATCH v8 0/4] improve telemetry support with in-memory mode Bruce Richardson
2021-10-12 16:39   ` [dpdk-dev] [PATCH v8 1/4] eal: limit telemetry to primary processes Bruce Richardson
2021-10-13 13:15     ` Walsh, Conor
2021-10-12 16:39   ` [dpdk-dev] [PATCH v8 2/4] telemetry: fix socket path conflicts for in-memory mode Bruce Richardson
2021-10-13 13:15     ` Walsh, Conor
2021-10-14  9:40     ` Kevin Traynor [this message]
2021-10-12 16:39   ` [dpdk-dev] [PATCH v8 3/4] usertools/dpdk-telemetry: connect to separate instances Bruce Richardson
2021-10-13 13:15     ` Walsh, Conor
2021-10-12 16:39   ` [dpdk-dev] [PATCH v8 4/4] usertools/dpdk-telemetry: provide info on available sockets Bruce Richardson
2021-10-13 13:15     ` Walsh, Conor
2021-10-14 10:49 ` [dpdk-dev] [PATCH v9 0/4] improve telemetry support with in-memory mode Bruce Richardson
2021-10-14 10:49   ` [dpdk-dev] [PATCH v9 1/4] eal: limit telemetry to primary processes Bruce Richardson
2021-10-14 10:49   ` [dpdk-dev] [PATCH v9 2/4] telemetry: fix socket path conflicts for in-memory mode Bruce Richardson
2021-10-14 10:49   ` [dpdk-dev] [PATCH v9 3/4] usertools/dpdk-telemetry: connect to separate instances Bruce Richardson
2021-10-14 10:49   ` [dpdk-dev] [PATCH v9 4/4] usertools/dpdk-telemetry: provide info on available sockets Bruce Richardson
2021-10-14 19:00   ` [dpdk-dev] [PATCH v9 0/4] improve telemetry support with in-memory mode David Marchand
2021-10-15  8:18     ` Bruce Richardson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ac63a92e-17ae-b902-47be-0895015dcac9@redhat.com \
    --to=ktraynor@redhat.com \
    --cc=anatoly.burakov@intel.com \
    --cc=bruce.richardson@intel.com \
    --cc=ciara.power@intel.com \
    --cc=david.marchand@redhat.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.