Skip to content

Commit

Permalink
[MultiDB] add mutidb warmboot support - restoring database
Browse files Browse the repository at this point in the history
  • Loading branch information
dzhangalibaba committed Dec 4, 2020
1 parent fdb51e7 commit 4302c61
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 0 deletions.
1 change: 1 addition & 0 deletions dockers/docker-database/Dockerfile.j2
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,6 @@ COPY ["files/supervisor-proc-exit-listener", "/usr/bin"]
COPY ["files/sysctl-net.conf", "/etc/sysctl.d/"]
COPY ["critical_processes", "/etc/supervisor"]
COPY ["files/update_chassisdb_config", "/usr/local/bin/"]
COPY ["flush_unused_database", "/usr/local/bin/"]

ENTRYPOINT ["/usr/local/bin/docker-database-init.sh"]
14 changes: 14 additions & 0 deletions dockers/docker-database/docker-database-init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,18 @@ else
fi
rm $db_cfg_file_tmp

# flush unused database after warmboot restoration
DUMPFILE=/var/lib/redis/dump.rdb
redis_inst_list=`/usr/bin/python -c "import swsssdk; print(' '.join(swsssdk.SonicDBConfig.get_instancelist().keys()))"`
for inst in $redis_inst_list
do
mkdir -p /var/lib/$inst
if [[ -f $DUMPFILE ]]; then
# copy warmboot rdb file into each new instance location
cp $DUMPFILE /var/lib/$inst/dump.rdb
else
echo -n > /var/lib/$inst/dump.rdb
fi
done

exec /usr/local/bin/supervisord
26 changes: 26 additions & 0 deletions dockers/docker-database/flush_unused_database
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/usr/bin/python
import swsssdk
import redis
import subprocess
import time

output = subprocess.check_output('sonic-db-cli PING', stderr=subprocess.STDOUT, shell=True)
while('PONG' not in output):
time.sleep(1)

instlists = swsssdk.SonicDBConfig.get_instancelist()
for instname, v in instlists.items():
insthost = v['hostname']
instsocket = v['unix_socket_path']

dblists = swsssdk.SonicDBConfig.get_dblist()
for dbname in dblists:
dbid = swsssdk.SonicDBConfig.get_dbid(dbname)
dbinst = swsssdk.SonicDBConfig.get_instancename(dbname)

# this DB is on current instance, skip flush
if dbinst == instname:
continue

r = redis.Redis(host=insthost, unix_socket_path=instsocket, db=dbid)
r.flushdb()
8 changes: 8 additions & 0 deletions dockers/docker-database/supervisord.conf.j2
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,11 @@ stdout_logfile=syslog
stderr_logfile=syslog
{% endfor %}
{% endif %}

[program:flushdb]
command=/bin/bash -c "sleep 300 && /usr/local/bin/flush_unused_database"
priority=3
autostart=true
autorestart=false
stdout_logfile=syslog
stderr_logfile=syslog

0 comments on commit 4302c61

Please sign in to comment.