Skip to content

Commit

Permalink
[bgpd]: Check zebra is ready to connect when starting bgpd (#6478)
Browse files Browse the repository at this point in the history
Fix #5026

There is a race condition between zebra server accepts connections and bgpd tries to connect. Bgpd has a chance to try to connect before zebra is ready. In this scenario, bgpd will try again after 10 seconds and operate as normal within these 10 seconds. As a consequence, whatever bgpd tries to sent to zebra will be missing in the 10 seconds. To avoid such a scenario, bgpd should start after zebra is ready to accept connections.
  • Loading branch information
shi-su authored Jan 19, 2021
1 parent 52afc80 commit afee1a8
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 1 deletion.
1 change: 1 addition & 0 deletions dockers/docker-fpm-frr/Dockerfile.j2
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ COPY ["TSB", "/usr/bin/TSB"]
COPY ["TSC", "/usr/bin/TSC"]
COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["critical_processes", "/etc/supervisor"]
COPY ["bgpd.sh", "/usr/bin/"]
RUN chmod a+x /usr/bin/TSA && \
chmod a+x /usr/bin/TSB && \
chmod a+x /usr/bin/TSC
Expand Down
33 changes: 33 additions & 0 deletions dockers/docker-fpm-frr/bgpd.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/usr/bin/env bash

addr="127.0.0.1"
port=2601

function help()
{
echo "This script aims to ensure zebra is ready to accept connections before starting bgpd"
echo "Usage: $0 [options] [bgpd options]"
echo "Options:"
echo " -a Zebra address"
echo " -o Zebra port"
exit 1
}

while getopts ":a:o:h" opt; do
case "${opt}" in
h) help
;;
a) addr=${OPTARG}
;;
o) port=${OPTARG}
;;
esac
done
shift $((OPTIND-1))

timeout 5s bash -c -- "until </dev/tcp/${addr}/${port}; do sleep 0.1;done"
if [ "$?" != "0" ]; then
logger -p error "Error: zebra is not ready to accept connections"
fi

exec /usr/lib/frr/bgpd "$@"
2 changes: 1 addition & 1 deletion dockers/docker-fpm-frr/frr/supervisord/supervisord.conf.j2
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ dependent_startup=true
dependent_startup_wait_for=zebra:running

[program:bgpd]
command=/usr/lib/frr/bgpd -A 127.0.0.1 -M snmp
command=/usr/bin/bgpd.sh -A 127.0.0.1 -M snmp
priority=5
stopsignal=KILL
autostart=false
Expand Down

0 comments on commit afee1a8

Please sign in to comment.