Bug#904670: dijitso: autopkgtest regression and times out since 2018.1.0-2

Paul Gevers elbrus at debian.org
Thu Jul 26 13:35:08 BST 2018


Source: dijitso
Version: 2018.1.0-2
X-Debbugs-CC: debian-ci at lists.debian.org
User: debian-ci at lists.debian.org
Usertags: timeout regression

Dear maintainers,

Since the upload of version 2018.1.0-2 the autopkgtest of your package
times out (after 2:47h) on ci.debian.net. I have copied the output below.

Could you please make your autopkgtest robust against this?

On top of that, it seems you are downloading the latest source in the
autopkgtest. Please don't do that, you already have the source of the
RIGHT version of your package available. (E.g. consider your test having
different versions in testing and unstable, running the test in testing
should be testing that version.) On top of that you should be testing
the AS-INSTALLED package, not the source.

Don't hesitate to ask for help for the Debian CI teamĀ² if you need help
solving this issue.

I will blacklist this package on the ci.debian.net infrastructure and
will remove the blacklist once this bug is fixed.

Paul

https://ci.debian.net/data/autopkgtest/unstable/amd64/d/dijitso/670056/log.gz

autopkgtest [21:14:44]: test test-dijitso: [-----------------------
Reading package lists...
NOTICE: 'dijitso' packaging is maintained in the 'Git' version control
system at:
https://salsa.debian.org/science-team/fenics/dijitso.git
Please use:
git clone https://salsa.debian.org/science-team/fenics/dijitso.git
to retrieve the latest (possibly unreleased) updates to the package.
Need to get 59.4 kB of source archives.
Get:1 http://incoming.debian.org/debian-buildd buildd-unstable/main
dijitso 2018.1.0-2 (dsc) [2455 B]
Get:2 http://incoming.debian.org/debian-buildd buildd-unstable/main
dijitso 2018.1.0-2 (tar) [51.8 kB]
Get:3 http://incoming.debian.org/debian-buildd buildd-unstable/main
dijitso 2018.1.0-2 (asc) [473 B]
Get:4 http://incoming.debian.org/debian-buildd buildd-unstable/main
dijitso 2018.1.0-2 (diff) [4732 B]
Fetched 59.4 kB in 0s (147 kB/s)
Download complete and in download only mode
gpgv: unknown type of key resource 'trustedkeys.kbx'
gpgv: keyblock resource '/home/debci/.gnupg/trustedkeys.kbx': General error
gpgv: Signature made Wed Jul 25 14:44:38 2018 UTC
gpgv:                using RSA key 23C9A93E585819E9126D0A36573EF1E4BD5A01FA
gpgv:                issuer "dparsons at debian.org"
gpgv: Can't check signature: No public key
dpkg-source: warning: failed to verify signature on ./dijitso_2018.1.0-2.dsc
dpkg-source: info: extracting dijitso in dijitso-test
dpkg-source: info: unpacking dijitso_2018.1.0.orig.tar.gz
dpkg-source: info: unpacking dijitso_2018.1.0-2.debian.tar.xz
============================= test session starts
==============================
platform linux -- Python 3.6.6, pytest-3.6.2, py-1.5.3, pluggy-0.6.0
rootdir:
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/dijitso-test/test,
inifile: pytest.ini
collected 10 items

test/test_mpi_dijitso.py FFF
[ 30%]
test/test_mpi_dummy.py .
[ 40%]
test/test_role_assignment.py ...
[ 70%]
test/test_serial_dijitso.py F
[ 80%]
test/test_system_utils.py ..
[100%]

=================================== FAILURES
===================================
________________________ test_mpi_jit_strategies[root]
_________________________

comm = <mpi4py.MPI.Intracomm object at 0x7f8fb8b6ba50>
jit_integer = <function _jit_integer at 0x7f8fb8b25e18>, buildon = 'root'

    def test_mpi_jit_strategies(comm, jit_integer, buildon):
        """Jit a simple code generated by inserting a simple integer.

        Covers (if the cache is initially empty):

            - memory cache miss
            - memory cache hit
            - compiling
            - loading
            - factory function extraction

        """
        # Note: this test was initially copied from
        # test_core_jit_framework in test_dijitso.py
        print(buildon, comm.rank)

        if buildon == "process":
            # One dir per process
            dijitso_cache_dir = ".test_dijitso_%d" % (comm.rank,)
        elif buildon == "node":
            # Less dirs than processes (gives some waiting for size > 2)
            dijitso_cache_dir = ".test_dijitso_%d" % (comm.rank % 2,)
        elif buildon == "root":
            # Less dirs than processes (gives a combination of copying
            # (size>1) and waiting (size>2))
            dijitso_cache_dir = ".test_dijitso_%d" % (comm.rank % 2,)
        dijitso_cache_dir = os.path.join(os.path.dirname(__file__),
                                         dijitso_cache_dir)

        shutil.rmtree(dijitso_cache_dir, ignore_errors=True)
        comm.barrier()

        # This magic value is defined in testincludes/testinclude.h,
        # so this is used to confirm that includes work correctly.
        # Also the fact that the #include "testinclude.h" above compiles.
        magic_value = 42

        stored = {}
        for repeat in range(2):
            for jitable in (234, 567):  # Note different values than
serial test
                # Each integer produces different code
                lib, factory, gettr = jit_integer(jitable, comm=comm,
                                                  buildon=buildon,
>
dijitso_cache_dir=dijitso_cache_dir)

test/test_mpi_dijitso.py:72:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _
test/conftest.py:166: in _jit_integer
    generate, send, receive, wait)
dijitso/jit.py:178: in jit
    params)
dijitso/build.py:153: in build_shared_library
    status, output = get_status_output(cmd)
dijitso/system.py:41: in _get_status_output_subprocess
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
/usr/lib/python3.6/subprocess.py:709: in __init__
    restore_signals, start_new_session)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _

self = <subprocess.Popen object at 0x7f8fb9dd9cf8>
args = ['c++', '-Wall', '-shared', '-fPIC', '-std=c++11', '-g', ...]
executable = b'c++', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = 23, c2pwrite = 24, errread = -1
errwrite = 24, restore_signals = True, start_new_session = False

    def _execute_child(self, args, executable, preexec_fn, close_fds,
                       pass_fds, cwd, env,
                       startupinfo, creationflags, shell,
                       p2cread, p2cwrite,
                       c2pread, c2pwrite,
                       errread, errwrite,
                       restore_signals, start_new_session):
        """Execute program (POSIX version)"""

        if isinstance(args, (str, bytes)):
            args = [args]
        else:
            args = list(args)

        if shell:
            args = ["/bin/sh", "-c"] + args
            if executable:
                args[0] = executable

        if executable is None:
            executable = args[0]
        orig_executable = executable

        # For transferring possible exec failure from child to parent.
        # Data format: "exception name:hex errno:description"
        # Pickle is not used; it is complex and involves memory allocation.
        errpipe_read, errpipe_write = os.pipe()
        # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
        low_fds_to_close = []
        while errpipe_write < 3:
            low_fds_to_close.append(errpipe_write)
            errpipe_write = os.dup(errpipe_write)
        for low_fd in low_fds_to_close:
            os.close(low_fd)
        try:
            try:
                # We must avoid complex work that could involve
                # malloc or free in the child process to avoid
                # potential deadlocks, thus we do all this here.
                # and pass it to fork_exec()

                if env is not None:
                    env_list = []
                    for k, v in env.items():
                        k = os.fsencode(k)
                        if b'=' in k:
                            raise ValueError("illegal environment
variable name")
                        env_list.append(k + b'=' + os.fsencode(v))
                else:
                    env_list = None  # Use execv instead of execve.
                executable = os.fsencode(executable)
                if os.path.dirname(executable):
                    executable_list = (executable,)
                else:
                    # This matches the behavior of os._execvpe().
                    executable_list = tuple(
                        os.path.join(os.fsencode(dir), executable)
                        for dir in os.get_exec_path(env))
                fds_to_keep = set(pass_fds)
                fds_to_keep.add(errpipe_write)
                self.pid = _posixsubprocess.fork_exec(
                        args, executable_list,
                        close_fds, tuple(sorted(map(int, fds_to_keep))),
                        cwd, env_list,
                        p2cread, p2cwrite, c2pread, c2pwrite,
                        errread, errwrite,
                        errpipe_read, errpipe_write,
                        restore_signals, start_new_session, preexec_fn)
                self._child_created = True
            finally:
                # be sure the FD is closed no matter what
                os.close(errpipe_write)

            # self._devnull is not always defined.
            devnull_fd = getattr(self, '_devnull', None)
            if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
                os.close(p2cread)
            if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
                os.close(c2pwrite)
            if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
                os.close(errwrite)
            if devnull_fd is not None:
                os.close(devnull_fd)
            # Prevent a double close of these fds from __init__ on error.
            self._closed_child_pipe_fds = True

            # Wait for exec to fail or succeed; possibly raising an
            # exception (limited in size)
            errpipe_data = bytearray()
            while True:
                part = os.read(errpipe_read, 50000)
                errpipe_data += part
                if not part or len(errpipe_data) > 50000:
                    break
        finally:
            # be sure the FD is closed no matter what
            os.close(errpipe_read)

        if errpipe_data:
            try:
                pid, sts = os.waitpid(self.pid, 0)
                if pid == self.pid:
                    self._handle_exitstatus(sts)
                else:
                    self.returncode = sys.maxsize
            except ChildProcessError:
                pass

            try:
                exception_name, hex_errno, err_msg = (
                        errpipe_data.split(b':', 2))
                # The encoding here should match the encoding
                # written in by the subprocess implementations
                # like _posixsubprocess
                err_msg = err_msg.decode()
            except ValueError:
                exception_name = b'SubprocessError'
                hex_errno = b'0'
                err_msg = 'Bad exception data from child: {!r}'.format(
                              bytes(errpipe_data))
            child_exception_type = getattr(
                    builtins, exception_name.decode('ascii'),
                    SubprocessError)
            if issubclass(child_exception_type, OSError) and hex_errno:
                errno_num = int(hex_errno, 16)
                child_exec_never_called = (err_msg == "noexec")
                if child_exec_never_called:
                    err_msg = ""
                    # The error must be from chdir(cwd).
                    err_filename = cwd
                else:
                    err_filename = orig_executable
                if errno_num != 0:
                    err_msg = os.strerror(errno_num)
                    if errno_num == errno.ENOENT:
                        err_msg += ': ' + repr(err_filename)
>               raise child_exception_type(errno_num, err_msg, err_filename)
E               FileNotFoundError: [Errno 2] No such file or directory:
'c++': 'c++'

/usr/lib/python3.6/subprocess.py:1344: FileNotFoundError
----------------------------- Captured stdout call
-----------------------------
root 0
________________________ test_mpi_jit_strategies[node]
_________________________

comm = <mpi4py.MPI.Intracomm object at 0x7f8fb8b6ba50>
jit_integer = <function _jit_integer at 0x7f8fb8b25e18>, buildon = 'node'

    def test_mpi_jit_strategies(comm, jit_integer, buildon):
        """Jit a simple code generated by inserting a simple integer.

        Covers (if the cache is initially empty):

            - memory cache miss
            - memory cache hit
            - compiling
            - loading
            - factory function extraction

        """
        # Note: this test was initially copied from
        # test_core_jit_framework in test_dijitso.py
        print(buildon, comm.rank)

        if buildon == "process":
            # One dir per process
            dijitso_cache_dir = ".test_dijitso_%d" % (comm.rank,)
        elif buildon == "node":
            # Less dirs than processes (gives some waiting for size > 2)
            dijitso_cache_dir = ".test_dijitso_%d" % (comm.rank % 2,)
        elif buildon == "root":
            # Less dirs than processes (gives a combination of copying
            # (size>1) and waiting (size>2))
            dijitso_cache_dir = ".test_dijitso_%d" % (comm.rank % 2,)
        dijitso_cache_dir = os.path.join(os.path.dirname(__file__),
                                         dijitso_cache_dir)

        shutil.rmtree(dijitso_cache_dir, ignore_errors=True)
        comm.barrier()

        # This magic value is defined in testincludes/testinclude.h,
        # so this is used to confirm that includes work correctly.
        # Also the fact that the #include "testinclude.h" above compiles.
        magic_value = 42

        stored = {}
        for repeat in range(2):
            for jitable in (234, 567):  # Note different values than
serial test
                # Each integer produces different code
                lib, factory, gettr = jit_integer(jitable, comm=comm,
                                                  buildon=buildon,
>
dijitso_cache_dir=dijitso_cache_dir)

test/test_mpi_dijitso.py:72:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _
test/conftest.py:166: in _jit_integer
    generate, send, receive, wait)
dijitso/jit.py:178: in jit
    params)
dijitso/build.py:153: in build_shared_library
    status, output = get_status_output(cmd)
dijitso/system.py:41: in _get_status_output_subprocess
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
/usr/lib/python3.6/subprocess.py:709: in __init__
    restore_signals, start_new_session)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _

self = <subprocess.Popen object at 0x7f8fbaddab38>
args = ['c++', '-Wall', '-shared', '-fPIC', '-std=c++11', '-g', ...]
executable = b'c++', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = 23, c2pwrite = 24, errread = -1
errwrite = 24, restore_signals = True, start_new_session = False

    def _execute_child(self, args, executable, preexec_fn, close_fds,
                       pass_fds, cwd, env,
                       startupinfo, creationflags, shell,
                       p2cread, p2cwrite,
                       c2pread, c2pwrite,
                       errread, errwrite,
                       restore_signals, start_new_session):
        """Execute program (POSIX version)"""

        if isinstance(args, (str, bytes)):
            args = [args]
        else:
            args = list(args)

        if shell:
            args = ["/bin/sh", "-c"] + args
            if executable:
                args[0] = executable

        if executable is None:
            executable = args[0]
        orig_executable = executable

        # For transferring possible exec failure from child to parent.
        # Data format: "exception name:hex errno:description"
        # Pickle is not used; it is complex and involves memory allocation.
        errpipe_read, errpipe_write = os.pipe()
        # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
        low_fds_to_close = []
        while errpipe_write < 3:
            low_fds_to_close.append(errpipe_write)
            errpipe_write = os.dup(errpipe_write)
        for low_fd in low_fds_to_close:
            os.close(low_fd)
        try:
            try:
                # We must avoid complex work that could involve
                # malloc or free in the child process to avoid
                # potential deadlocks, thus we do all this here.
                # and pass it to fork_exec()

                if env is not None:
                    env_list = []
                    for k, v in env.items():
                        k = os.fsencode(k)
                        if b'=' in k:
                            raise ValueError("illegal environment
variable name")
                        env_list.append(k + b'=' + os.fsencode(v))
                else:
                    env_list = None  # Use execv instead of execve.
                executable = os.fsencode(executable)
                if os.path.dirname(executable):
                    executable_list = (executable,)
                else:
                    # This matches the behavior of os._execvpe().
                    executable_list = tuple(
                        os.path.join(os.fsencode(dir), executable)
                        for dir in os.get_exec_path(env))
                fds_to_keep = set(pass_fds)
                fds_to_keep.add(errpipe_write)
                self.pid = _posixsubprocess.fork_exec(
                        args, executable_list,
                        close_fds, tuple(sorted(map(int, fds_to_keep))),
                        cwd, env_list,
                        p2cread, p2cwrite, c2pread, c2pwrite,
                        errread, errwrite,
                        errpipe_read, errpipe_write,
                        restore_signals, start_new_session, preexec_fn)
                self._child_created = True
            finally:
                # be sure the FD is closed no matter what
                os.close(errpipe_write)

            # self._devnull is not always defined.
            devnull_fd = getattr(self, '_devnull', None)
            if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
                os.close(p2cread)
            if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
                os.close(c2pwrite)
            if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
                os.close(errwrite)
            if devnull_fd is not None:
                os.close(devnull_fd)
            # Prevent a double close of these fds from __init__ on error.
            self._closed_child_pipe_fds = True

            # Wait for exec to fail or succeed; possibly raising an
            # exception (limited in size)
            errpipe_data = bytearray()
            while True:
                part = os.read(errpipe_read, 50000)
                errpipe_data += part
                if not part or len(errpipe_data) > 50000:
                    break
        finally:
            # be sure the FD is closed no matter what
            os.close(errpipe_read)

        if errpipe_data:
            try:
                pid, sts = os.waitpid(self.pid, 0)
                if pid == self.pid:
                    self._handle_exitstatus(sts)
                else:
                    self.returncode = sys.maxsize
            except ChildProcessError:
                pass

            try:
                exception_name, hex_errno, err_msg = (
                        errpipe_data.split(b':', 2))
                # The encoding here should match the encoding
                # written in by the subprocess implementations
                # like _posixsubprocess
                err_msg = err_msg.decode()
            except ValueError:
                exception_name = b'SubprocessError'
                hex_errno = b'0'
                err_msg = 'Bad exception data from child: {!r}'.format(
                              bytes(errpipe_data))
            child_exception_type = getattr(
                    builtins, exception_name.decode('ascii'),
                    SubprocessError)
            if issubclass(child_exception_type, OSError) and hex_errno:
                errno_num = int(hex_errno, 16)
                child_exec_never_called = (err_msg == "noexec")
                if child_exec_never_called:
                    err_msg = ""
                    # The error must be from chdir(cwd).
                    err_filename = cwd
                else:
                    err_filename = orig_executable
                if errno_num != 0:
                    err_msg = os.strerror(errno_num)
                    if errno_num == errno.ENOENT:
                        err_msg += ': ' + repr(err_filename)
>               raise child_exception_type(errno_num, err_msg, err_filename)
E               FileNotFoundError: [Errno 2] No such file or directory:
'c++': 'c++'

/usr/lib/python3.6/subprocess.py:1344: FileNotFoundError
----------------------------- Captured stdout call
-----------------------------
node 0
_______________________ test_mpi_jit_strategies[process]
_______________________

comm = <mpi4py.MPI.Intracomm object at 0x7f8fb8b6ba50>
jit_integer = <function _jit_integer at 0x7f8fb8b25e18>, buildon = 'process'

    def test_mpi_jit_strategies(comm, jit_integer, buildon):
        """Jit a simple code generated by inserting a simple integer.

        Covers (if the cache is initially empty):

            - memory cache miss
            - memory cache hit
            - compiling
            - loading
            - factory function extraction

        """
        # Note: this test was initially copied from
        # test_core_jit_framework in test_dijitso.py
        print(buildon, comm.rank)

        if buildon == "process":
            # One dir per process
            dijitso_cache_dir = ".test_dijitso_%d" % (comm.rank,)
        elif buildon == "node":
            # Less dirs than processes (gives some waiting for size > 2)
            dijitso_cache_dir = ".test_dijitso_%d" % (comm.rank % 2,)
        elif buildon == "root":
            # Less dirs than processes (gives a combination of copying
            # (size>1) and waiting (size>2))
            dijitso_cache_dir = ".test_dijitso_%d" % (comm.rank % 2,)
        dijitso_cache_dir = os.path.join(os.path.dirname(__file__),
                                         dijitso_cache_dir)

        shutil.rmtree(dijitso_cache_dir, ignore_errors=True)
        comm.barrier()

        # This magic value is defined in testincludes/testinclude.h,
        # so this is used to confirm that includes work correctly.
        # Also the fact that the #include "testinclude.h" above compiles.
        magic_value = 42

        stored = {}
        for repeat in range(2):
            for jitable in (234, 567):  # Note different values than
serial test
                # Each integer produces different code
                lib, factory, gettr = jit_integer(jitable, comm=comm,
                                                  buildon=buildon,
>
dijitso_cache_dir=dijitso_cache_dir)

test/test_mpi_dijitso.py:72:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _
test/conftest.py:166: in _jit_integer
    generate, send, receive, wait)
dijitso/jit.py:178: in jit
    params)
dijitso/build.py:153: in build_shared_library
    status, output = get_status_output(cmd)
dijitso/system.py:41: in _get_status_output_subprocess
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
/usr/lib/python3.6/subprocess.py:709: in __init__
    restore_signals, start_new_session)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _

self = <subprocess.Popen object at 0x7f8fb56cde10>
args = ['c++', '-Wall', '-shared', '-fPIC', '-std=c++11', '-g', ...]
executable = b'c++', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = 23, c2pwrite = 24, errread = -1
errwrite = 24, restore_signals = True, start_new_session = False

    def _execute_child(self, args, executable, preexec_fn, close_fds,
                       pass_fds, cwd, env,
                       startupinfo, creationflags, shell,
                       p2cread, p2cwrite,
                       c2pread, c2pwrite,
                       errread, errwrite,
                       restore_signals, start_new_session):
        """Execute program (POSIX version)"""

        if isinstance(args, (str, bytes)):
            args = [args]
        else:
            args = list(args)

        if shell:
            args = ["/bin/sh", "-c"] + args
            if executable:
                args[0] = executable

        if executable is None:
            executable = args[0]
        orig_executable = executable

        # For transferring possible exec failure from child to parent.
        # Data format: "exception name:hex errno:description"
        # Pickle is not used; it is complex and involves memory allocation.
        errpipe_read, errpipe_write = os.pipe()
        # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
        low_fds_to_close = []
        while errpipe_write < 3:
            low_fds_to_close.append(errpipe_write)
            errpipe_write = os.dup(errpipe_write)
        for low_fd in low_fds_to_close:
            os.close(low_fd)
        try:
            try:
                # We must avoid complex work that could involve
                # malloc or free in the child process to avoid
                # potential deadlocks, thus we do all this here.
                # and pass it to fork_exec()

                if env is not None:
                    env_list = []
                    for k, v in env.items():
                        k = os.fsencode(k)
                        if b'=' in k:
                            raise ValueError("illegal environment
variable name")
                        env_list.append(k + b'=' + os.fsencode(v))
                else:
                    env_list = None  # Use execv instead of execve.
                executable = os.fsencode(executable)
                if os.path.dirname(executable):
                    executable_list = (executable,)
                else:
                    # This matches the behavior of os._execvpe().
                    executable_list = tuple(
                        os.path.join(os.fsencode(dir), executable)
                        for dir in os.get_exec_path(env))
                fds_to_keep = set(pass_fds)
                fds_to_keep.add(errpipe_write)
                self.pid = _posixsubprocess.fork_exec(
                        args, executable_list,
                        close_fds, tuple(sorted(map(int, fds_to_keep))),
                        cwd, env_list,
                        p2cread, p2cwrite, c2pread, c2pwrite,
                        errread, errwrite,
                        errpipe_read, errpipe_write,
                        restore_signals, start_new_session, preexec_fn)
                self._child_created = True
            finally:
                # be sure the FD is closed no matter what
                os.close(errpipe_write)

            # self._devnull is not always defined.
            devnull_fd = getattr(self, '_devnull', None)
            if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
                os.close(p2cread)
            if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
                os.close(c2pwrite)
            if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
                os.close(errwrite)
            if devnull_fd is not None:
                os.close(devnull_fd)
            # Prevent a double close of these fds from __init__ on error.
            self._closed_child_pipe_fds = True

            # Wait for exec to fail or succeed; possibly raising an
            # exception (limited in size)
            errpipe_data = bytearray()
            while True:
                part = os.read(errpipe_read, 50000)
                errpipe_data += part
                if not part or len(errpipe_data) > 50000:
                    break
        finally:
            # be sure the FD is closed no matter what
            os.close(errpipe_read)

        if errpipe_data:
            try:
                pid, sts = os.waitpid(self.pid, 0)
                if pid == self.pid:
                    self._handle_exitstatus(sts)
                else:
                    self.returncode = sys.maxsize
            except ChildProcessError:
                pass

            try:
                exception_name, hex_errno, err_msg = (
                        errpipe_data.split(b':', 2))
                # The encoding here should match the encoding
                # written in by the subprocess implementations
                # like _posixsubprocess
                err_msg = err_msg.decode()
            except ValueError:
                exception_name = b'SubprocessError'
                hex_errno = b'0'
                err_msg = 'Bad exception data from child: {!r}'.format(
                              bytes(errpipe_data))
            child_exception_type = getattr(
                    builtins, exception_name.decode('ascii'),
                    SubprocessError)
            if issubclass(child_exception_type, OSError) and hex_errno:
                errno_num = int(hex_errno, 16)
                child_exec_never_called = (err_msg == "noexec")
                if child_exec_never_called:
                    err_msg = ""
                    # The error must be from chdir(cwd).
                    err_filename = cwd
                else:
                    err_filename = orig_executable
                if errno_num != 0:
                    err_msg = os.strerror(errno_num)
                    if errno_num == errno.ENOENT:
                        err_msg += ': ' + repr(err_filename)
>               raise child_exception_type(errno_num, err_msg, err_filename)
E               FileNotFoundError: [Errno 2] No such file or directory:
'c++': 'c++'

/usr/lib/python3.6/subprocess.py:1344: FileNotFoundError
----------------------------- Captured stdout call
-----------------------------
process 0
___________________________ test_core_jit_framework
____________________________

jit_integer = <function _jit_integer at 0x7f8fb8b25e18>

    def test_core_jit_framework(jit_integer):
        """Jit a simple code generated by inserting a simple integer.

        Covers (if the cache is initially empty):

            - memory cache miss
            - memory cache hit
            - compiling
            - loading
            - factory function extraction

        """

        # This magic value is defined in testincludes/testinclude.h, so
        # this is used to confirm that includes work correctly.  Also the
        # fact that the #include "testinclude.h" above compiles.
        magic_value = 42

        stored = {}
        for repeat in range(2):
            for jitable in (123, 456):
                # Each integer produces different code
>               lib, factory, get_test_value = jit_integer(jitable)

test/test_serial_dijitso.py:42:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _
test/conftest.py:166: in _jit_integer
    generate, send, receive, wait)
dijitso/jit.py:178: in jit
    params)
dijitso/build.py:153: in build_shared_library
    status, output = get_status_output(cmd)
dijitso/system.py:41: in _get_status_output_subprocess
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
/usr/lib/python3.6/subprocess.py:709: in __init__
    restore_signals, start_new_session)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _

self = <subprocess.Popen object at 0x7f8fb56d3f28>
args = ['c++', '-Wall', '-shared', '-fPIC', '-std=c++11', '-g', ...]
executable = b'c++', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = 23, c2pwrite = 24, errread = -1
errwrite = 24, restore_signals = True, start_new_session = False

    def _execute_child(self, args, executable, preexec_fn, close_fds,
                       pass_fds, cwd, env,
                       startupinfo, creationflags, shell,
                       p2cread, p2cwrite,
                       c2pread, c2pwrite,
                       errread, errwrite,
                       restore_signals, start_new_session):
        """Execute program (POSIX version)"""

        if isinstance(args, (str, bytes)):
            args = [args]
        else:
            args = list(args)

        if shell:
            args = ["/bin/sh", "-c"] + args
            if executable:
                args[0] = executable

        if executable is None:
            executable = args[0]
        orig_executable = executable

        # For transferring possible exec failure from child to parent.
        # Data format: "exception name:hex errno:description"
        # Pickle is not used; it is complex and involves memory allocation.
        errpipe_read, errpipe_write = os.pipe()
        # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
        low_fds_to_close = []
        while errpipe_write < 3:
            low_fds_to_close.append(errpipe_write)
            errpipe_write = os.dup(errpipe_write)
        for low_fd in low_fds_to_close:
            os.close(low_fd)
        try:
            try:
                # We must avoid complex work that could involve
                # malloc or free in the child process to avoid
                # potential deadlocks, thus we do all this here.
                # and pass it to fork_exec()

                if env is not None:
                    env_list = []
                    for k, v in env.items():
                        k = os.fsencode(k)
                        if b'=' in k:
                            raise ValueError("illegal environment
variable name")
                        env_list.append(k + b'=' + os.fsencode(v))
                else:
                    env_list = None  # Use execv instead of execve.
                executable = os.fsencode(executable)
                if os.path.dirname(executable):
                    executable_list = (executable,)
                else:
                    # This matches the behavior of os._execvpe().
                    executable_list = tuple(
                        os.path.join(os.fsencode(dir), executable)
                        for dir in os.get_exec_path(env))
                fds_to_keep = set(pass_fds)
                fds_to_keep.add(errpipe_write)
                self.pid = _posixsubprocess.fork_exec(
                        args, executable_list,
                        close_fds, tuple(sorted(map(int, fds_to_keep))),
                        cwd, env_list,
                        p2cread, p2cwrite, c2pread, c2pwrite,
                        errread, errwrite,
                        errpipe_read, errpipe_write,
                        restore_signals, start_new_session, preexec_fn)
                self._child_created = True
            finally:
                # be sure the FD is closed no matter what
                os.close(errpipe_write)

            # self._devnull is not always defined.
            devnull_fd = getattr(self, '_devnull', None)
            if p2cread != -1 and p2cwrite != -1 and p2cread != devnull_fd:
                os.close(p2cread)
            if c2pwrite != -1 and c2pread != -1 and c2pwrite != devnull_fd:
                os.close(c2pwrite)
            if errwrite != -1 and errread != -1 and errwrite != devnull_fd:
                os.close(errwrite)
            if devnull_fd is not None:
                os.close(devnull_fd)
            # Prevent a double close of these fds from __init__ on error.
            self._closed_child_pipe_fds = True

            # Wait for exec to fail or succeed; possibly raising an
            # exception (limited in size)
            errpipe_data = bytearray()
            while True:
                part = os.read(errpipe_read, 50000)
                errpipe_data += part
                if not part or len(errpipe_data) > 50000:
                    break
        finally:
            # be sure the FD is closed no matter what
            os.close(errpipe_read)

        if errpipe_data:
            try:
                pid, sts = os.waitpid(self.pid, 0)
                if pid == self.pid:
                    self._handle_exitstatus(sts)
                else:
                    self.returncode = sys.maxsize
            except ChildProcessError:
                pass

            try:
                exception_name, hex_errno, err_msg = (
                        errpipe_data.split(b':', 2))
                # The encoding here should match the encoding
                # written in by the subprocess implementations
                # like _posixsubprocess
                err_msg = err_msg.decode()
            except ValueError:
                exception_name = b'SubprocessError'
                hex_errno = b'0'
                err_msg = 'Bad exception data from child: {!r}'.format(
                              bytes(errpipe_data))
            child_exception_type = getattr(
                    builtins, exception_name.decode('ascii'),
                    SubprocessError)
            if issubclass(child_exception_type, OSError) and hex_errno:
                errno_num = int(hex_errno, 16)
                child_exec_never_called = (err_msg == "noexec")
                if child_exec_never_called:
                    err_msg = ""
                    # The error must be from chdir(cwd).
                    err_filename = cwd
                else:
                    err_filename = orig_executable
                if errno_num != 0:
                    err_msg = os.strerror(errno_num)
                    if errno_num == errno.ENOENT:
                        err_msg += ': ' + repr(err_filename)
>               raise child_exception_type(errno_num, err_msg, err_filename)
E               FileNotFoundError: [Errno 2] No such file or directory:
'c++': 'c++'

/usr/lib/python3.6/subprocess.py:1344: FileNotFoundError
====================== 4 failed, 6 passed in 1.09 seconds
======================
============================= test session starts
==============================
============================= test session starts
==============================
platform linux -- Python 3.6.6, pytest-3.6.2, py-1.5.3, pluggy-0.6.0
platform linux -- Python 3.6.6, pytest-3.6.2, py-1.5.3, pluggy-0.6.0
rootdir:
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/dijitso-test/test,
inifile: pytest.ini
rootdir:
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/dijitso-test/test,
inifile: pytest.ini
============================= test session starts
==============================
platform linux -- Python 3.6.6, pytest-3.6.2, py-1.5.3, pluggy-0.6.0
============================= test session starts
=========================================================== test
session starts ==============================
platform linux -- Python 3.6.6, pytest-3.6.2, py-1.5.3, pluggy-0.6.0
platform linux -- Python 3.6.6, pytest-3.6.2, py-1.5.3, pluggy-0.6.0
rootdir:
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/dijitso-test/test,
inifile: pytest.ini

rootdir:
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/dijitso-test/test,
inifile: pytest.ini
rootdir:
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/dijitso-test/test,
inifile: pytest.ini

collecting 0 items
      
collecting 0 items
      ============================= test session starts
==============================
platform linux -- Python 3.6.6, pytest-3.6.2, py-1.5.3, pluggy-0.6.0
rootdir:
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/dijitso-test/test,
inifile: pytest.ini
============================= test session starts
==============================
platform linux -- Python 3.6.6, pytest-3.6.2, py-1.5.3, pluggy-0.6.0

collecting 0 items
      rootdir:
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/dijitso-test/test,
inifile: pytest.ini

collecting 0 items
      
collecting 0 items
      ============================= test session starts
==============================
platform linux -- Python 3.6.6, pytest-3.6.2, py-1.5.3, pluggy-0.6.0
rootdir:
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/dijitso-test/test,
inifile: pytest.ini

collecting 3 items
      
collecting 3 items
      
collecting 4 items
      
collecting 4 items
      
collecting 3 items
      
collecting 3 items
      
collecting 3 items
      
collecting 0 items
      
collecting 0 items
      
collecting 4 items
      
collecting 4 items
      
collecting 4 items
      
collecting 0 items
      
collecting 7 items
      
collecting 7 items
      
collecting 3 items
      
collecting 3 items
      
collecting 8 items
      
collecting 7 items
      
collecting 7 items
      
collecting 8 items
      
collecting 7 items
      
collecting 4 items
      
collecting 4 items
      
collecting 3 items
      
collecting 8 items
      
collecting 8 items
      
collecting 10 items
      
collecting 8 items
      
collected 10 items
      

collecting 10 items
      
test/test_mpi_dijitso.py 
collected 10 items
      

collecting 4 items
      
collecting 10 items
      
collecting 10 items
      
test/test_mpi_dijitso.py 
collected 10 items
      
collecting 10 items
      
collected 10 items
      


collecting 7 items
      
collected 10 items
      

collecting 7 items
      
test/test_mpi_dijitso.py
test/test_mpi_dijitso.py
test/test_mpi_dijitso.py 
collecting 8 items
      
collecting 8 items
      
collecting 7 items
      
collecting 10 items
      
collected 10 items
      

collecting 10 items
      
collected 10 items
      

test/test_mpi_dijitso.py 
collecting 8 items
      
test/test_mpi_dijitso.py 
collecting 10 items
      
collected 10 items
      

test/test_mpi_dijitso.py Fautopkgtest [00:01:25]: ERROR: timed out on
command "su -s /bin/bash debci -c set -e; export USER=`id -nu`; .
/etc/profile >/dev/null 2>&1 || true;  . ~/.profile >/dev/null 2>&1 ||
true; buildtree="/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src";
mkdir -p -m 1777 --
"/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/test-dijitso-artifacts"; export
AUTOPKGTEST_ARTIFACTS="/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/test-dijitso-artifacts";
export ADT_ARTIFACTS="$AUTOPKGTEST_ARTIFACTS"; mkdir -p -m 755
"/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/autopkgtest_tmp"; export
AUTOPKGTEST_TMP="/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/autopkgtest_tmp";
export ADTTMP="$AUTOPKGTEST_TMP"; export DEBIAN_FRONTEND=noninteractive;
export LANG=C.UTF-8; export DEB_BUILD_OPTIONS=parallel=8; unset LANGUAGE
LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE   LC_MONETARY LC_MESSAGES
LC_PAPER LC_NAME LC_ADDRESS   LC_TELEPHONE LC_MEASUREMENT
LC_IDENTIFICATION LC_ALL;rm -f /tmp/autopkgtest_script_pid; set -C; echo
$$ > /tmp/autopkgtest_script_pid; set +C; trap "rm -f
/tmp/autopkgtest_script_pid" EXIT INT QUIT PIPE; cd "$buildtree"; chmod
+x
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/debian/tests/test-dijitso;
touch /tmp/autopkgtest-lxc.gl2lx2e0/downtmp/test-dijitso-stdout
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/test-dijitso-stderr;
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/build.wgB/src/debian/tests/test-dijitso
2> >(tee -a /tmp/autopkgtest-lxc.gl2lx2e0/downtmp/test-dijitso-stderr
>&2) > >(tee -a
/tmp/autopkgtest-lxc.gl2lx2e0/downtmp/test-dijitso-stdout);" (kind: test)
autopkgtest [00:01:26]: test test-dijitso: -----------------------]

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://alioth-lists.debian.net/pipermail/debian-science-maintainers/attachments/20180726/632accfc/attachment-0001.sig>


More information about the debian-science-maintainers mailing list