42ae02b665
When Type=simple, systemd will consider the service activated immediately after specified in ExecStart process is started. If there is downstream service depending on the state prepared in ExecStart, there will be race condition. For example, issue #390. In this case, database.service calls database.sh, which calls docker run or docker start -a to start database container. However, systemd considers database.service successfully started at the time database.sh begins, not after docker run finishes. As database.service is consider started, bgp.service can be started. The redis database, which bgp service depends on, might or might not have been started at this time point. To fix this issue (and still keeping the functionality to monitor docker status with systemd), we split the ExecStart process into an ExecStartPre part and an ExecStart part. docker run is splitted into docker run -d then docker attach , while docker start -a is splitted into docker start and then docker attach. In this way, we make sure the downstream services are blocked until container is successfully started.
42 lines
1.3 KiB
Django/Jinja
42 lines
1.3 KiB
Django/Jinja
[Unit]
|
|
Description=switch state service
|
|
Requires=database.service
|
|
After=database.service
|
|
|
|
[Service]
|
|
User=root
|
|
# Wait for redis server start before database clean
|
|
ExecStartPre=/bin/bash -c "while true; do if [ \"$(/usr/bin/docker exec database redis-cli ping)\" == \"PONG\" ]; then break; fi; sleep 1; done"
|
|
ExecStartPre=/usr/bin/docker exec database redis-cli -n 0 FLUSHDB
|
|
ExecStartPre=/usr/bin/docker exec database redis-cli -n 1 FLUSHDB
|
|
ExecStartPre=/usr/bin/docker exec database redis-cli -n 2 FLUSHDB
|
|
|
|
{% if sonic_asic_platform == 'mellanox' %}
|
|
ExecStartPre=/etc/init.d/sxdkernel start
|
|
ExecStartPre=/usr/bin/mst start
|
|
ExecStartPre=/etc/mlnx/msn2700 start
|
|
{% elif sonic_asic_platform == 'cavium' %}
|
|
ExecStartPre=-/etc/init.d/xpnet.sh stop
|
|
ExecStartPre=/etc/init.d/xpnet.sh start
|
|
{% endif %}
|
|
|
|
ExecStartPre=/usr/bin/{{docker_container_name}}.sh start
|
|
ExecStartPre=/usr/bin/syncd.sh start
|
|
ExecStart=/usr/bin/{{docker_container_name}}.sh attach
|
|
|
|
ExecStop=/usr/bin/{{docker_container_name}}.sh stop
|
|
ExecStopPost=/usr/bin/syncd.sh stop
|
|
|
|
{% if sonic_asic_platform == 'mellanox' %}
|
|
ExecStopPost=/etc/mlnx/msn2700 stop
|
|
ExecStopPost=/etc/init.d/sxdkernel stop
|
|
ExecStopPost=/usr/bin/mst stop
|
|
{% elif sonic_asic_platform == 'cavium' %}
|
|
ExecStopPost=/etc/init.d/xpnet.sh stop
|
|
ExecStopPost=/etc/init.d/xpnet.sh start
|
|
{% endif %}
|
|
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|