[supervisor] Install vanilla package once again, install Python 3 version in Buster container (#5546)
**- Why I did it** We were building a custom version of Supervisor because I had added patches to prevent hangs and crashes if the system clock ever rolled backward. Those changes were merged into the upstream Supervisor repo as of version 3.4.0 (http://supervisord.org/changes.html#id9), therefore, we should be able to simply install the vanilla package via pip. This will also allow us to easily move to Python 3, as Python 3 support was added in version 4.0.0. **- How I did it** - Remove Makefiles and patches for building supervisor package from source - Install Python 3 supervisor package version 4.2.1 in Buster base container - Also install Python 3 version of supervisord-dependent-startup in Buster base container - Debian package installed binary in `/usr/bin/`, but pip package installs in `/usr/local/bin/`, so rather than update all absolute paths, I changed all references to simply call `supervisord` and let the system PATH find the executable to prevent future need for changes just in case we ever need to switch back to build a Debian package, then we won't need to modify these again. - Install Python 2 supervisor package >= 3.4.0 in Stretch and Jessie base containers
This commit is contained in:
parent
2f2b7c2a5c
commit
7bf05f7f4f
@ -1,6 +1,7 @@
|
||||
{
|
||||
"skip_ledd": true,
|
||||
"skip_xcvrd": true,
|
||||
"skip_pcied": true,
|
||||
"skip_psud": true,
|
||||
"skip_syseepromd": true,
|
||||
"skip_thermalctld": true
|
||||
|
@ -50,9 +50,6 @@ RUN apt-get update && \
|
||||
python3-pip \
|
||||
rsyslog \
|
||||
vim-tiny \
|
||||
# Install dependencies of supervisor
|
||||
python-pkg-resources \
|
||||
python-meld3 \
|
||||
# Install dependencies of redis-tools
|
||||
libatomic1 \
|
||||
libjemalloc2 \
|
||||
@ -67,9 +64,6 @@ RUN apt-get update && \
|
||||
# ip and ifconfig utility missing in docker for arm arch
|
||||
iproute2 \
|
||||
net-tools \
|
||||
# for arm arch: Installing j2cli dependency package MarkupSafe from source relies on weeksetuptools and wheel
|
||||
python-setuptools \
|
||||
python-wheel \
|
||||
# for processing/handling json files in bash environment
|
||||
jq \
|
||||
# for sairedis zmq rpc channel
|
||||
@ -90,9 +84,22 @@ RUN dpkg -i redis-tools_6.0.6-1~bpo10+1_amd64.deb || apt-get install -f -y
|
||||
RUN rm redis-tools_6.0.6-1~bpo10+1_amd64.deb
|
||||
{% endif %}
|
||||
|
||||
# Some Python packages require setuptools (or pkg_resources, which is supplied by setuptools)
|
||||
# and some require wheel
|
||||
RUN pip install setuptools==40.8.0
|
||||
RUN pip3 install setuptools==49.6.00
|
||||
RUN pip install wheel
|
||||
RUN pip3 install wheel
|
||||
|
||||
# For templating
|
||||
RUN pip2 install j2cli
|
||||
|
||||
# Install supervisor
|
||||
RUN pip3 install supervisor==4.2.1
|
||||
|
||||
# Add support for supervisord to handle startup dependencies
|
||||
RUN pip3 install supervisord-dependent-startup==1.4.0
|
||||
|
||||
RUN mkdir -p /etc/supervisor /var/log/supervisor
|
||||
|
||||
RUN apt-get -y purge \
|
||||
@ -109,9 +116,6 @@ RUN apt-get -y purge \
|
||||
{{ install_debian_packages(docker_base_buster_debs.split(' ')) }}
|
||||
{%- endif %}
|
||||
|
||||
# Add support for supervisord to handle startup dependencies
|
||||
RUN pip2 install supervisord-dependent-startup==1.4.0
|
||||
|
||||
# Clean up apt
|
||||
# Remove /var/lib/apt/lists/*, could be obsoleted for derived images
|
||||
RUN apt-get clean -y && \
|
||||
|
@ -47,9 +47,8 @@ RUN apt-get update && \
|
||||
python \
|
||||
python-pip \
|
||||
vim-tiny \
|
||||
# Install dependencies of supervisor
|
||||
python-pkg-resources \
|
||||
python-meld3 \
|
||||
# Install redis-tools
|
||||
redis-tools=5:5.0.3-3~bpo9+2 \
|
||||
# common dependencies
|
||||
libpython2.7 \
|
||||
libdaemon0 \
|
||||
@ -58,9 +57,6 @@ RUN apt-get update && \
|
||||
# ip and ifconfig utility missing in docker for arm arch
|
||||
iproute2 \
|
||||
net-tools \
|
||||
# for arm arch: Installing j2cli dependency package MarkupSafe from source relies on weeksetuptools and wheel
|
||||
python-setuptools \
|
||||
python-wheel \
|
||||
# for processing json files in bash environment
|
||||
jq \
|
||||
# for sairedis zmq rpc channel
|
||||
@ -85,9 +81,20 @@ RUN apt-get -y -t stretch-backports install rsyslog
|
||||
RUN rm redis-tools_6.0.6-1~bpo10+1_amd64.deb
|
||||
{% endif %}
|
||||
|
||||
# Some Python packages require setuptools (or pkg_resources, which is supplied by setuptools)
|
||||
# and some require wheel
|
||||
RUN pip install setuptools==40.8.0
|
||||
RUN pip install wheel
|
||||
|
||||
# For templating
|
||||
RUN pip install j2cli
|
||||
|
||||
# Install supervisor
|
||||
RUN pip install supervisor>=3.4.0
|
||||
|
||||
# Add support for supervisord to handle startup dependencies
|
||||
RUN pip install supervisord-dependent-startup==1.4.0
|
||||
|
||||
RUN mkdir -p /etc/supervisor /var/log/supervisor
|
||||
|
||||
RUN apt-get -y purge \
|
||||
@ -104,9 +111,6 @@ RUN apt-get -y purge \
|
||||
{{ install_debian_packages(docker_base_stretch_debs.split(' ')) }}
|
||||
{%- endif %}
|
||||
|
||||
# Add support for supervisord to handle startup dependencies
|
||||
RUN pip install supervisord-dependent-startup==1.4.0
|
||||
|
||||
# Clean up apt
|
||||
# Remove /var/lib/apt/lists/*, could be obsoleted for derived images
|
||||
RUN apt-get clean -y && \
|
||||
|
@ -44,6 +44,7 @@ RUN apt-get -y install \
|
||||
vim-tiny \
|
||||
perl \
|
||||
python \
|
||||
python-pip \
|
||||
rsyslog \
|
||||
less
|
||||
|
||||
@ -51,8 +52,13 @@ COPY ["etc/rsyslog.conf", "/etc/rsyslog.conf"]
|
||||
COPY ["etc/rsyslog.d/*", "/etc/rsyslog.d/"]
|
||||
COPY ["root/.vimrc", "/root/.vimrc"]
|
||||
|
||||
# Install dependencies of supervisor
|
||||
RUN apt-get -y install python-pkg-resources python-meld3
|
||||
# Some Python packages require setuptools (or pkg_resources, which is supplied by setuptools)
|
||||
# and some require wheel
|
||||
RUN pip install setuptools==40.8.0
|
||||
RUN pip install wheel
|
||||
|
||||
# Install supervisor
|
||||
RUN pip install supervisor>=3.4.0
|
||||
|
||||
RUN mkdir -p /etc/supervisor
|
||||
RUN mkdir -p /var/log/supervisor
|
||||
|
@ -19,4 +19,4 @@ RUN mv /deps/basic_router /usr/sbin/basic_router
|
||||
COPY ["start.sh", "/usr/bin/"]
|
||||
COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -55,7 +55,7 @@ if [[ $DATABASE_TYPE == "chassisdb" ]]; then
|
||||
# generate all redis server supervisord configuration file
|
||||
sonic-cfggen -j $db_cfg_file_tmp -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf
|
||||
rm $db_cfg_file_tmp
|
||||
exec /usr/bin/supervisord
|
||||
exec supervisord
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@ -79,4 +79,4 @@ else
|
||||
fi
|
||||
rm $db_cfg_file_tmp
|
||||
|
||||
exec /usr/bin/supervisord
|
||||
exec supervisord
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -21,4 +21,4 @@ chmod +x /usr/bin/wait_for_intf.sh
|
||||
# The docker container should start this script as PID 1, so now that supervisord is
|
||||
# properly configured, we exec supervisord so that it runs as PID 1 for the
|
||||
# duration of the container's lifetime
|
||||
exec /usr/bin/supervisord
|
||||
exec supervisord
|
||||
|
@ -66,4 +66,4 @@ chmod 0755 /usr/sbin/bgp-unisolate
|
||||
mkdir -p /var/sonic
|
||||
echo "# Config files managed by sonic-config-engine" > /var/sonic/config_status
|
||||
|
||||
exec /usr/bin/supervisord
|
||||
exec supervisord
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -27,4 +27,4 @@ COPY ["daemons", "/etc/quagga/"]
|
||||
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
|
||||
COPY ["critical_processes", "/etc/supervisor"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -36,4 +36,4 @@ COPY ["*.j2", "/usr/share/sonic/templates/"]
|
||||
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
|
||||
COPY ["critical_processes", "/etc/supervisor"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -31,4 +31,4 @@ RUN apt-get clean -y && \
|
||||
apt-get autoremove -y && \
|
||||
rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -2,4 +2,4 @@
|
||||
#Generate supervisord.conf based on device metadata
|
||||
mkdir -p /etc/supervisor/conf.d/
|
||||
sonic-cfggen -d -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf
|
||||
exec /usr/bin/supervisord
|
||||
exec supervisord
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -35,5 +35,4 @@ COPY ["critical_processes", "/etc/supervisor"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -25,4 +25,4 @@ if [ "$VLAN" != "" ]; then
|
||||
cp /usr/share/sonic/templates/ndppd.conf /etc/supervisor/conf.d/
|
||||
fi
|
||||
|
||||
exec /usr/bin/supervisord
|
||||
exec supervisord
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -40,4 +40,4 @@ if [ $HAVE_FANCONTROL_CONF -eq 1 ]; then
|
||||
/bin/cp -f $FANCONTROL_CONF_FILE /etc/
|
||||
fi
|
||||
|
||||
exec /usr/bin/supervisord
|
||||
exec supervisord
|
||||
|
@ -14,4 +14,4 @@ sonic-cfggen $CFGGEN_PARAMS
|
||||
|
||||
chmod +x /usr/bin/wait_for_link.sh
|
||||
|
||||
exec /usr/bin/supervisord
|
||||
exec supervisord
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -32,4 +32,4 @@ COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
|
||||
COPY ["critical_processes", "/etc/supervisor"]
|
||||
COPY ["port_index_mapper.py", "/usr/bin"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -76,4 +76,4 @@ COPY ["critical_processes", "/etc/supervisor"]
|
||||
# Although exposing ports is not needed for host net mode, keep it for possible bridge mode
|
||||
EXPOSE 161/udp 162/udp
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -36,4 +36,4 @@ RUN apt-get remove -y g++ python-dev
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -25,4 +25,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
|
||||
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
|
||||
COPY ["critical_processes", "/etc/supervisor"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -28,4 +28,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
|
||||
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
|
||||
COPY ["critical_processes", "/etc/supervisor"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -27,4 +27,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
|
||||
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
|
||||
COPY ["critical_processes", "/etc/supervisor"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env python
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import getopt
|
||||
import os
|
||||
@ -7,7 +7,6 @@ import sys
|
||||
import syslog
|
||||
|
||||
import swsssdk
|
||||
|
||||
from supervisor import childutils
|
||||
|
||||
# Each line of this file should specify either one critical process or one
|
||||
@ -27,7 +26,7 @@ def get_critical_group_and_process_list():
|
||||
critical_process_list = []
|
||||
|
||||
with open(CRITICAL_PROCESSES_FILE, 'r') as file:
|
||||
for line in file:
|
||||
for line in file:
|
||||
line_info = line.strip(' \n').split(':')
|
||||
if len(line_info) != 2:
|
||||
syslog.syslog(syslog.LOG_ERR, "Syntax of the line {} in critical_processes file is incorrect. Exiting...".format(line))
|
||||
@ -86,7 +85,7 @@ def main(argv):
|
||||
syslog.syslog(syslog.LOG_ERR, "Unable to retrieve features table from Config DB. Exiting...")
|
||||
sys.exit(2)
|
||||
|
||||
if not features_table.has_key(container_name):
|
||||
if container_name not in features_table:
|
||||
syslog.syslog(syslog.LOG_ERR, "Unable to retrieve feature '{}'. Exiting...".format(container_name))
|
||||
sys.exit(3)
|
||||
|
||||
|
@ -34,5 +34,4 @@ COPY ["profile.ini", "portmap.ini", "/etc/sai/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /deps
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -49,5 +49,4 @@ RUN apt-get update \
|
||||
|
||||
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -36,5 +36,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -33,4 +33,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -48,4 +48,4 @@ RUN apt-get update \
|
||||
|
||||
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -32,4 +32,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -27,4 +27,4 @@ COPY ["portmap.ini", "profile.ini", "/etc/sai/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf deps
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -48,4 +48,4 @@ RUN apt-get update \
|
||||
|
||||
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -32,4 +32,4 @@ COPY ["profile.ini", "/etc/ssw/AS7512/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -48,4 +48,4 @@ RUN apt-get update \
|
||||
|
||||
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -34,4 +34,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -48,4 +48,4 @@ RUN apt-get update \
|
||||
|
||||
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -30,4 +30,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -50,4 +50,4 @@ RUN apt-get update \
|
||||
|
||||
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -30,4 +30,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -48,4 +48,4 @@ RUN apt-get update \
|
||||
|
||||
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -34,4 +34,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -48,4 +48,4 @@ RUN apt-get update \
|
||||
|
||||
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -34,4 +34,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -48,4 +48,4 @@ RUN apt-get update \
|
||||
|
||||
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -30,5 +30,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -44,4 +44,4 @@ COPY ["sai_2700.xml", "/usr/share/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -62,4 +62,4 @@ RUN apt-get clean -y && \
|
||||
apt-get autoremove -y && \
|
||||
rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -39,4 +39,4 @@ COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
|
||||
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
|
||||
COPY ["critical_processes", "/etc/supervisor/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -48,4 +48,4 @@ RUN apt-get update \
|
||||
|
||||
COPY ["ptf_nn_agent.conf", "/etc/supervisor/conf.d/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -43,4 +43,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -31,4 +31,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -170,4 +170,4 @@ RUN mkdir -p /var/warmboot/teamd
|
||||
ENV PLATFORM=x86_64-kvm_x86_64-r0
|
||||
ENV HWSKU=Force10-S6000
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -31,4 +31,4 @@ COPY ["critical_processes", "/etc/supervisor/"]
|
||||
RUN apt-get clean -y; apt-get autoclean -y; apt-get autoremove -y
|
||||
RUN rm -rf /debs
|
||||
|
||||
ENTRYPOINT ["/usr/bin/supervisord"]
|
||||
ENTRYPOINT ["supervisord"]
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -3,7 +3,6 @@
|
||||
DOCKER_BASE_BUSTER = docker-base-buster.gz
|
||||
$(DOCKER_BASE_BUSTER)_PATH = $(DOCKERS_PATH)/docker-base-buster
|
||||
|
||||
$(DOCKER_BASE_BUSTER)_DEPENDS += $(SUPERVISOR)
|
||||
$(DOCKER_BASE_BUSTER)_DEPENDS += $(SOCAT)
|
||||
|
||||
GDB = gdb
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
DOCKER_BASE_STRETCH = docker-base-stretch.gz
|
||||
$(DOCKER_BASE_STRETCH)_PATH = $(DOCKERS_PATH)/docker-base-stretch
|
||||
$(DOCKER_BASE_STRETCH)_DEPENDS += $(SUPERVISOR)
|
||||
$(DOCKER_BASE_STRETCH)_DEPENDS += $(SOCAT)
|
||||
|
||||
GDB = gdb
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
DOCKER_BASE = docker-base.gz
|
||||
$(DOCKER_BASE)_PATH = $(DOCKERS_PATH)/docker-base
|
||||
$(DOCKER_BASE)_DEPENDS += $(SUPERVISOR)
|
||||
$(DOCKER_BASE)_DEPENDS += $(BASH)
|
||||
$(DOCKER_BASE)_DEPENDS += $(SOCAT)
|
||||
|
||||
|
@ -1,10 +0,0 @@
|
||||
|
||||
SPATH := $($(SUPERVISOR)_SRC_PATH)
|
||||
DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/supervisor.mk rules/supervisor.dep
|
||||
DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST)
|
||||
DEP_FILES += $(shell git ls-files $(SPATH))
|
||||
|
||||
$(SUPERVISOR)_CACHE_MODE := GIT_CONTENT_SHA
|
||||
$(SUPERVISOR)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST)
|
||||
$(SUPERVISOR)_DEP_FILES := $(DEP_FILES)
|
||||
|
@ -1,9 +0,0 @@
|
||||
# supervisor package
|
||||
|
||||
SUPERVISOR_VERSION = 3.3.3
|
||||
|
||||
export SUPERVISOR_VERSION
|
||||
|
||||
SUPERVISOR = python-supervisor_$(SUPERVISOR_VERSION)-1_all.deb
|
||||
$(SUPERVISOR)_SRC_PATH = $(SRC_PATH)/supervisor
|
||||
SONIC_MAKE_DEBS += $(SUPERVISOR)
|
@ -382,9 +382,6 @@ RUN pip3 install "lxml==4.6.1"
|
||||
# For sonic-platform-common testing
|
||||
RUN pip3 install redis
|
||||
|
||||
# For supervisor build
|
||||
RUN apt-get install python-meld3
|
||||
|
||||
# For vs image build
|
||||
RUN pip2 install pexpect==4.6.0
|
||||
RUN pip3 install pexpect==4.8.0
|
||||
|
@ -300,9 +300,6 @@ RUN pip install --force-reinstall --upgrade "jinja2>=2.10"
|
||||
# For templating (requiring jinja2)
|
||||
RUN pip install j2cli==0.3.10
|
||||
|
||||
# For supervisor build
|
||||
RUN pip install meld3 mock
|
||||
|
||||
# For vs image build
|
||||
RUN pip install pexpect==4.6.0
|
||||
|
||||
|
@ -365,9 +365,6 @@ RUN pip3 install "lxml==4.6.1"
|
||||
# For sonic-platform-common testing
|
||||
RUN pip3 install redis
|
||||
|
||||
# For supervisor build
|
||||
RUN pip2 install meld3 mock
|
||||
|
||||
# For vs image build
|
||||
RUN pip2 install pexpect==4.6.0
|
||||
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
@ -4,7 +4,7 @@ logfile_backups=2
|
||||
nodaemon=true
|
||||
|
||||
[eventlistener:dependent-startup]
|
||||
command=python -m supervisord_dependent_startup
|
||||
command=python3 -m supervisord_dependent_startup
|
||||
autostart=true
|
||||
autorestart=unexpected
|
||||
startretries=0
|
||||
|
4
src/supervisor/.gitignore
vendored
4
src/supervisor/.gitignore
vendored
@ -1,4 +0,0 @@
|
||||
*
|
||||
!.gitignore
|
||||
!Makefile
|
||||
!patch/
|
@ -1,33 +0,0 @@
|
||||
.ONESHELL:
|
||||
SHELL = /bin/bash
|
||||
.SHELLFLAGS += -e
|
||||
|
||||
MAIN_TARGET = python-supervisor_$(SUPERVISOR_VERSION)-1_all.deb
|
||||
|
||||
$(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% :
|
||||
# Remove any stale files
|
||||
rm -rf ./supervisor
|
||||
|
||||
# Clone supervisor repo
|
||||
git clone https://github.com/Supervisor/supervisor.git
|
||||
pushd ./supervisor
|
||||
|
||||
# Reset HEAD to the commit of the proper tag
|
||||
# NOTE: Using "git checkout <tag_name>" here detaches our HEAD,
|
||||
# which stg doesn't like, so we use this method instead
|
||||
git reset --hard $(SUPERVISOR_VERSION)
|
||||
|
||||
# Apply patches
|
||||
stg init
|
||||
stg import -s ../patch/series
|
||||
|
||||
ifneq (,$(filter $(CONFIGURED_ARCH), armhf arm64))
|
||||
stg import -s ../patch/series-armhf
|
||||
endif
|
||||
|
||||
# Build Python and Debian package
|
||||
python setup.py --command-packages=stdeb.command bdist_deb
|
||||
popd
|
||||
|
||||
# Move the newly-built .deb packages to the destination directory
|
||||
mv ./supervisor/deb_dist/$* $(DEST)/
|
@ -1,304 +0,0 @@
|
||||
From 5b56519e68e866662d9fd9a6681b6b47d6b5fcdb Mon Sep 17 00:00:00 2001
|
||||
From: Joe LeVeque <jolevequ@microsoft.com>
|
||||
Date: Thu, 28 Feb 2019 01:43:54 +0000
|
||||
Subject: [PATCH] Prevent excessive hanging and crashes if system clock rolls
|
||||
backward
|
||||
|
||||
---
|
||||
supervisor/process.py | 36 ++++++
|
||||
supervisor/tests/test_process.py | 183 +++++++++++++++++++++++++++++++
|
||||
2 files changed, 219 insertions(+)
|
||||
|
||||
diff --git a/supervisor/process.py b/supervisor/process.py
|
||||
index f9ddcd9..5f73e6b 100644
|
||||
--- a/supervisor/process.py
|
||||
+++ b/supervisor/process.py
|
||||
@@ -347,6 +347,28 @@ class Subprocess:
|
||||
options.write(2, "supervisor: child process was not spawned\n")
|
||||
options._exit(127) # exit process with code for spawn failure
|
||||
|
||||
+ def _check_and_adjust_for_system_clock_rollback(self, test_time):
|
||||
+ """
|
||||
+ Check if system clock has rolled backward beyond test_time. If so, set
|
||||
+ affected timestamps to test_time.
|
||||
+ """
|
||||
+ if self.state == ProcessStates.STARTING:
|
||||
+ if test_time < self.laststart:
|
||||
+ self.laststart = test_time;
|
||||
+ if self.delay > 0 and test_time < (self.delay - self.config.startsecs):
|
||||
+ self.delay = test_time + self.config.startsecs
|
||||
+ elif self.state == ProcessStates.RUNNING:
|
||||
+ if test_time > self.laststart and test_time < (self.laststart + self.config.startsecs):
|
||||
+ self.laststart = test_time - self.config.startsecs
|
||||
+ elif self.state == ProcessStates.STOPPING:
|
||||
+ if test_time < self.laststopreport:
|
||||
+ self.laststopreport = test_time;
|
||||
+ if self.delay > 0 and test_time < (self.delay - self.config.stopwaitsecs):
|
||||
+ self.delay = test_time + self.config.stopwaitsecs
|
||||
+ elif self.state == ProcessStates.BACKOFF:
|
||||
+ if self.delay > 0 and test_time < (self.delay - self.backoff):
|
||||
+ self.delay = test_time + self.backoff
|
||||
+
|
||||
def stop(self):
|
||||
""" Administrative stop """
|
||||
self.administrative_stop = True
|
||||
@@ -357,6 +379,9 @@ class Subprocess:
|
||||
""" Log a 'waiting for x to stop' message with throttling. """
|
||||
if self.state == ProcessStates.STOPPING:
|
||||
now = time.time()
|
||||
+
|
||||
+ self._check_and_adjust_for_system_clock_rollback(now)
|
||||
+
|
||||
if now > (self.laststopreport + 2): # every 2 seconds
|
||||
self.config.options.logger.info(
|
||||
'waiting for %s to stop' % self.config.name)
|
||||
@@ -487,6 +512,9 @@ class Subprocess:
|
||||
es, msg = decode_wait_status(sts)
|
||||
|
||||
now = time.time()
|
||||
+
|
||||
+ self._check_and_adjust_for_system_clock_rollback(now)
|
||||
+
|
||||
self.laststop = now
|
||||
processname = self.config.name
|
||||
|
||||
@@ -586,6 +614,8 @@ class Subprocess:
|
||||
now = time.time()
|
||||
state = self.state
|
||||
|
||||
+ self._check_and_adjust_for_system_clock_rollback(now)
|
||||
+
|
||||
logger = self.config.options.logger
|
||||
|
||||
if self.config.options.mood > SupervisorStates.RESTARTING:
|
||||
@@ -805,6 +835,12 @@ class EventListenerPool(ProcessGroupBase):
|
||||
if dispatch_capable:
|
||||
if self.dispatch_throttle:
|
||||
now = time.time()
|
||||
+
|
||||
+ if now < self.last_dispatch:
|
||||
+ # The system clock appears to have moved backward
|
||||
+ # Reset self.last_dispatch accordingly
|
||||
+ self.last_dispatch = now;
|
||||
+
|
||||
if now - self.last_dispatch < self.dispatch_throttle:
|
||||
return
|
||||
self.dispatch()
|
||||
diff --git a/supervisor/tests/test_process.py b/supervisor/tests/test_process.py
|
||||
index 7f9bab2..6808f60 100644
|
||||
--- a/supervisor/tests/test_process.py
|
||||
+++ b/supervisor/tests/test_process.py
|
||||
@@ -736,6 +736,40 @@ class SubprocessTests(unittest.TestCase):
|
||||
instance.stop_report()
|
||||
self.assertEqual(len(options.logger.data), 1) # throttled
|
||||
|
||||
+ def test_stop_report_laststopreport_in_future(self):
|
||||
+ future_time = time.time() + 3600 # 1 hour into the future
|
||||
+ options = DummyOptions()
|
||||
+ config = DummyPConfig(options, 'test', '/test')
|
||||
+ instance = self._makeOne(config)
|
||||
+ instance.pid = 11
|
||||
+ dispatcher = DummyDispatcher(writable=True)
|
||||
+ instance.dispatchers = {'foo':dispatcher}
|
||||
+ from supervisor.states import ProcessStates
|
||||
+ instance.state = ProcessStates.STOPPING
|
||||
+ instance.laststopreport = future_time
|
||||
+
|
||||
+ # This iteration of stop_report() should reset instance.laststopreport
|
||||
+ # to the current time
|
||||
+ instance.stop_report()
|
||||
+
|
||||
+ # No logging should have taken place
|
||||
+ self.assertEqual(len(options.logger.data), 0)
|
||||
+
|
||||
+ # Ensure instance.laststopreport has rolled backward
|
||||
+ self.assertTrue(instance.laststopreport < future_time)
|
||||
+
|
||||
+ # Sleep for 2 seconds
|
||||
+ time.sleep(2)
|
||||
+
|
||||
+ # This iteration of stop_report() should actaully trigger the report
|
||||
+ instance.stop_report()
|
||||
+
|
||||
+ self.assertEqual(len(options.logger.data), 1)
|
||||
+ self.assertEqual(options.logger.data[0], 'waiting for test to stop')
|
||||
+ self.assertNotEqual(instance.laststopreport, 0)
|
||||
+ instance.stop_report()
|
||||
+ self.assertEqual(len(options.logger.data), 1) # throttled
|
||||
+
|
||||
def test_give_up(self):
|
||||
options = DummyOptions()
|
||||
config = DummyPConfig(options, 'test', '/test')
|
||||
@@ -1105,6 +1139,43 @@ class SubprocessTests(unittest.TestCase):
|
||||
self.assertEqual(event.__class__, events.ProcessStateBackoffEvent)
|
||||
self.assertEqual(event.from_state, ProcessStates.STARTING)
|
||||
|
||||
+ # This tests the case where the process has stayed alive longer than
|
||||
+ # startsecs (i.e., long enough to enter the RUNNING state), however the
|
||||
+ # system clock has since rolled backward such that the current time is
|
||||
+ # greater than laststart but less than startsecs.
|
||||
+ def test_finish_running_state_exited_too_quickly_due_to_clock_rollback(self):
|
||||
+ options = DummyOptions()
|
||||
+ config = DummyPConfig(options, 'notthere', '/notthere',
|
||||
+ stdout_logfile='/tmp/foo', startsecs=10)
|
||||
+ instance = self._makeOne(config)
|
||||
+ instance.config.options.pidhistory[123] = instance
|
||||
+ pipes = {'stdout':'','stderr':''}
|
||||
+ instance.pipes = pipes
|
||||
+ instance.config.exitcodes =[-1]
|
||||
+ instance.laststart = time.time()
|
||||
+ from supervisor.states import ProcessStates
|
||||
+ from supervisor import events
|
||||
+ instance.state = ProcessStates.RUNNING
|
||||
+ L = []
|
||||
+ events.subscribe(events.ProcessStateEvent, lambda x: L.append(x))
|
||||
+ instance.pid = 123
|
||||
+ instance.finish(123, 1)
|
||||
+ self.assertFalse(instance.killing)
|
||||
+ self.assertEqual(instance.pid, 0)
|
||||
+ self.assertEqual(options.parent_pipes_closed, pipes)
|
||||
+ self.assertEqual(instance.pipes, {})
|
||||
+ self.assertEqual(instance.dispatchers, {})
|
||||
+ self.assertEqual(options.logger.data[0],
|
||||
+ 'exited: notthere (terminated by SIGHUP; expected)')
|
||||
+ self.assertEqual(instance.exitstatus, -1)
|
||||
+ self.assertEqual(len(L), 1)
|
||||
+ event = L[0]
|
||||
+ self.assertEqual(event.__class__,
|
||||
+ events.ProcessStateExitedEvent)
|
||||
+ self.assertEqual(event.expected, True)
|
||||
+ self.assertEqual(event.extra_values, [('expected', True), ('pid', 123)])
|
||||
+ self.assertEqual(event.from_state, ProcessStates.RUNNING)
|
||||
+
|
||||
def test_finish_running_state_laststart_in_future(self):
|
||||
options = DummyOptions()
|
||||
config = DummyPConfig(options, 'notthere', '/notthere',
|
||||
@@ -1402,6 +1473,92 @@ class SubprocessTests(unittest.TestCase):
|
||||
event = L[0]
|
||||
self.assertEqual(event.__class__, events.ProcessStateRunningEvent)
|
||||
|
||||
+ def test_transition_starting_to_running_laststart_in_future(self):
|
||||
+ from supervisor import events
|
||||
+ L = []
|
||||
+ events.subscribe(events.ProcessStateEvent, lambda x: L.append(x))
|
||||
+ from supervisor.states import ProcessStates
|
||||
+
|
||||
+ future_time = time.time() + 3600 # 1 hour into the future
|
||||
+ options = DummyOptions()
|
||||
+ test_startsecs = 2
|
||||
+
|
||||
+ # this should go from STARTING to RUNNING via transition()
|
||||
+ pconfig = DummyPConfig(options, 'process', 'process','/bin/process',
|
||||
+ startsecs=test_startsecs)
|
||||
+ process = self._makeOne(pconfig)
|
||||
+ process.backoff = 1
|
||||
+ process.delay = 1
|
||||
+ process.system_stop = False
|
||||
+ process.laststart = future_time
|
||||
+ process.pid = 1
|
||||
+ process.stdout_buffer = 'abc'
|
||||
+ process.stderr_buffer = 'def'
|
||||
+ process.state = ProcessStates.STARTING
|
||||
+
|
||||
+ # This iteration of transition() should reset process.laststart
|
||||
+ # to the current time
|
||||
+ process.transition()
|
||||
+
|
||||
+ # Process state should still be STARTING
|
||||
+ self.assertEqual(process.state, ProcessStates.STARTING)
|
||||
+
|
||||
+ # Ensure process.laststart has rolled backward
|
||||
+ self.assertTrue(process.laststart < future_time)
|
||||
+
|
||||
+ # Sleep for (startsecs + 1)
|
||||
+ time.sleep(test_startsecs + 1)
|
||||
+
|
||||
+ # This iteration of transition() should actaully trigger the state
|
||||
+ # transition to RUNNING
|
||||
+ process.transition()
|
||||
+
|
||||
+ # this implies RUNNING
|
||||
+ self.assertEqual(process.backoff, 0)
|
||||
+ self.assertEqual(process.delay, 0)
|
||||
+ self.assertFalse(process.system_stop)
|
||||
+ self.assertEqual(process.state, ProcessStates.RUNNING)
|
||||
+ self.assertEqual(options.logger.data[0],
|
||||
+ 'success: process entered RUNNING state, process has '
|
||||
+ 'stayed up for > than {} seconds (startsecs)'.format(test_startsecs))
|
||||
+ self.assertEqual(len(L), 1)
|
||||
+ event = L[0]
|
||||
+ self.assertEqual(event.__class__, events.ProcessStateRunningEvent)
|
||||
+
|
||||
+ def test_transition_backoff_to_starting_delay_in_future(self):
|
||||
+ from supervisor import events
|
||||
+ L = []
|
||||
+ events.subscribe(events.ProcessStateEvent, lambda x: L.append(x))
|
||||
+ from supervisor.states import ProcessStates, SupervisorStates
|
||||
+
|
||||
+ future_time = time.time() + 3600 # 1 hour into the future
|
||||
+ options = DummyOptions()
|
||||
+
|
||||
+ pconfig = DummyPConfig(options, 'process', 'process','/bin/process')
|
||||
+ process = self._makeOne(pconfig)
|
||||
+ process.laststart = 1
|
||||
+ process.delay = future_time
|
||||
+ process.backoff = 0
|
||||
+ process.state = ProcessStates.BACKOFF
|
||||
+
|
||||
+ # This iteration of transition() should reset process.delay
|
||||
+ # to the current time
|
||||
+ process.transition()
|
||||
+
|
||||
+ # Process state should still be BACKOFF
|
||||
+ self.assertEqual(process.state, ProcessStates.BACKOFF)
|
||||
+
|
||||
+ # Ensure process.delay has rolled backward
|
||||
+ self.assertTrue(process.delay < future_time)
|
||||
+
|
||||
+ # This iteration of transition() should actaully trigger the state
|
||||
+ # transition to STARTING
|
||||
+ process.transition()
|
||||
+
|
||||
+ self.assertEqual(process.state, ProcessStates.STARTING)
|
||||
+ self.assertEqual(len(L), 1)
|
||||
+ self.assertEqual(L[0].__class__, events.ProcessStateStartingEvent)
|
||||
+
|
||||
def test_transition_backoff_to_fatal(self):
|
||||
from supervisor import events
|
||||
L = []
|
||||
@@ -2033,6 +2190,32 @@ class EventListenerPoolTests(ProcessGroupBaseTests):
|
||||
self.assertEqual(process1.listener_state, EventListenerStates.BUSY)
|
||||
self.assertEqual(process1.event, event)
|
||||
|
||||
+ def test_transition_event_proc_running_with_dispatch_throttle_last_dispatch_in_future(self):
|
||||
+ future_time = time.time() + 3600 # 1 hour into the future
|
||||
+ options = DummyOptions()
|
||||
+ from supervisor.states import ProcessStates
|
||||
+ pconfig1 = DummyPConfig(options, 'process1', 'process1','/bin/process1')
|
||||
+ process1 = DummyProcess(pconfig1, state=ProcessStates.RUNNING)
|
||||
+ gconfig = DummyPGroupConfig(options, pconfigs=[pconfig1])
|
||||
+ pool = self._makeOne(gconfig)
|
||||
+ pool.dispatch_throttle = 5
|
||||
+ pool.last_dispatch = future_time
|
||||
+ pool.processes = {'process1': process1}
|
||||
+ event = DummyEvent()
|
||||
+ from supervisor.states import EventListenerStates
|
||||
+ process1.listener_state = EventListenerStates.READY
|
||||
+ class DummyGroup:
|
||||
+ config = gconfig
|
||||
+ process1.group = DummyGroup
|
||||
+ pool._acceptEvent(event)
|
||||
+ pool.transition()
|
||||
+
|
||||
+ self.assertEqual(process1.transitioned, True)
|
||||
+ self.assertEqual(pool.event_buffer, [event]) # not popped
|
||||
+
|
||||
+ # Ensure pool.last_dispatch has been rolled backward
|
||||
+ self.assertTrue(pool.last_dispatch < future_time)
|
||||
+
|
||||
def test__dispatchEvent_notready(self):
|
||||
options = DummyOptions()
|
||||
from supervisor.states import ProcessStates
|
||||
--
|
||||
2.17.1
|
||||
|
@ -1,16 +0,0 @@
|
||||
diff --git a/supervisor/tests/test_options.py b/supervisor/tests/test_options.py
|
||||
--- a/supervisor/tests/test_options.py
|
||||
+++ b/supervisor/tests/test_options.py
|
||||
@@ -1514,9 +1514,9 @@
|
||||
os.read(innie, 0) # we can read it while its open
|
||||
os.write(outie, 'foo') # we can write to it while its open
|
||||
instance.close_fd(innie)
|
||||
- self.assertRaises(OSError, os.read, innie, 0)
|
||||
+ #self.assertRaises(OSError, os.read, innie, 0)
|
||||
instance.close_fd(outie)
|
||||
- self.assertRaises(OSError, os.write, outie, 'foo')
|
||||
+ #self.assertRaises(OSError, os.write, outie, 'foo')
|
||||
|
||||
@patch('os.close', Mock(side_effect=OSError))
|
||||
def test_close_fd_ignores_oserror(self):
|
||||
|
@ -1,2 +0,0 @@
|
||||
# This series applies on GIT commit 34b690aea8cf7572d73765c95c54a83261d69aad
|
||||
0001-Prevent-excessive-hanging-and-crashes-if-system-cloc.patch
|
@ -1,2 +0,0 @@
|
||||
# This series applies on GIT commit 34b690aea8cf7572d73765c95c54a83261d69aad
|
||||
0002-oserror-armhf-assert.patch
|
Loading…
Reference in New Issue
Block a user