While running:
./manage.py test --verbosity 3 --parallel=16 --keepdb $UNIT_TESTS
The tests appear to be hanging on the multiprocessing pool.
When I ^C and ^D out of the processes, pdb catches the other side of the exit and appears to do some atexit cleanup just fine.
self.default_handler(signum, frame)
KeyboardInterrupt
KeyboardInterrupt
File "/home/jm/.pyenv/versions/3.9.10/lib/python3.9/unittest/signals.py", line 36, in __call__
self.default_handler(signum, frame)
KeyboardInterrupt
File "/home/jm/.pyenv/versions/3.9.10/lib/python3.9/unittest/signals.py", line 36, in __call__
self.default_handler(signum, frame)
KeyboardInterrupt
KeyboardInterrupt
--KeyboardInterrupt--
(Pdb)
Preserving test database for alias 'default' ('test_circus_1')...
Preserving test database for alias 'default' ('test_circus_2')...
Preserving test database for alias 'default' ('test_circus_3')...
Preserving test database for alias 'default' ('test_circus_4')...
Preserving test database for alias 'default' ('test_circus_5')...
Preserving test database for alias 'default' ('test_circus_6')...
Preserving test database for alias 'default' ('test_circus_7')...
Preserving test database for alias 'default' ('test_circus_8')...
Preserving test database for alias 'default' ('test_circus_9')...
Preserving test database for alias 'default' ('test_circus_10')...
Preserving test database for alias 'default' ('test_circus_11')...
Preserving test database for alias 'default' ('test_circus_12')...
Preserving test database for alias 'default' ('test_circus_13')...
Preserving test database for alias 'default' ('test_circus_14')...
Preserving test database for alias 'default' ('test_circus_15')...
Preserving test database for alias 'default' ('test_circus_16')...
Preserving test database for alias 'default' ('test_circus')...
Any suggestions?
Versions:
- django 3.2
- python 3.9.10
class ParallelTestSuite(unittest.TestSuite):
"""
Run a series of tests in parallel in several processes.
While the unittest module's documentation implies that orchestrating the
execution of tests is the responsibility of the test runner, in practice,
it appears that TestRunner classes are more concerned with formatting and
displaying test results.
Since there are fewer use cases for customizing TestSuite than TestRunner,
implementing parallelization at the level of the TestSuite improves
interoperability with existing custom test runners. A single instance of a
test runner can still collect results from all tests without being aware
that they have been run in parallel.
"""
# In case someone wants to modify these in a subclass.
init_worker = _init_worker
run_subsuite = _run_subsuite
runner_class = RemoteTestRunner
def __init__(self, suite, processes, failfast=False):
self.subsuites = partition_suite_by_case(suite)
self.processes = processes
self.failfast = failfast
super().__init__()
def run(self, result):
"""
Distribute test cases across workers.
Return an identifier of each test case with its result in order to use
imap_unordered to show results as soon as they're available.
To minimize pickling errors when getting results from workers:
- pass back numeric indexes in self.subsuites instead of tests
- make tracebacks picklable with tblib, if available
Even with tblib, errors may still occur for dynamically created
exception classes which cannot be unpickled.
"""
counter = multiprocessing.Value(ctypes.c_int, 0)
# can get here
breakpoint()
pool = multiprocessing.Pool(
processes=self.processes,
initializer=self.init_worker.__func__,
initargs=[counter],
)
# not getting here
breakpoint()
The modified _init_worker
:
def _init_worker(counter):
"""
Switch to databases dedicated to this worker.
This helper lives at module-level because of the multiprocessing module's
requirements.
"""
global _worker_id
print(f"global _worker_id: {_worker_id}")
with counter.get_lock():
counter.value += 1
_worker_id = counter.value
print(f"_worker_id after get_lock: {_worker_id}")
print(f"connections: {connections}")
for alias in connections:
print(f"alias: {alias}")
connection = connections[alias]
print(f"connection: {connection}")
settings_dict = connection.creation.get_test_db_clone_settings(str(_worker_id))
print(f"settings_dict: {settings_dict}")
# connection.settings_dict must be updated in place for changes to be
# reflected in django.db.connections. If the following line assigned
# connection.settings_dict = settings_dict, new threads would connect
# to the default database instead of the appropriate clone.
connection.settings_dict.update(settings_dict)
print(f"settings_dict updated")
print(f"connection.close {connection.close}")
print(dir(connection.close))
connection.close()
print(f"connection closed")
Output:
_worker_id after get_lock: 13
connections: <django.db.utils.ConnectionHandler object at 0x7f30e5f42f70>
alias: default
connection: <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e3be0a30>
settings_dict: {'NAME': 'test_circus_13', 'USER': 'circus', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'DISABLE_SERVER_SIDE_CURSORS': True, 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}
settings_dict updated
connection.close <bound method BaseDatabaseWrapper.close of <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e3be0a30>>
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__wrapped__']
connection closed
alias: read_only
connection: <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e0f361c0>
settings_dict: {'NAME': 'test_circus_13', 'USER': 'circus', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}
settings_dict updated
connection.close <bound method BaseDatabaseWrapper.close of <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e0f361c0>>
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__wrapped__']
connection closed
global _worker_id: 0
_worker_id after get_lock: 14
connections: <django.db.utils.ConnectionHandler object at 0x7f30e5f42f70>
alias: default
connection: <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e3be0a30>
settings_dict: {'NAME': 'test_circus_14', 'USER': 'circus', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'DISABLE_SERVER_SIDE_CURSORS': True, 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}
settings_dict updated
connection.close <bound method BaseDatabaseWrapper.close of <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e3be0a30>>
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__wrapped__']
connection closed
alias: read_only
connection: <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e0f361c0>
settings_dict: {'NAME': 'test_circus_14', 'USER': 'circus', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}
settings_dict updated
connection.close <bound method BaseDatabaseWrapper.close of <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e0f361c0>>
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__wrapped__']
connection closed
global _worker_id: 0
_worker_id after get_lock: 15
connections: <django.db.utils.ConnectionHandler object at 0x7f30e5f42f70>
alias: default
connection: <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e3be0a30>
settings_dict: {'NAME': 'test_circus_15', 'USER': 'circus', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'DISABLE_SERVER_SIDE_CURSORS': True, 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}
settings_dict updated
connection.close <bound method BaseDatabaseWrapper.close of <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e3be0a30>>
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__wrapped__']
connection closed
alias: read_only
connection: <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e0f361c0>
settings_dict: {'NAME': 'test_circus_15', 'USER': 'circus', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}
settings_dict updated
connection.close <bound method BaseDatabaseWrapper.close of <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e0f361c0>>
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__wrapped__']
connection closed
global _worker_id: 0
_worker_id after get_lock: 16
connections: <django.db.utils.ConnectionHandler object at 0x7f30e5f42f70>
alias: default
connection: <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e3be0a30>
settings_dict: {'NAME': 'test_circus_16', 'USER': 'circus', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'DISABLE_SERVER_SIDE_CURSORS': True, 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}
settings_dict updated
connection.close <bound method BaseDatabaseWrapper.close of <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e3be0a30>>
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__wrapped__']
connection closed
alias: read_only
connection: <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e0f361c0>
settings_dict: {'NAME': 'test_circus_16', 'USER': 'circus', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': 5432, 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}
settings_dict updated
connection.close <bound method BaseDatabaseWrapper.close of <django.db.backends.postgresql.base.DatabaseWrapper object at 0x7f30e0f361c0>>
['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__func__', '__ge__', '__get__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__wrapped__']
connection closed
I also tried running the following:
sudo strace -p $(ps aux | grep python | awk '{ print $2"," }' | tr -d '\n')
with the following output:
[pid 985147] getpid() = 158
[pid 985147] epoll_wait(4, <unfinished ...>
[pid 982256] <... poll resumed>) = 0 (Timeout)
[pid 982256] wait4(-1, 0x7ffc96be325c, WNOHANG, NULL) = 0
[pid 982256] poll([{fd=6, events=POLLIN|POLLPRI|POLLHUP}, {fd=8, events=POLLIN|POLLPRI|POLLHUP}, {fd=9, events=POLLIN|POLLPRI|POLLHUP}, {fd=13, events=POLLIN|POLLPRI|POLLHUP}, {fd=14, events=POLLIN|POLLPRI|POLLHUP}, {fd=18, events=POLLIN|POLLPRI|POLLHUP}, {fd=19, events=POLLIN|POLLPRI|POLLHUP}], 7, 1000 <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678471, tv_nsec=423823746}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 982254] <... poll resumed>) = 0 (Timeout)
[pid 982254] wait4(-1, 0x7ffcdd48638c, WNOHANG, NULL) = 0
[pid 982254] poll([{fd=6, events=POLLIN|POLLPRI|POLLHUP}, {fd=8, events=POLLIN|POLLPRI|POLLHUP}, {fd=9, events=POLLIN|POLLPRI|POLLHUP}, {fd=13, events=POLLIN|POLLPRI|POLLHUP}, {fd=14, events=POLLIN|POLLPRI|POLLHUP}, {fd=18, events=POLLIN|POLLPRI|POLLHUP}, {fd=19, events=POLLIN|POLLPRI|POLLHUP}], 7, 1000 <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678471, tv_nsec=524078208}, FUTEX_BITSET_MATCH_ANY) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678471, tv_nsec=624362319}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 982249] <... poll resumed>) = 0 (Timeout)
[pid 982249] wait4(-1, 0x7ffe2bd77fcc, WNOHANG, NULL) = 0
[pid 982249] poll([{fd=6, events=POLLIN|POLLPRI|POLLHUP}, {fd=8, events=POLLIN|POLLPRI|POLLHUP}, {fd=9, events=POLLIN|POLLPRI|POLLHUP}, {fd=13, events=POLLIN|POLLPRI|POLLHUP}, {fd=14, events=POLLIN|POLLPRI|POLLHUP}, {fd=18, events=POLLIN|POLLPRI|POLLHUP}, {fd=19, events=POLLIN|POLLPRI|POLLHUP}], 7, 1000 <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678471, tv_nsec=724715131}, FUTEX_BITSET_MATCH_ANY) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678471, tv_nsec=825005903}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 983968] <... select resumed>) = 0 (Timeout)
[pid 983968] select(4, [3], [], [], {tv_sec=1, tv_usec=0} <unfinished ...>
[pid 983964] <... select resumed>) = 0 (Timeout)
[pid 983964] select(4, [3], [], [], {tv_sec=1, tv_usec=0} <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678471, tv_nsec=925222087}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 984141] <... select resumed>) = 0 (Timeout)
[pid 984141] select(4, [3], [], [], {tv_sec=1, tv_usec=0} <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678472, tv_nsec=25510800}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 980978] <... poll resumed>) = 0 (Timeout)
[pid 980978] wait4(-1, 0x7ffe132a570c, WNOHANG, NULL) = 0
[pid 980978] poll([{fd=6, events=POLLIN|POLLPRI|POLLHUP}], 1, 1000 <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678472, tv_nsec=125792844}, FUTEX_BITSET_MATCH_ANY) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678472, tv_nsec=226127602}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 985147] <... epoll_wait resumed>[], 64, 884) = 0
[pid 985147] recvfrom(10, 0x7f6359ccd590, 7, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
[pid 985147] getpid() = 158
[pid 985147] epoll_wait(4, <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678472, tv_nsec=326490686}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 982256] <... poll resumed>) = 0 (Timeout)
[pid 982256] wait4(-1, 0x7ffc96be325c, WNOHANG, NULL) = 0
[pid 982256] poll([{fd=6, events=POLLIN|POLLPRI|POLLHUP}, {fd=8, events=POLLIN|POLLPRI|POLLHUP}, {fd=9, events=POLLIN|POLLPRI|POLLHUP}, {fd=13, events=POLLIN|POLLPRI|POLLHUP}, {fd=14, events=POLLIN|POLLPRI|POLLHUP}, {fd=18, events=POLLIN|POLLPRI|POLLHUP}, {fd=19, events=POLLIN|POLLPRI|POLLHUP}], 7, 1000 <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678472, tv_nsec=426696798}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 982254] <... poll resumed>) = 0 (Timeout)
[pid 982254] wait4(-1, 0x7ffcdd48638c, WNOHANG, NULL) = 0
[pid 982254] poll([{fd=6, events=POLLIN|POLLPRI|POLLHUP}, {fd=8, events=POLLIN|POLLPRI|POLLHUP}, {fd=9, events=POLLIN|POLLPRI|POLLHUP}, {fd=13, events=POLLIN|POLLPRI|POLLHUP}, {fd=14, events=POLLIN|POLLPRI|POLLHUP}, {fd=18, events=POLLIN|POLLPRI|POLLHUP}, {fd=19, events=POLLIN|POLLPRI|POLLHUP}], 7, 1000 <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678472, tv_nsec=527065712}, FUTEX_BITSET_MATCH_ANY) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678472, tv_nsec=627329650}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 982249] <... poll resumed>) = 0 (Timeout)
[pid 982249] wait4(-1, 0x7ffe2bd77fcc, WNOHANG, NULL) = 0
[pid 982249] poll([{fd=6, events=POLLIN|POLLPRI|POLLHUP}, {fd=8, events=POLLIN|POLLPRI|POLLHUP}, {fd=9, events=POLLIN|POLLPRI|POLLHUP}, {fd=13, events=POLLIN|POLLPRI|POLLHUP}, {fd=14, events=POLLIN|POLLPRI|POLLHUP}, {fd=18, events=POLLIN|POLLPRI|POLLHUP}, {fd=19, events=POLLIN|POLLPRI|POLLHUP}], 7, 1000 <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678472, tv_nsec=727727563}, FUTEX_BITSET_MATCH_ANY) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678472, tv_nsec=828072068}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 983968] <... select resumed>) = 0 (Timeout)
[pid 983968] select(4, [3], [], [], {tv_sec=1, tv_usec=0} <unfinished ...>
[pid 983964] <... select resumed>) = 0 (Timeout)
[pid 983964] select(4, [3], [], [], {tv_sec=1, tv_usec=0} <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678472, tv_nsec=928364688}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 984141] <... select resumed>) = 0 (Timeout)
[pid 984141] select(4, [3], [], [], {tv_sec=1, tv_usec=0} <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678473, tv_nsec=28646167}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 967405] <... restart_syscall resumed>) = 1
[pid 967405] recvmsg(3, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="U\2\273\0\371\254p(\3\24\4\0\20\0\0\0\0\0\0\24\24\24\24\24\0\0\3\37%\2\0\0", iov_len=4096}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 32
[pid 967405] recvmsg(3, {msg_namelen=0}, 0) = -1 EAGAIN (Resource temporarily unavailable)
[pid 967405] recvmsg(3, {msg_namelen=0}, 0) = -1 EAGAIN (Resource temporarily unavailable)
[pid 967405] recvmsg(3, {msg_namelen=0}, 0) = -1 EAGAIN (Resource temporarily unavailable)
[pid 967405] recvmsg(3, {msg_namelen=0}, 0) = -1 EAGAIN (Resource temporarily unavailable)
[pid 967405] poll([{fd=3, events=POLLIN}, {fd=4, events=POLLIN}, {fd=5, events=POLLIN}, {fd=11, events=POLLIN}, {fd=12, events=POLLIN}, {fd=13, events=POLLIN}], 6, -1 <unfinished ...>
[pid 980978] <... poll resumed>) = 0 (Timeout)
[pid 980978] wait4(-1, 0x7ffe132a570c, WNOHANG, NULL) = 0
[pid 980978] poll([{fd=6, events=POLLIN|POLLPRI|POLLHUP}], 1, 1000 <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678473, tv_nsec=128992530}, FUTEX_BITSET_MATCH_ANY) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678473, tv_nsec=229221571}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 985147] <... epoll_wait resumed>[], 64, 1000) = 0
[pid 985147] recvfrom(10, 0x7f6359ccd590, 7, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
[pid 985147] getpid() = 158
[pid 985147] epoll_wait(4, <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678473, tv_nsec=329462511}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 985147] <... epoll_wait resumed>[], 64, 112) = 0
[pid 985147] openat(AT_FDCWD, "/proc/loadavg", O_RDONLY) = 11
[pid 985147] read(11, "0.28 0.56 0.66 3/3660 160\n", 64) = 26
[pid 985147] close(11) = 0
[pid 985147] recvfrom(8, 0x7f635044db90, 7, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
[pid 985147] getsockopt(8, SOL_SOCKET, SO_SNDBUF, [87040], [4]) = 0
[pid 985147] sendto(8, "\1\0\1\0\0\0!\0<\0(\0\0\10celeryev\20worker.he"..., 409, 0, NULL, 0) = 409
[pid 985147] getpid() = 158
[pid 985147] epoll_wait(4, [], 64, 0) = 0
[pid 985147] recvfrom(7, 0x7f635044d9b0, 7, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
[pid 985147] getpid() = 158
[pid 985147] epoll_wait(4, [{EPOLLIN, {u32=7, u64=21474836487}}], 64, 887) = 1
[pid 985147] recvfrom(7, "\1\0\2\0\0\0-", 7, 0, NULL, NULL) = 7
[pid 985147] recvfrom(7, "\0<\0<\5None2\0\0\0\0\0\0\"\344\0\10celeryev\20wor"..., 45, 0, NULL, NULL) = 45
[pid 985147] recvfrom(7, "\316", 1, 0, NULL, NULL) = 1
[pid 985147] recvfrom(7, "\2\0\2\0\0\0L", 7, 0, NULL, NULL) = 7
[pid 985147] recvfrom(7, "\0<\0\0\0\0\0\0\0\0\1\24\370\0\20application/json\5"..., 76, 0, NULL, NULL) = 76
[pid 985147] recvfrom(7, "\316", 1, 0, NULL, NULL) = 1
[pid 985147] recvfrom(7, "\3\0\2\0\0\1\24", 7, 0, NULL, NULL) = 7
[pid 985147] recvfrom(7, "{\"hostname\": \"celery@339facfd329"..., 276, 0, NULL, NULL) = 276
[pid 985147] recvfrom(7, "\316", 1, 0, NULL, NULL) = 1
[pid 985147] recvfrom(7, 0x7f635044d230, 7, 0, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
[pid 985147] getpid() = 158
[pid 985147] epoll_wait(4, <unfinished ...>
[pid 982256] <... poll resumed>) = 0 (Timeout)
[pid 982256] wait4(-1, 0x7ffc96be325c, WNOHANG, NULL) = 0
[pid 982256] poll([{fd=6, events=POLLIN|POLLPRI|POLLHUP}, {fd=8, events=POLLIN|POLLPRI|POLLHUP}, {fd=9, events=POLLIN|POLLPRI|POLLHUP}, {fd=13, events=POLLIN|POLLPRI|POLLHUP}, {fd=14, events=POLLIN|POLLPRI|POLLHUP}, {fd=18, events=POLLIN|POLLPRI|POLLHUP}, {fd=19, events=POLLIN|POLLPRI|POLLHUP}], 7, 1000 <unfinished ...>
[pid 979822] <... futex resumed>) = -1 ETIMEDOUT (Connection timed out)
[pid 979822] futex(0x56126d175400, FUTEX_WAIT_BITSET_PRIVATE, 0, {tv_sec=678473, tv_nsec=429647821}, FUTEX_BITSET_MATCH_ANY <unfinished ...>
[pid 982254] <... poll resumed>) = 0 (Timeout)
[pid 982254] wait4(-1, 0x7ffcdd48638c, WNOHANG, NULL) = 0
[pid 982254] poll([{fd=6, events=POLLIN|POLLPRI|POLLHUP}, {fd=8, events=POLLIN|POLLPRI|POLLHUP}, {fd=9, events=POLLIN|POLLPRI|POLLHUP}, {fd=13, events=POLLIN|POLLPRI|POLLHUP}, {fd=14, events=POLLIN|POLLPRI|POLLHUP}, {fd=18, events=POLLIN|POLLPRI|POLLHUP}, {fd=19, events=POLLIN|POLLPRI|POLLHUP}], 7, 1000^Cstrace: Process 1696 detached
strace: Process 2157 detached
strace: Process 967405 detached
strace: Process 979822 detached
strace: Process 980978 detached
strace: Process 982249 detached
strace: Process 982254 detached
<detached ...>
strace: Process 982256 detached
strace: Process 983964 detached
strace: Process 983968 detached
strace: Process 984141 detached
strace: Process 985147 detached
strace: Process 1009076 detached
strace: Process 1009130 detached
strace: Process 1009131 detached
strace: Process 1009132 detached
strace: Process 1009133 detached
strace: Process 1009134 detached
strace: Process 1009135 detached
strace: Process 1009136 detached
strace: Process 1009137 detached
strace: Process 1009138 detached
strace: Process 1009139 detached
strace: Process 1009140 detached
strace: Process 1009141 detached
strace: Process 1009142 detached
strace: Process 1009143 detached
strace: Process 1009144 detached
strace: Process 1009145 detached