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 <gshe...@nicira.com>
---
 tests/automake.mk     |    7 +++--
 tests/testsuite.patch |   75 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 2 deletions(-)
 create mode 100644 tests/testsuite.patch

diff --git a/tests/automake.mk b/tests/automake.mk
index 2e8d213..7235744 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,9 +198,10 @@ 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
        $(AM_V_at)mv $@.tmp $@
+       patch -p0 $(TESTSUITE) $(TESTSUITE_PATCH)
 
 $(KMOD_TESTSUITE): package.m4 $(KMOD_TESTSUITE_AT) $(COMMON_MACROS_AT)
        $(AM_V_GEN)$(AUTOTEST) -I '$(srcdir)' -o $@.tmp $@.at
diff --git a/tests/testsuite.patch b/tests/testsuite.patch
new file mode 100644
index 0000000..b0736c1
--- /dev/null
+++ b/tests/testsuite.patch
@@ -0,0 +1,75 @@
+--- testsuite   2015-02-11 07:20:45.863908878 -0800
++++ testsuite   2015-02-11 07:08:49.803934047 -0800
+@@ -4669,6 +4669,72 @@
+   fi
+   exec 6<&-
+   wait
++elif [ "$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@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to