
Swift servers can now be seamlessly reloaded by sending them a SIGUSR1 (instead of a SIGHUP). The server forks off a synchronized child to wait to close the old listen socket(s) until the new server has started up and bound its listen socket(s). The new server is exec'ed from the old one so its PID doesn't change. This makes Systemd happier, so a ReloadExec= stanza can now be used. The seamless part means that incoming connections will alwyas get accepted either by the old server or the new one. This eliminates client-perceived "downtime" during server reloads, while allowing the server to fully reload, re-reading configuration, becoming a fresh Python interpreter instance, etc. The SO_REUSEPORT socket option has already been getting used, so nothing had to change there. This patch also includes a non-invasive fix for a current eventlet bug; see https://github.com/eventlet/eventlet/pull/590 That bug prevents a SIGHUP "reload" from properly servicing existing requests before old worker processes close sockets and exit. The existing probtests missed this, but the new ones, in this patch, caught it. New probe tests cover both old SIGHUP "reload" behavior as well as the new SIGUSR1 seamless reload behavior. Change-Id: I3e5229d2fb04be67e53533ff65b0870038accbb7
163 lines
4.7 KiB
INI
163 lines
4.7 KiB
INI
[tox]
|
|
envlist = py37,py27,pep8
|
|
minversion = 2.3.2
|
|
skipsdist = True
|
|
|
|
[testenv]
|
|
usedevelop = True
|
|
install_command = pip install -U {opts} {packages}
|
|
setenv = VIRTUAL_ENV={envdir}
|
|
NOSE_WITH_COVERAGE=1
|
|
NOSE_COVER_BRANCHES=1
|
|
NOSE_COVER_HTML_DIR={toxinidir}/cover
|
|
deps =
|
|
-c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
|
|
-r{toxinidir}/requirements.txt
|
|
-r{toxinidir}/test-requirements.txt
|
|
commands = find {envdir} ( -type f -o -type l ) -name "*.py[co]" -delete
|
|
find {envdir} -type d -name "__pycache__" -delete
|
|
nosetests {posargs:test/unit}
|
|
whitelist_externals = find
|
|
rm
|
|
passenv = SWIFT_* *_proxy
|
|
|
|
[testenv:cover]
|
|
setenv = VIRTUAL_ENV={envdir}
|
|
NOSE_WITH_COVERAGE=1
|
|
NOSE_COVER_BRANCHES=1
|
|
NOSE_COVER_HTML=1
|
|
NOSE_COVER_HTML_DIR={toxinidir}/cover
|
|
|
|
[testenv:pep8]
|
|
basepython = python2.7
|
|
commands =
|
|
flake8 {posargs:swift test doc setup.py}
|
|
flake8 --filename=swift* bin
|
|
python ./setup.py check --restructuredtext --strict
|
|
bandit -c bandit.yaml -r swift -n 5
|
|
./.manpages {posargs}
|
|
|
|
[testenv:py3pep8]
|
|
basepython = python3
|
|
commands = {[testenv:pep8]commands}
|
|
|
|
[testenv:func]
|
|
basepython = python2.7
|
|
commands = ./.functests {posargs}
|
|
|
|
[testenv:func-py3]
|
|
basepython = python3
|
|
commands = ./.functests {posargs}
|
|
|
|
[testenv:func-ec-py3]
|
|
basepython = python3
|
|
commands = ./.functests {posargs}
|
|
setenv = SWIFT_TEST_IN_PROCESS=1
|
|
SWIFT_TEST_IN_PROCESS_CONF_LOADER=ec
|
|
|
|
[testenv:func-s3api-py3]
|
|
basepython = python3
|
|
commands = ./.functests {posargs}
|
|
setenv = SWIFT_TEST_IN_PROCESS=1
|
|
SWIFT_TEST_IN_PROCESS_CONF_LOADER=s3api
|
|
|
|
[testenv:func-encryption-py3]
|
|
basepython = python3
|
|
commands = ./.functests {posargs}
|
|
setenv = SWIFT_TEST_IN_PROCESS=1
|
|
SWIFT_TEST_IN_PROCESS_CONF_LOADER=encryption
|
|
|
|
[testenv:func-domain-remap-staticweb-py3]
|
|
basepython = python3
|
|
commands = ./.functests {posargs}
|
|
setenv = SWIFT_TEST_IN_PROCESS=1
|
|
SWIFT_TEST_IN_PROCESS_CONF_LOADER=domain_remap_staticweb
|
|
|
|
[testenv:func-encryption]
|
|
commands = ./.functests {posargs}
|
|
setenv = SWIFT_TEST_IN_PROCESS=1
|
|
SWIFT_TEST_IN_PROCESS_CONF_LOADER=encryption
|
|
|
|
[testenv:func-domain-remap-staticweb]
|
|
commands = ./.functests {posargs}
|
|
setenv = SWIFT_TEST_IN_PROCESS=1
|
|
SWIFT_TEST_IN_PROCESS_CONF_LOADER=domain_remap_staticweb
|
|
|
|
[testenv:func-ec]
|
|
commands = ./.functests {posargs}
|
|
setenv = SWIFT_TEST_IN_PROCESS=1
|
|
SWIFT_TEST_IN_PROCESS_CONF_LOADER=ec
|
|
|
|
[testenv:func-s3api]
|
|
commands = ./.functests {posargs}
|
|
setenv = SWIFT_TEST_IN_PROCESS=1
|
|
SWIFT_TEST_IN_PROCESS_CONF_LOADER=s3api
|
|
|
|
[testenv:venv]
|
|
commands = {posargs}
|
|
|
|
[testenv:docs]
|
|
basepython = python3
|
|
deps = -r{toxinidir}/doc/requirements.txt
|
|
commands = sphinx-build -W -b html doc/source doc/build/html
|
|
|
|
[testenv:api-ref]
|
|
# This environment is called from CI scripts to test and publish
|
|
# the API Ref to docs.openstack.org.
|
|
basepython = python3
|
|
deps = -r{toxinidir}/doc/requirements.txt
|
|
commands =
|
|
rm -rf api-ref/build
|
|
sphinx-build -W -b html -d api-ref/build/doctrees api-ref/source api-ref/build/html
|
|
|
|
[testenv:bandit]
|
|
deps = -r{toxinidir}/test-requirements.txt
|
|
commands = bandit -c bandit.yaml -r swift -n 5
|
|
|
|
[flake8]
|
|
# it's not a bug that we aren't using all of hacking, ignore:
|
|
# H101: Use TODO(NAME)
|
|
# H202: assertRaises Exception too broad
|
|
# H301: one import per line
|
|
# H306: imports not in alphabetical order (time, os)
|
|
# H404: multi line docstring should start without a leading new line
|
|
# H405: multi line docstring summary not separated with an empty line
|
|
# H501: Do not use self.__dict__ for string formatting
|
|
ignore = H101,H202,H301,H306,H404,H405,H501
|
|
exclude = .venv,.tox,dist,*egg
|
|
filename = *.py,bin/*
|
|
show-source = True
|
|
|
|
[testenv:bindep]
|
|
# Do not install any requirements. We want this to be fast and work even if
|
|
# system dependencies are missing, since it's used to tell you what system
|
|
# dependencies are missing! This also means that bindep must be installed
|
|
# separately, outside of the requirements files.
|
|
skip_install = True
|
|
deps = bindep
|
|
commands = bindep test
|
|
|
|
[testenv:releasenotes]
|
|
basepython = python3
|
|
deps = -r{toxinidir}/doc/requirements.txt
|
|
commands = sphinx-build -a -W -E -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html
|
|
|
|
[testenv:lower-constraints]
|
|
# FIXME(dhellmann): We'll want to uncomment this
|
|
# when the full test suite works with python 3.
|
|
# basepython = python3
|
|
basepython = python2.7
|
|
deps =
|
|
-c{toxinidir}/lower-constraints.txt
|
|
-r{toxinidir}/test-requirements.txt
|
|
-r{toxinidir}/requirements.txt
|
|
|
|
[testenv:pdf-docs]
|
|
basepython = python3
|
|
deps = {[testenv:docs]deps}
|
|
whitelist_externals =
|
|
make
|
|
commands =
|
|
sphinx-build -W -b latex doc/source doc/build/pdf
|
|
make -C doc/build/pdf
|