From 4302c61645055ded7f851ad4b99bc1a54ab40818 Mon Sep 17 00:00:00 2001 From: dzhangalibaba Date: Fri, 4 Dec 2020 09:47:37 +0000 Subject: [PATCH] [MultiDB] add mutidb warmboot support - restoring database --- dockers/docker-database/Dockerfile.j2 | 1 + .../docker-database/docker-database-init.sh | 14 ++++++++++ dockers/docker-database/flush_unused_database | 26 +++++++++++++++++++ dockers/docker-database/supervisord.conf.j2 | 8 ++++++ 4 files changed, 49 insertions(+) create mode 100755 dockers/docker-database/flush_unused_database diff --git a/dockers/docker-database/Dockerfile.j2 b/dockers/docker-database/Dockerfile.j2 index 84f485e4fe83..aef22e24379c 100644 --- a/dockers/docker-database/Dockerfile.j2 +++ b/dockers/docker-database/Dockerfile.j2 @@ -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"] diff --git a/dockers/docker-database/docker-database-init.sh b/dockers/docker-database/docker-database-init.sh index 30a65af89b7f..8482043f6543 100755 --- a/dockers/docker-database/docker-database-init.sh +++ b/dockers/docker-database/docker-database-init.sh @@ -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 diff --git a/dockers/docker-database/flush_unused_database b/dockers/docker-database/flush_unused_database new file mode 100755 index 000000000000..16605e82aba5 --- /dev/null +++ b/dockers/docker-database/flush_unused_database @@ -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() diff --git a/dockers/docker-database/supervisord.conf.j2 b/dockers/docker-database/supervisord.conf.j2 index 97b8a4822530..a1d10f78bd1e 100644 --- a/dockers/docker-database/supervisord.conf.j2 +++ b/dockers/docker-database/supervisord.conf.j2 @@ -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