[ovs-dev] [PATCH v2] tests: Enable running parallel unit tests for Windows.

Eitan Eliahu eliahue at vmware.com
Thu Feb 12 18:19:23 UTC 2015


Thanks!

Acked-by: Eitan Eliahu <eliahue at vmware.com>


-----Original Message-----
From: dev [mailto:dev-bounces at openvswitch.org] On Behalf Of Gurucharan Shetty
Sent: Wednesday, February 11, 2015 6:00 PM
To: dev at openvswitch.org
Cc: Gurucharan Shetty
Subject: [ovs-dev] [PATCH v2] tests: Enable running parallel unit tests for Windows.

testsuite uses mkfifo in its job dispatcher that manages parallel unit tests. MinGW does not have a mkfifo. This results in unit tests running serially on Windows. Right now it takes up to approximately 40 minutes to run all the unit tests on Windows.

This commit provides a job dispatcher for MinGW that uses temporary files instead of mkfifo to manage parallel jobs.
With this commit, on a Windows machine with 4 cores and with
8 parallel unit test sessions, it takes approximately 8 minutes to finish a unit test run.

Signed-off-by: Gurucharan Shetty <gshetty at nicira.com>
---
 INSTALL.md            |    2 ++
 tests/automake.mk     |    7 +++--
 tests/testsuite.patch |   76 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 83 insertions(+), 2 deletions(-)  create mode 100644 tests/testsuite.patch

diff --git a/INSTALL.md b/INSTALL.md
index 94c25f7..273093b 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -41,6 +41,8 @@ you will need the following software:
 
   - Python 2.x, for x >= 4.
 
+  - patch (The utility that is used to patch files).
+
 On Linux, you may choose to compile the kernel module that comes with  the Open vSwitch distribution or to use the kernel module built into  the Linux kernel (version 3.3 or later).  See the [FAQ.md] question diff --git a/tests/automake.mk b/tests/automake.mk index 2e8d213..50d8ad2 100644
--- a/tests/automake.mk
+++ b/tests/automake.mk
@@ -6,7 +6,8 @@ EXTRA_DIST += \
 	$(KMOD_TESTSUITE) \
 	tests/atlocal.in \
 	$(srcdir)/package.m4 \
-	$(srcdir)/tests/testsuite
+	$(srcdir)/tests/testsuite \
+	$(srcdir)/tests/testsuite.patch
 
 COMMON_MACROS_AT = \
 	tests/ovsdb-macros.at \
@@ -87,6 +88,7 @@ KMOD_TESTSUITE_AT = \
 	tests/kmod-traffic.at
 
 TESTSUITE = $(srcdir)/tests/testsuite
+TESTSUITE_PATCH = $(srcdir)/tests/testsuite.patch
 KMOD_TESTSUITE = $(srcdir)/tests/kmod-testsuite  DISTCLEANFILES += tests/atconfig tests/atlocal
 
@@ -196,8 +198,9 @@ clean-local:
 	test ! -f '$(TESTSUITE)' || $(SHELL) '$(TESTSUITE)' -C tests --clean
 
 AUTOTEST = $(AUTOM4TE) --language=autotest
-$(TESTSUITE): package.m4 $(TESTSUITE_AT) $(COMMON_MACROS_AT)
+$(TESTSUITE): package.m4 $(TESTSUITE_AT) $(COMMON_MACROS_AT) 
+$(TESTSUITE_PATCH)
 	$(AM_V_GEN)$(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at
+	patch -p0 $@.tmp $(TESTSUITE_PATCH)
 	$(AM_V_at)mv $@.tmp $@
 
 $(KMOD_TESTSUITE): package.m4 $(KMOD_TESTSUITE_AT) $(COMMON_MACROS_AT) diff --git a/tests/testsuite.patch b/tests/testsuite.patch new file mode 100644 index 0000000..e0c6bb3
--- /dev/null
+++ b/tests/testsuite.patch
@@ -0,0 +1,76 @@
+--- testsuite	2015-02-11 17:19:21.654646439 -0800
++++ testsuite	2015-02-11 17:15:03.810653032 -0800
+@@ -4669,6 +4669,73 @@
+   fi
+   exec 6<&-
+   wait
++elif test $at_jobs -ne 1 &&
++     test "$IS_WIN32" = "yes"; then
++  # FIFO job dispatcher.
++  trap 'at_pids=
++	for at_pid in `jobs -p`; do
++	  at_pids="$at_pids $at_job_group$at_pid"
++	done
++	if test -n "$at_pids"; then
++	  at_sig=TSTP
++	  test "${TMOUT+set}" = set && at_sig=STOP
++	  kill -$at_sig $at_pids 2>/dev/null
++	fi
++	kill -STOP $$
++	test -z "$at_pids" || kill -CONT $at_pids 2>/dev/null' TSTP
++
++  echo
++  # Turn jobs into a list of numbers, starting from 1.
++  running_jobs="`pwd`/tests/jobdispatcher"
++  mkdir -p $running_jobs
++  at_joblist=`$as_echo "$at_groups" | sed -n 1,${at_jobs}p`
++
++  set X $at_joblist
++  shift
++  for at_group in $at_groups; do
++    $at_job_control_on 2>/dev/null
++    (
++      # Start one test group.
++      $at_job_control_off
++      touch $running_jobs/$at_group
++      trap 'set +x; set +e
++	    trap "" PIPE
++	    echo stop > "$at_stop_file"
++	    rm -f $running_jobs/$at_group
++	    as_fn_exit 141' PIPE
++      at_fn_group_prepare
++      if cd "$at_group_dir" &&
++	 at_fn_test $at_group &&
++	 . "$at_test_source"
++      then :; else
++	{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to parse 
++test group: $at_group" >&5 $as_echo "$as_me: WARNING: unable to parse test group: $at_group" >&2;}
++	at_failed=:
++      fi
++      rm -f $running_jobs/$at_group
++      at_fn_group_postprocess
++    ) &
++    $at_job_control_off
++    shift # Consume one token.
++    if test $# -gt 0; then :; else
++      while [ "`ls -l $running_jobs 2>/dev/null | wc -l`" -gt "$at_jobs" ]; do
++        sleep 0.1
++      done
++      set x $*
++    fi
++    test -f "$at_stop_file" && break
++  done
++  # Read back the remaining ($at_jobs - 1) tokens.
++  set X $at_joblist
++  shift
++  if test $# -gt 0; then
++    shift
++    while [ "`ls -l $running_jobs | wc -l`" -gt 1 ]; do
++      sleep 0.1
++    done
++  fi
++  rmdir $running_jobs
++  wait
+ else
+   # Run serially, avoid forks and other potential surprises.
+   for at_group in $at_groups; do
--
1.7.9.5

_______________________________________________
dev mailing list
dev at openvswitch.org
https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailman_listinfo_dev&d=AwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=CWsgHUxi6ExLXY798tmo3LJ4e3geGYp56lkcH-5cLCY&m=u3hFANbl-LCrB-EZ--Z6-9HxiSFScBp5LiDZfXxlclY&s=3OZD6i2he0bJnOIcP6upWuXhx9_uZXB8D11p02JImd8&e= 


More information about the dev mailing list