public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [PATCH] netstress: set port dynamically on the server-side
@ 2018-02-16 10:30 Alexey Kodanev
  2018-02-27  7:09 ` Petr Vorel
  0 siblings, 1 reply; 3+ messages in thread
From: Alexey Kodanev @ 2018-02-16 10:30 UTC (permalink / raw)
  To: ltp

This simplifies tst_netload setup because previously the script had to:
  * Find an available port on the remote machine
  * Start the server with this port on a remote machine. Moreover, the port
    might not be available at the time it is started.
  * Wait for the server to bind and be in the listen state

With this patch, tst_netload has to:
  * Start the server. When the server completes its setup (after bind())
    it goes to background and tst_netload goes to the next step.
  * read a file with the server port

Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>
---
 testcases/lib/test_net.sh               |   38 +++++---------------------
 testcases/network/netstress/netstress.c |   44 ++++++++++++++++++++++++++++--
 2 files changed, 49 insertions(+), 33 deletions(-)

diff --git a/testcases/lib/test_net.sh b/testcases/lib/test_net.sh
index 1e001f7..95e13ee 100644
--- a/testcases/lib/test_net.sh
+++ b/testcases/lib/test_net.sh
@@ -392,7 +392,7 @@ tst_wait_ipv6_dad()
 
 tst_dump_rhost_cmd()
 {
-	tst_rhost_run -c "cat $TST_TMPDIR/bg.cmd"
+	tst_rhost_run -c "cat $TST_TMPDIR/netstress.log"
 }
 
 # Run network load test, see 'netstress -h' for option description
@@ -447,39 +447,17 @@ tst_netload()
 	local expect_ret=0
 	[ "$expect_res" != "pass" ] && expect_ret=1
 
-	local ptype="stream"
-	[ "$type" = "udp" ] && ptype="dgram"
-
-	local port=$(tst_rhost_run -c "tst_get_unused_port ipv6 $ptype")
-	[ $? -ne 0 ] && tst_brkm TBROK "failed to get unused port"
-
 	tst_rhost_run -c "pkill -9 netstress\$"
-
-	c_opts="${cs_opts}${c_opts}-a $c_num -r $c_requests -d $rfile -g $port"
-	s_opts="${cs_opts}${s_opts}-R $s_replies -g $port"
-
+	s_opts="${cs_opts}${s_opts}-R $s_replies -B $TST_TMPDIR"
 	tst_resm TINFO "run server 'netstress $s_opts'"
-	tst_rhost_run -s -B -c "netstress $s_opts"
-
-	tst_resm TINFO "check that server port in 'LISTEN' state"
-	local sec_waited=
-
-	local sock_cmd=
-	if [ "$type" = "sctp" ]; then
-		sock_cmd="netstat -naS | grep $port | grep -q LISTEN"
-	else
-		sock_cmd="ss -ln$(echo $type | head -c1) | grep -q $port"
+	tst_rhost_run -c "netstress $s_opts" > tst_netload.log 2>&1
+	if [ $? -ne 0 ]; then
+		cat tst_netload.log
+		tst_brkm TFAIL "server failed"
 	fi
 
-	for sec_waited in $(seq 1 1200); do
-		tst_rhost_run -c "$sock_cmd" && break
-		if [ $sec_waited -eq 1200 ]; then
-			tst_dump_rhost_cmd
-			tst_rhost_run -c "ss -dutnp | grep $port"
-			tst_brkm TFAIL "server not in LISTEN state"
-		fi
-		tst_sleep 100ms
-	done
+	local port=$(tst_rhost_run -s -c "cat $TST_TMPDIR/netstress_port")
+	c_opts="${cs_opts}${c_opts}-a $c_num -r $c_requests -d $rfile -g $port"
 
 	tst_resm TINFO "run client 'netstress -l $c_opts'"
 	netstress -l $c_opts > tst_netload.log 2>&1 || ret=1
diff --git a/testcases/network/netstress/netstress.c b/testcases/network/netstress/netstress.c
index 64fdc91..0a73321 100644
--- a/testcases/network/netstress/netstress.c
+++ b/testcases/network/netstress/netstress.c
@@ -83,9 +83,10 @@ static int max_rand_msg_len;
 static int server_max_requests	= 3;
 static int client_max_requests	= 10;
 static int clients_num;
-static char *tcp_port		= "61000";
+static char *tcp_port;
 static char *server_addr	= "localhost";
 static char *source_addr;
+static char *server_bg;
 static int busy_poll		= -1;
 static int max_etime_cnt = 12; /* ~30 sec max timeout if no connection */
 
@@ -112,6 +113,8 @@ static int wait_timeout = 60000;
 
 /* in the end test will save time result in this file */
 static char *rpath = "tfo_result";
+static char *port_path = "netstress_port";
+static char *log_path = "netstress.log";
 
 static char *narg, *Narg, *qarg, *rarg, *Rarg, *aarg, *Targ, *barg, *targ,
 	    *Aarg;
@@ -644,6 +647,9 @@ static void server_init(void)
 	hints.ai_socktype = sock_type;
 	hints.ai_flags = AI_PASSIVE;
 
+	if (!source_addr && !tcp_port)
+		tcp_port = "0";
+
 	if (source_addr && !strchr(source_addr, ':'))
 		SAFE_ASPRINTF(&src_addr, "::ffff:%s", source_addr);
 	setup_addrinfo(src_addr ? src_addr : source_addr, tcp_port,
@@ -659,6 +665,14 @@ static void server_init(void)
 
 	freeaddrinfo(local_addrinfo);
 
+	int port = TST_GETSOCKPORT(sfd);
+
+	tst_res(TINFO, "bind to port %d", port);
+	if (server_bg) {
+		SAFE_CHDIR(server_bg);
+		SAFE_FILE_PRINTF(port_path, "%d", port);
+	}
+
 	if (sock_type == SOCK_DGRAM)
 		return;
 
@@ -674,8 +688,7 @@ static void server_init(void)
 
 	SAFE_LISTEN(sfd, max_queue_len);
 
-	tst_res(TINFO, "Listen on the socket '%d', port '%s'", sfd, tcp_port);
-
+	tst_res(TINFO, "Listen on the socket '%d'", sfd);
 }
 
 static void server_cleanup(void)
@@ -683,8 +696,28 @@ static void server_cleanup(void)
 	SAFE_CLOSE(sfd);
 }
 
+static void move_to_background(void)
+{
+	if (SAFE_FORK())
+		exit(0);
+
+	SAFE_SETSID();
+
+	close(0);
+	SAFE_OPEN("/dev/null", O_RDONLY);
+
+	close(1);
+	close(2);
+	int fd = SAFE_OPEN(log_path, O_CREAT | O_TRUNC | O_RDONLY, 00444);
+
+	SAFE_DUP(fd);
+}
+
 static void server_run_udp(void)
 {
+	if (server_bg)
+		move_to_background();
+
 	pthread_t p_id = server_thread_add(sfd);
 
 	SAFE_PTHREAD_JOIN(p_id, NULL);
@@ -692,6 +725,9 @@ static void server_run_udp(void)
 
 static void server_run(void)
 {
+	if (server_bg)
+		move_to_background();
+
 	/* IPv4 source address will be mapped to IPv6 address */
 	struct sockaddr_in6 addr6;
 	socklen_t addr_size = sizeof(addr6);
@@ -946,11 +982,13 @@ static struct tst_option options[] = {
 
 	{"R:", &Rarg, "Server:\n-R x     x requests after which conn.closed"},
 	{"q:", &qarg, "-q x     x - TFO queue"},
+	{"B:", &server_bg, "-B x     run in background, x - process directory"},
 	{NULL, NULL, NULL}
 };
 
 static struct tst_test test = {
 	.test_all = do_test,
+	.forks_child = 1,
 	.setup = setup,
 	.cleanup = cleanup,
 	.options = options
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [LTP] [PATCH] netstress: set port dynamically on the server-side
  2018-02-16 10:30 [LTP] [PATCH] netstress: set port dynamically on the server-side Alexey Kodanev
@ 2018-02-27  7:09 ` Petr Vorel
  2018-03-01 15:28   ` Alexey Kodanev
  0 siblings, 1 reply; 3+ messages in thread
From: Petr Vorel @ 2018-02-27  7:09 UTC (permalink / raw)
  To: ltp

> This simplifies tst_netload setup because previously the script had to:
>   * Find an available port on the remote machine
>   * Start the server with this port on a remote machine. Moreover, the port
>     might not be available at the time it is started.
>   * Wait for the server to bind and be in the listen state

> With this patch, tst_netload has to:
>   * Start the server. When the server completes its setup (after bind())
>     it goes to background and tst_netload goes to the next step.
>   * read a file with the server port

> Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>
> ---
>  testcases/lib/test_net.sh               |   38 +++++---------------------
>  testcases/network/netstress/netstress.c |   44 ++++++++++++++++++++++++++++--
>  2 files changed, 49 insertions(+), 33 deletions(-)

> diff --git a/testcases/lib/test_net.sh b/testcases/lib/test_net.sh
> index 1e001f7..95e13ee 100644
> --- a/testcases/lib/test_net.sh
> +++ b/testcases/lib/test_net.sh
> @@ -392,7 +392,7 @@ tst_wait_ipv6_dad()

>  tst_dump_rhost_cmd()
>  {
> -	tst_rhost_run -c "cat $TST_TMPDIR/bg.cmd"
> +	tst_rhost_run -c "cat $TST_TMPDIR/netstress.log"
>  }

>  # Run network load test, see 'netstress -h' for option description
> @@ -447,39 +447,17 @@ tst_netload()
>  	local expect_ret=0
>  	[ "$expect_res" != "pass" ] && expect_ret=1

> -	local ptype="stream"
> -	[ "$type" = "udp" ] && ptype="dgram"
> -
> -	local port=$(tst_rhost_run -c "tst_get_unused_port ipv6 $ptype")
> -	[ $? -ne 0 ] && tst_brkm TBROK "failed to get unused port"
> -
>  	tst_rhost_run -c "pkill -9 netstress\$"
> -
> -	c_opts="${cs_opts}${c_opts}-a $c_num -r $c_requests -d $rfile -g $port"
> -	s_opts="${cs_opts}${s_opts}-R $s_replies -g $port"
> -
> +	s_opts="${cs_opts}${s_opts}-R $s_replies -B $TST_TMPDIR"
>  	tst_resm TINFO "run server 'netstress $s_opts'"
> -	tst_rhost_run -s -B -c "netstress $s_opts"
> -
> -	tst_resm TINFO "check that server port in 'LISTEN' state"
> -	local sec_waited=
> -
> -	local sock_cmd=
> -	if [ "$type" = "sctp" ]; then
> -		sock_cmd="netstat -naS | grep $port | grep -q LISTEN"
> -	else
> -		sock_cmd="ss -ln$(echo $type | head -c1) | grep -q $port"
> +	tst_rhost_run -c "netstress $s_opts" > tst_netload.log 2>&1
> +	if [ $? -ne 0 ]; then
> +		cat tst_netload.log
> +		tst_brkm TFAIL "server failed"
>  	fi

> -	for sec_waited in $(seq 1 1200); do
> -		tst_rhost_run -c "$sock_cmd" && break
> -		if [ $sec_waited -eq 1200 ]; then
> -			tst_dump_rhost_cmd
> -			tst_rhost_run -c "ss -dutnp | grep $port"
> -			tst_brkm TFAIL "server not in LISTEN state"
> -		fi
> -		tst_sleep 100ms
> -	done
> +	local port=$(tst_rhost_run -s -c "cat $TST_TMPDIR/netstress_port")
> +	c_opts="${cs_opts}${c_opts}-a $c_num -r $c_requests -d $rfile -g $port"

>  	tst_resm TINFO "run client 'netstress -l $c_opts'"
>  	netstress -l $c_opts > tst_netload.log 2>&1 || ret=1
> diff --git a/testcases/network/netstress/netstress.c b/testcases/network/netstress/netstress.c
> index 64fdc91..0a73321 100644
> --- a/testcases/network/netstress/netstress.c
> +++ b/testcases/network/netstress/netstress.c
> @@ -83,9 +83,10 @@ static int max_rand_msg_len;
>  static int server_max_requests	= 3;
>  static int client_max_requests	= 10;
>  static int clients_num;
> -static char *tcp_port		= "61000";
> +static char *tcp_port;
>  static char *server_addr	= "localhost";
>  static char *source_addr;
> +static char *server_bg;
>  static int busy_poll		= -1;
>  static int max_etime_cnt = 12; /* ~30 sec max timeout if no connection */

> @@ -112,6 +113,8 @@ static int wait_timeout = 60000;

>  /* in the end test will save time result in this file */
>  static char *rpath = "tfo_result";
> +static char *port_path = "netstress_port";
> +static char *log_path = "netstress.log";

>  static char *narg, *Narg, *qarg, *rarg, *Rarg, *aarg, *Targ, *barg, *targ,
>  	    *Aarg;
> @@ -644,6 +647,9 @@ static void server_init(void)
>  	hints.ai_socktype = sock_type;
>  	hints.ai_flags = AI_PASSIVE;

> +	if (!source_addr && !tcp_port)
> +		tcp_port = "0";
> +
>  	if (source_addr && !strchr(source_addr, ':'))
>  		SAFE_ASPRINTF(&src_addr, "::ffff:%s", source_addr);
>  	setup_addrinfo(src_addr ? src_addr : source_addr, tcp_port,
> @@ -659,6 +665,14 @@ static void server_init(void)

>  	freeaddrinfo(local_addrinfo);

> +	int port = TST_GETSOCKPORT(sfd);
> +
> +	tst_res(TINFO, "bind to port %d", port);
> +	if (server_bg) {
> +		SAFE_CHDIR(server_bg);
> +		SAFE_FILE_PRINTF(port_path, "%d", port);
> +	}
> +
>  	if (sock_type == SOCK_DGRAM)
>  		return;

> @@ -674,8 +688,7 @@ static void server_init(void)

>  	SAFE_LISTEN(sfd, max_queue_len);

> -	tst_res(TINFO, "Listen on the socket '%d', port '%s'", sfd, tcp_port);
> -
> +	tst_res(TINFO, "Listen on the socket '%d'", sfd);
>  }

>  static void server_cleanup(void)
> @@ -683,8 +696,28 @@ static void server_cleanup(void)
>  	SAFE_CLOSE(sfd);
>  }

> +static void move_to_background(void)
> +{
> +	if (SAFE_FORK())
> +		exit(0);
> +
> +	SAFE_SETSID();
> +
> +	close(0);
> +	SAFE_OPEN("/dev/null", O_RDONLY);
> +
> +	close(1);
> +	close(2);
Minor nit: maybe using STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO is "correct way", but everyone
knows these numbers.

> +	int fd = SAFE_OPEN(log_path, O_CREAT | O_TRUNC | O_RDONLY, 00444);
> +
> +	SAFE_DUP(fd);
> +}
> +
>  static void server_run_udp(void)
>  {
> +	if (server_bg)
> +		move_to_background();
> +
>  	pthread_t p_id = server_thread_add(sfd);

>  	SAFE_PTHREAD_JOIN(p_id, NULL);
> @@ -692,6 +725,9 @@ static void server_run_udp(void)

>  static void server_run(void)
>  {
> +	if (server_bg)
> +		move_to_background();
> +
>  	/* IPv4 source address will be mapped to IPv6 address */
>  	struct sockaddr_in6 addr6;
>  	socklen_t addr_size = sizeof(addr6);
> @@ -946,11 +982,13 @@ static struct tst_option options[] = {

>  	{"R:", &Rarg, "Server:\n-R x     x requests after which conn.closed"},
>  	{"q:", &qarg, "-q x     x - TFO queue"},
> +	{"B:", &server_bg, "-B x     run in background, x - process directory"},
>  	{NULL, NULL, NULL}
>  };

>  static struct tst_test test = {
>  	.test_all = do_test,
> +	.forks_child = 1,
>  	.setup = setup,
>  	.cleanup = cleanup,
>  	.options = options

Nice simplification, thanks!
Acked-by: Petr Vorel <pvorel@suse.cz>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [LTP] [PATCH] netstress: set port dynamically on the server-side
  2018-02-27  7:09 ` Petr Vorel
@ 2018-03-01 15:28   ` Alexey Kodanev
  0 siblings, 0 replies; 3+ messages in thread
From: Alexey Kodanev @ 2018-03-01 15:28 UTC (permalink / raw)
  To: ltp

On 02/27/2018 10:09 AM, Petr Vorel wrote:
... 
>> +static void move_to_background(void)
>> +{
>> +	if (SAFE_FORK())
>> +		exit(0);
>> +
>> +	SAFE_SETSID();
>> +
>> +	close(0);
>> +	SAFE_OPEN("/dev/null", O_RDONLY);
>> +
>> +	close(1);
>> +	close(2);
> Minor nit: maybe using STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO is "correct way", but everyone
> knows these numbers.

Corrected and applied the patch.

Thanks,
Alexey

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-03-01 15:28 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-16 10:30 [LTP] [PATCH] netstress: set port dynamically on the server-side Alexey Kodanev
2018-02-27  7:09 ` Petr Vorel
2018-03-01 15:28   ` Alexey Kodanev

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox