I didn't notice that, but this commit actually removes choose-port.pl
entirely so it presumably fixes that problem?

I'll add a note to the commit message to mention that it fixes that
problem too.

On Wed, Apr 03, 2013 at 01:56:03PM -0700, Neil Mckee wrote:
> You probably noticed this, but choose-port.pl is sometimes being used
> to return a free TCP port.... which is promptly used for UDP.  Perhaps
> choose-port.pl should take an argument?
> 
> Neil
> 
> On Apr 3, 2013, at 12:02 PM, Ben Pfaff wrote:
> 
> > An occasionally occurring problem with "make check", especially when
> > parallel tests are enabled, is that multiple tests try to bind the same
> > TCP port and, of course, fail.  This happens because the code to select
> > a TCP port to bind just generates random numbers until it finds a port that
> > is not currently in use and uses the first one, which is of course prone
> > to races.
> > 
> > This commit changes the tests to let the kernel directly choose an
> > available port, which should avoid this type of failure.
> > 
> > Signed-off-by: Ben Pfaff <b...@nicira.com>
> > ---
> > tests/automake.mk       |    2 --
> > tests/choose-port.pl    |   26 --------------------------
> > tests/ofproto-dpif.at   |   33 ++++++++++++++++-----------------
> > tests/ofproto-macros.at |   17 +++++++++++++++++
> > tests/ovsdb-idl.at      |    7 ++++---
> > tests/ovsdb-server.at   |   26 +++++++++++++-------------
> > 6 files changed, 50 insertions(+), 61 deletions(-)
> > delete mode 100644 tests/choose-port.pl
> > 
> > diff --git a/tests/automake.mk b/tests/automake.mk
> > index 275ff53..aad8692 100644
> > --- a/tests/automake.mk
> > +++ b/tests/automake.mk
> > @@ -300,8 +300,6 @@ noinst_PROGRAMS += tests/test-byte-order
> > tests_test_byte_order_SOURCES = tests/test-byte-order.c
> > tests_test_byte_order_LDADD = lib/libopenvswitch.a
> > 
> > -EXTRA_DIST += tests/choose-port.pl
> > -
> > # Python tests.
> > CHECK_PYFILES = \
> >     tests/appctl.py \
> > diff --git a/tests/choose-port.pl b/tests/choose-port.pl
> > deleted file mode 100644
> > index 46c8db5..0000000
> > --- a/tests/choose-port.pl
> > +++ /dev/null
> > @@ -1,26 +0,0 @@
> > -# -*- perl -*-
> > -
> > -# Picks a random TCP port and attempts to bind it, retrying a few
> > -# times if the chosen port is in use.  This is better than just
> > -# picking a random number without checking whether it is in use (but
> > -# of course a race window still exists).
> > -#
> > -# On success, prints a port number on stdout and exits with status 0.
> > -# On failure, prints an error on stderr and exits with a nonzero status.
> > -
> > -use warnings;
> > -use strict;
> > -use Socket;
> > -
> > -socket(SOCK, PF_INET, SOCK_STREAM, 0) || die "socket: $!\n";
> > -for (my ($i) = 0; ; $i++) {
> > -    my ($port) = int(rand(16383)) + 49152;
> > -    if (bind(SOCK, sockaddr_in($port, INADDR_ANY))) {
> > -        print "$port\n";
> > -        exit 0;
> > -    } elsif ($i < 10 && $!{EADDRINUSE}) {
> > -        # Address already in use.  Try again.
> > -    } else {
> > -        die "bind: $!\n";
> > -    }
> > -}
> > diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
> > index 06ebf23..857e6ab 100644
> > --- a/tests/ofproto-dpif.at
> > +++ b/tests/ofproto-dpif.at
> > @@ -1208,10 +1208,12 @@ AT_CLEANUP
> > 
> > dnl Test that sFlow samples packets correctly.
> > AT_SETUP([ofproto-dpif - sFlow packet sampling])
> > -AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
> > -SFLOW_PORT=`cat stdout`
> > OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
> > 
> > +AT_CHECK([test-sflow --log-file --detach --no-chdir --pidfile 0:127.0.0.1 
> > > sflow.log], [0], [], [ignore])
> > +AT_CAPTURE_FILE([sflow.log])
> > +SFLOW_PORT=`parse_listening_port < test-sflow.log`
> > +
> > ovs-appctl time/stop
> > 
> > ADD_OF_PORTS([br0], 1, 2)
> > @@ -1223,8 +1225,6 @@ ovs-vsctl \
> >    --id=@sf create sflow targets=\"127.0.0.1:$SFLOW_PORT\" \
> >      header=128 sampling=1 polling=1
> > ON_EXIT([kill `cat test-sflow.pid`])
> > -AT_CHECK([test-sflow --detach --no-chdir --pidfile $SFLOW_PORT:127.0.0.1 > 
> > sflow.log])
> > -AT_CAPTURE_FILE([sflow.log])
> > 
> > dnl open with ARP packets to seed the bridge-learning.  The output
> > dnl ifIndex numbers should be reported predictably after that.
> > @@ -1504,20 +1504,19 @@ dnl - Flow actions changing (in this case, due to 
> > MAC learning)
> > dnl   cause a record to be sent.
> > AT_SETUP([ofproto-dpif - NetFlow flow expiration])
> > 
> > -AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
> > -NETFLOW_PORT=`cat stdout`
> > -
> > OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
> > ADD_OF_PORTS([br0], 1, 2)
> > +
> > +ON_EXIT([kill `cat test-netflow.pid`])
> > +AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 
> > 0:127.0.0.1 > netflow.log], [0], [], [ignore])
> > +AT_CAPTURE_FILE([netflow.log])
> > +NETFLOW_PORT=`parse_listening_port < test-netflow.log`
> > +
> > ovs-vsctl \
> >    set Bridge br0 netflow=@nf -- \
> >    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
> >      engine_id=1 engine_type=2 active_timeout=30 add-id-to-interface=false
> > 
> > -ON_EXIT([kill `cat test-netflow.pid`])
> > -AT_CHECK([test-netflow --detach --no-chdir --pidfile 
> > $NETFLOW_PORT:127.0.0.1 > netflow.log])
> > -AT_CAPTURE_FILE([netflow.log])
> > -
> > for delay in 1000 30000; do
> >     ovs-appctl netdev-dummy/receive p1 
> > 'in_port(2),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'
> >     ovs-appctl netdev-dummy/receive p2 
> > 'in_port(1),eth(src=50:54:00:00:00:07,dst=50:54:00:00:00:05),eth_type(0x0800),ipv4(src=192.168.0.2,dst=192.168.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=0,code=0)'
> > @@ -1546,19 +1545,19 @@ AT_CLEANUP
> > dnl Test that basic NetFlow reports active expirations correctly.
> > AT_SETUP([ofproto-dpif - NetFlow active expiration])
> > 
> > -AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
> > -NETFLOW_PORT=`cat stdout`
> > -
> > OVS_VSWITCHD_START([set Bridge br0 fail-mode=standalone])
> > ADD_OF_PORTS([br0], 1, 2)
> > +
> > +ON_EXIT([kill `cat test-netflow.pid`])
> > +AT_CHECK([test-netflow --log-file --detach --no-chdir --pidfile 
> > 0:127.0.0.1 > netflow.log], [0], [], [ignore])
> > +AT_CAPTURE_FILE([netflow.log])
> > +NETFLOW_PORT=`parse_listening_port < test-netflow.log`
> > +
> > ovs-vsctl \
> >    set Bridge br0 netflow=@nf -- \
> >    --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
> >      engine_id=1 engine_type=2 active_timeout=10 add-id-to-interface=false
> > 
> > -ON_EXIT([kill `cat test-netflow.pid`])
> > -AT_CHECK([test-netflow --detach --no-chdir --pidfile 
> > $NETFLOW_PORT:127.0.0.1 > netflow.log])AT_CAPTURE_FILE([netflow.log])
> > -
> > AT_CHECK([ovs-appctl time/stop])
> > n=1
> > while test $n -le 60; do
> > diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
> > index 9a6d5ab..cad0080 100644
> > --- a/tests/ofproto-macros.at
> > +++ b/tests/ofproto-macros.at
> > @@ -13,6 +13,23 @@ s/ n_bytes=0,//
> > s/ idle_age=[0-9]*,//
> > s/ hard_age=[0-9]*,//
> > '
> > +}
> > +
> > +# parse_listening_port [SERVER]
> > +#
> > +# Parses the TCP or SSL port on which a server is listening from the log,
> > +# given that the server was told to listen on a kernel-chosen port,
> > +# file provided on stdin, and prints the port number on stdout.
> > +#
> > +# Here's an example of how to use this with ovsdb-server:
> > +#
> > +#    OVS_LOGDIR=`pwd`; export OVS_LOGDIR
> > +#    ovsdb-server --log-file --remote=ptcp:0:127.0.0.1 ...
> > +#    TCP_PORT=`parse_listening_port < ovsdb-server.log`
> > +#
> > +# (Also works with pssl: in place of ptcp:.)
> > +parse_listening_port () {
> > +    sed -n 's/.*0:127\.0\.0\.1: listening on port \([0-9]*\)$/\1/p'
> > }]
> > m4_divert_pop([PREPARE_TESTS])
> > 
> > diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at
> > index 3c32e2f..21a22db 100644
> > --- a/tests/ovsdb-idl.at
> > +++ b/tests/ovsdb-idl.at
> > @@ -57,11 +57,12 @@ m4_define([OVSDB_CHECK_IDL_TCP_PY],
> >    AT_SKIP_IF([test $HAVE_PYTHON = no])
> >    AT_KEYWORDS([ovsdb server idl positive Python with tcp socket $5])
> >    OVS_RUNDIR=`pwd`; export OVS_RUNDIR
> > +   OVS_LOGDIR=`pwd`; export OVS_LOGDIR
> >    AT_CHECK([ovsdb-tool create db $abs_srcdir/idltest.ovsschema],
> >                   [0], [stdout], [ignore])
> > -   AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
> > -   TCP_PORT=`cat stdout`
> > -   AT_CHECK([ovsdb-server '-vPATTERN:console:ovsdb-server|%c|%m' --detach 
> > --no-chdir --pidfile="`pwd`"/pid --remote=ptcp:$TCP_PORT:127.0.0.1 
> > --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
> > +   AT_CHECK([ovsdb-server --log-file 
> > '-vPATTERN:console:ovsdb-server|%c|%m' --detach --no-chdir 
> > --pidfile="`pwd`"/pid --remote=punix:socket --remote=ptcp:0:127.0.0.1 
> > --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
> > +   TCP_PORT=`parse_listening_port < ovsdb-server.log`
> > +
> >    m4_if([$2], [], [],
> >      [AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT $2], [0], 
> > [ignore], [ignore], [kill `cat pid`])])
> >    AT_CHECK([$PYTHON $srcdir/test-ovsdb.py  -t10 idl 
> > $srcdir/idltest.ovsschema tcp:127.0.0.1:$TCP_PORT $3],
> > diff --git a/tests/ovsdb-server.at b/tests/ovsdb-server.at
> > index 62eae38..9cabab2 100644
> > --- a/tests/ovsdb-server.at
> > +++ b/tests/ovsdb-server.at
> > @@ -254,15 +254,15 @@ AT_CHECK(
> >                 "certificate": "'"$PKIDIR/testpki-cert2.pem"'",
> >                 "ca_cert": "'"$PKIDIR/testpki-cacert.pem"'"}}]']],
> >   [0], [ignore], [ignore])
> > -AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
> > -SSL_PORT=`cat stdout`
> > +OVS_LOGDIR=`pwd`; export OVS_LOGDIR
> > AT_CHECK(
> > -  [ovsdb-server --detach --no-chdir --pidfile="`pwd`"/pid \
> > +  [ovsdb-server --log-file --detach --no-chdir --pidfile="`pwd`"/pid \
> >         --private-key=db:SSL,private_key \
> >         --certificate=db:SSL,certificate \
> >         --ca-cert=db:SSL,ca_cert \
> > -         --remote=pssl:$SSL_PORT:127.0.0.1 --unixctl="`pwd`"/unixctl db],
> > +        --remote=pssl:0:127.0.0.1 --unixctl="`pwd`"/unixctl db],
> >   [0], [ignore], [ignore])
> > +SSL_PORT=`parse_listening_port < ovsdb-server.log`
> > AT_CHECK(
> >   [[ovsdb-client \
> >         --private-key=$PKIDIR/testpki-privkey.pem \
> > @@ -437,12 +437,12 @@ m4_define([OVSDB_CHECK_EXECUTION],
> >    AT_KEYWORDS([ovsdb server positive ssl $5])
> >    AT_SKIP_IF([test "$HAVE_OPENSSL" = no])
> >    OVS_RUNDIR=`pwd`; export OVS_RUNDIR
> > +   OVS_LOGDIR=`pwd`; export OVS_LOGDIR
> >    $2 > schema
> > -   AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
> > -   SSL_PORT=`cat stdout`
> >    PKIDIR=$abs_top_builddir/tests
> >    AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
> > -   AT_CHECK([ovsdb-server --detach --no-chdir --pidfile="`pwd`"/pid 
> > --private-key=$PKIDIR/testpki-privkey2.pem 
> > --certificate=$PKIDIR/testpki-cert2.pem 
> > --ca-cert=$PKIDIR/testpki-cacert.pem --remote=pssl:$SSL_PORT:127.0.0.1 
> > --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
> > +   AT_CHECK([ovsdb-server --log-file --detach --no-chdir 
> > --pidfile="`pwd`"/pid --private-key=$PKIDIR/testpki-privkey2.pem 
> > --certificate=$PKIDIR/testpki-cert2.pem 
> > --ca-cert=$PKIDIR/testpki-cacert.pem --remote=pssl:0:127.0.0.1 
> > --unixctl="`pwd`"/unixctl db], [0], [ignore], [ignore])
> > +   SSL_PORT=`parse_listening_port < ovsdb-server.log`
> >    m4_foreach([txn], [$3], 
> >      [AT_CHECK([ovsdb-client --private-key=$PKIDIR/testpki-privkey.pem 
> > --certificate=$PKIDIR/testpki-cert.pem --ca-cert=$PKIDIR/testpki-cacert.pem 
> > transact ssl:127.0.0.1:$SSL_PORT 'txn'], [0], [stdout], [ignore],
> >      [test ! -e pid || kill `cat pid`])
> > @@ -460,10 +460,10 @@ AT_BANNER([OVSDB -- ovsdb-server transactions (TCP 
> > sockets)])
> > AT_SETUP([ovsdb-client get-schema-version - tcp socket])
> > AT_KEYWORDS([ovsdb server positive tcp])
> > ordinal_schema > schema
> > -AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
> > -TCP_PORT=`cat stdout`
> > AT_CHECK([ovsdb-tool create db schema], [0], [ignore], [ignore])
> > -AT_CHECK([ovsdb-server --detach --no-chdir --pidfile="`pwd`"/pid 
> > --unixctl="`pwd`"/unixctl --remote=ptcp:$TCP_PORT:127.0.0.1 db], [0], 
> > [ignore], [ignore])
> > +OVS_LOGDIR=`pwd`; export OVS_LOGDIR
> > +AT_CHECK([ovsdb-server --log-file --detach --no-chdir 
> > --pidfile="`pwd`"/pid --unixctl="`pwd`"/unixctl --remote=ptcp:0:127.0.0.1 
> > db], [0], [ignore], [ignore])
> > +TCP_PORT=`parse_listening_port < ovsdb-server.log`
> > AT_CHECK([ovsdb-client get-schema-version tcp:127.0.0.1:$TCP_PORT 
> > ordinals], [0], [5.1.3
> > ])
> > OVSDB_SERVER_SHUTDOWN
> > @@ -487,12 +487,12 @@ m4_define([OVSDB_CHECK_EXECUTION],
> >   [AT_SETUP([$1])
> >    AT_KEYWORDS([ovsdb server positive tcp $5])
> >    OVS_RUNDIR=`pwd`; export OVS_RUNDIR
> > +   OVS_LOGDIR=`pwd`; export OVS_LOGDIR
> >    $2 > schema
> > -   AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
> > -   TCP_PORT=`cat stdout`
> >    PKIDIR=$abs_top_builddir/tests
> >    AT_CHECK([ovsdb-tool create db schema], [0], [stdout], [ignore])
> > -   AT_CHECK([ovsdb-server --detach --no-chdir --pidfile="`pwd`"/pid 
> > --remote=ptcp:$TCP_PORT:127.0.0.1 --unixctl="`pwd`"/unixctl db], [0], 
> > [ignore], [ignore])
> > +   AT_CHECK([ovsdb-server --log-file --detach --no-chdir 
> > --pidfile="`pwd`"/pid --remote=ptcp:0:127.0.0.1 --unixctl="`pwd`"/unixctl 
> > db], [0], [ignore], [ignore])
> > +   TCP_PORT=`parse_listening_port < ovsdb-server.log`
> >    m4_foreach([txn], [$3],
> >      [AT_CHECK([ovsdb-client transact tcp:127.0.0.1:$TCP_PORT 'txn'], [0], 
> > [stdout], [ignore],
> >      [test ! -e pid || kill `cat pid`])
> > -- 
> > 1.7.10.4
> > 
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to