You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mitogen/ansible_mitogen
David Wilson f78a5f08c6 issue #605: ansible: share a sem_t instead of a pthread_mutex_t
The previous version quite reliably causes worker deadlocks within 10
minutes running:

    # 100 times:
    - import_playbook: integration/async/runner_one_job.yml
    # 100 times:
    - import_playbook: integration/module_utils/adjacent_to_playbook.yml

via .ci/soak/mitogen.sh with PLAYBOOK= set to the above playbook.

Attaching to the worker with gdb reveals it in an instruction
immediately following a futex() call, which likely returned EINTR due to
attaching gdb. Examining the pthread_mutex_t state reveals it to be
completely unlocked.

pthread_mutex_t on Linux should have zero trouble living in shmem, so
it's not clear how this deadlock is happening. Meanwhile POSIX
semaphores are explicitly designed for cross-process use and have a
completely different internal implementation, so try those instead. 1
hour of soaking reveals no deadlock.

This is about avoiding managing a lockable temporary file on disk to
contain our counter, and somehow communicating a reference to it into
subprocesses (despite the subprocess module closing inherited fds, etc),
somehow deleting it reliably at exit, and somehow avoiding concurrent
Ansible runs stepping on the same file. For now ctypes is still less
pain.

A final possibility would be to abandon a shared counter and instead
pick a CPU based on the hash of e.g. the new child's process ID. That
would likely balance equally well, and might be worth exploring when
making this code work on BSD.
5 years ago
..
compat ansible: create stub __init__.py for sdist. 6 years ago
plugins [linear2] update mitogen_get_stack for new _build_stack() return value 5 years ago
__init__.py ansible: restructure to avoid intermediate imports 7 years ago
affinity.py issue #605: ansible: share a sem_t instead of a pthread_mutex_t 5 years ago
connection.py issue #615: use FileService for target->controll file transfers 5 years ago
loaders.py Update copyright year everywhere. 6 years ago
logging.py issue #552: include process identity in log messages. 6 years ago
mixins.py [linear2]: merge fallout flaggged by LGTM 5 years ago
module_finder.py module_finder: pass raw file to compile() 5 years ago
parsing.py ansible: remove cutpasted docstring 5 years ago
planner.py ansible: abstract worker process model. 5 years ago
process.py Split out and make readable more log messages across both packages 5 years ago
runner.py issue #600: /etc/environment may be non-ASCII in an unknown encoding 5 years ago
services.py [linear2] merge fallout: re-enable _send_module_forwards(). 5 years ago
strategy.py ansible: cleanup various docstrings 5 years ago
target.py issue #575: fix exception text rendering 6 years ago
transport_config.py Add buildah transport 6 years ago