Commit 4e0cfe55 authored by Jacek Kalwas's avatar Jacek Kalwas Committed by Tomasz Zawadzki
Browse files

sock: add connect timeout opt



This allows to control connect timeout instead relying on default value.

Change-Id: I094da7cf0bc47d2a9e0fb1b7c1b254d2ee6c2e3c
Signed-off-by: default avatarJacek Kalwas <jacek.kalwas@nutanix.com>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/25795


Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz@tzawadzki.com>
Community-CI: Mellanox Build Bot
parent 2dff9736
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -247,6 +247,14 @@ struct spdk_sock_opts {
	 * Source port.  If zero, a random ephemeral port will be used.  Only valid for connect().
	 */
	uint16_t src_port;

	/* Hole at bytes 50-51. */
	uint8_t reserved50[2];

	/**
	 * Time in msec to wait until connection is done (0 = no timeout).
	 */
	uint32_t connect_timeout;
};
SPDK_STATIC_ASSERT(sizeof(struct spdk_sock_opts) == 56, "Incorrect size");

+0 −2
Original line number Diff line number Diff line
@@ -31,8 +31,6 @@ extern "C" {
#define MIN_SO_SNDBUF_SIZE (4 * 1024)
#define IOV_BATCH_SIZE 64

#define SPDK_SOCK_DEFAULT_CONNECT_TIMEOUT -1

struct spdk_sock {
	struct spdk_net_impl		*net_impl;
	struct spdk_sock_opts		opts;
+2 −2
Original line number Diff line number Diff line
@@ -7,8 +7,8 @@
SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
include $(SPDK_ROOT_DIR)/mk/spdk.common.mk

SO_VER := 10
SO_MINOR := 1
SO_VER := 11
SO_MINOR := 0

C_SRCS = sock.c sock_rpc.c

+17 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#define SPDK_SOCK_DEFAULT_PRIORITY 0
#define SPDK_SOCK_DEFAULT_ZCOPY true
#define SPDK_SOCK_DEFAULT_ACK_TIMEOUT 0
#define SPDK_SOCK_DEFAULT_CONNECT_TIMEOUT 0

#define PORTNUMLEN 32
#define MAX_TMPBUF 1024
@@ -294,6 +295,10 @@ spdk_sock_get_default_opts(struct spdk_sock_opts *opts)
	if (SPDK_SOCK_OPTS_FIELD_OK(opts, src_port)) {
		opts->src_port = 0;
	}

	if (SPDK_SOCK_OPTS_FIELD_OK(opts, connect_timeout)) {
		opts->connect_timeout = SPDK_SOCK_DEFAULT_CONNECT_TIMEOUT;
	}
}

/*
@@ -338,6 +343,10 @@ sock_init_opts(struct spdk_sock_opts *opts, struct spdk_sock_opts *opts_user)
	if (SPDK_SOCK_OPTS_FIELD_OK(opts, src_port)) {
		opts->src_port = opts_user->src_port;
	}

	if (SPDK_SOCK_OPTS_FIELD_OK(opts, connect_timeout)) {
		opts->connect_timeout = opts_user->connect_timeout;
	}
}

struct addrinfo *
@@ -504,14 +513,15 @@ spdk_sock_posix_fd_connect(int fd, struct addrinfo *res, struct spdk_sock_opts *
		return 1;
	}

	rc = poll(&pfd, 1, SPDK_SOCK_DEFAULT_CONNECT_TIMEOUT);
	assert(opts->connect_timeout <= INT_MAX);
	rc = poll(&pfd, 1, opts->connect_timeout ? (int)opts->connect_timeout : -1);
	if (rc < 0) {
		SPDK_ERRLOG("poll() failed, errno = %d\n", errno);
		return -1;
	}

	if (rc == 0) {
		SPDK_ERRLOG("poll() timeout after %d ms\n", SPDK_SOCK_DEFAULT_CONNECT_TIMEOUT);
		SPDK_ERRLOG("poll() timeout after %d ms\n", opts->connect_timeout);
		return -1;
	}

@@ -574,6 +584,11 @@ spdk_sock_connect_ext(const char *ip, int port, const char *_impl_name, struct s

		SPDK_DEBUGLOG(sock, "Creating a client socket using impl %s\n", impl->name);
		sock_init_opts(&opts_local, opts);
		if (opts_local.connect_timeout > INT_MAX) {
			SPDK_ERRLOG("connect_timeout opt cannot exceed INT_MAX\n");
			return NULL;
		}

		sock = impl->connect(ip, port, &opts_local);
		if (sock != NULL) {
			/* Copy the contents, both the two structures are the same ABI version */