Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

multi-DB Part 1: create multiple Redis DB instances based on CONFIG at /etc/sonic/database_config.json #2182

Merged
merged 13 commits into from
Aug 28, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions dockers/docker-database/Dockerfile.j2
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ RUN apt-get clean -y && \
s/^client-output-buffer-limit pubsub [0-9]+mb [0-9]+mb [0-9]+/client-output-buffer-limit pubsub 0 0 0/ \
' /etc/redis/redis.conf

COPY ["supervisord.conf", "/etc/supervisor/conf.d/"]
COPY ["supervisord.conf.j2", "/usr/share/sonic/templates/"]
COPY ["docker-database-init.sh", "/usr/local/bin/"]
COPY ["ping_pong_db_insts", "/usr/local/bin/"]
COPY ["database_config.json", "/etc/default/sonic-db/"]

ENTRYPOINT ["/usr/bin/supervisord"]
Copy link
Collaborator

@qiluo-msft qiluo-msft Dec 6, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

supervisord [](start = 22, length = 11)

supervisord [](start = 22, length = 11)

We prefer keep supervisord as entrypoint. You may refer other docker containers for example with a start.sh. #Closed

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the database_config file is static as you said, then we can use supervisord as Entrypoint, and we can generate supervisord.conf during compiling/building

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keeping supervisord as entrypoint is a good practice. Even with database_config.json, it shall be possilble to generate redis-server.sh from redis-server.sh.j2 within db-docker-init.sh(dockers/docker-database/docker_init.sh), and let redis-server.sh handle the dynamic db instances case?

[program:db-docker-init.sh]
command=/usr/bin/db-docker-init.sh
priority=2
autostart=true
autorestart=false
stdout_logfile=syslog
stderr_logfile=syslog

[program:redis-server.sh]
command=/usr/bin/redis-server.sh
priority=3
autostart=false
autorestart=false
stdout_logfile=syslog
stderr_logfile=syslog

ENTRYPOINT ["/usr/local/bin/docker-database-init.sh"]
43 changes: 43 additions & 0 deletions dockers/docker-database/database_config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
lguohan marked this conversation as resolved.
Show resolved Hide resolved
"INSTANCES": {
"redis":{
"port": 6379,
"socket": "/var/run/redis/redis.sock"
}
},
"DATABASES" : {
"APPL_DB" : {
"id" : 0,
"instance" : "redis"
},
"ASIC_DB" : {
"id" : 1,
"instance" : "redis"
},
"COUNTERS_DB" : {
"id" : 2,
"instance" : "redis"
},
"LOGLEVEL_DB" : {
"id" : 3,
"instance" : "redis"
},
"CONFIG_DB" : {
"id" : 4,
"instance" : "redis"
},
"PFC_WD_DB" : {
"id" : 5,
"instance" : "redis"
},
"FLEX_COUNTER_DB" : {
"id" : 5,
"instance" : "redis"
},
"STATE_DB" : {
"id" : 6,
"instance" : "redis"
}
},
"VERSION" : "1.0"
}
14 changes: 14 additions & 0 deletions dockers/docker-database/docker-database-init.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env bash

mkdir -p /var/run/redis/sonic-db
if [ -f /etc/sonic/database_config.json ]; then
cp /etc/sonic/database_config.json /var/run/redis/sonic-db
else
cp /etc/default/sonic-db/database_config.json /var/run/redis/sonic-db
fi

mkdir -p /etc/supervisor/conf.d/
# generate all redis server supervisord configuration file
sonic-cfggen -j /var/run/redis/sonic-db/database_config.json -t /usr/share/sonic/templates/supervisord.conf.j2 > /etc/supervisor/conf.d/supervisord.conf

exec /usr/bin/supervisord
40 changes: 40 additions & 0 deletions dockers/docker-database/ping_pong_db_insts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/usr/bin/python
import json
import os
import subprocess
import time
import syslog

def ping_redis(cmd):
output = ''
while True:
try:
output = subprocess.check_output(cmd, shell=True)
except subprocess.CalledProcessError as e:
syslog.syslog(syslog.LOG_ERR, 'ping redis failed, cmd : {}'.format(cmd))

if 'PONG' in output:
break
syslog.syslog(syslog.LOG_ERR, 'ping response : {}'.format(output))
time.sleep(1)

database_config_file = "/var/run/redis/sonic-db/database_config.json"

data = {}
while True:
if os.path.isfile(database_config_file):
with open(database_config_file, "r") as read_file:
data = json.load(read_file)
break
time.sleep(1)
syslog.syslog(syslog.LOG_ERR, 'config file {} does not exist right now'.format(database_config_file))

while True:
if 'INSTANCES' in data:
for inst in data["INSTANCES"]:
port = data["INSTANCES"][inst]["port"]
cmd = "redis-cli -p " + str(port) + " ping"
ping_redis(cmd)
break
time.sleep(1)
syslog.syslog(syslog.LOG_ERR, 'config file {} does not have INSTANCES'.format(database_config_file))
21 changes: 0 additions & 21 deletions dockers/docker-database/supervisord.conf

This file was deleted.

24 changes: 24 additions & 0 deletions dockers/docker-database/supervisord.conf.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
[supervisord]
logfile_maxbytes=1MB
logfile_backups=2
nodaemon=true

[program:rsyslogd]
command=/bin/bash -c "rm -f /var/run/rsyslogd.pid && /usr/sbin/rsyslogd -n"
priority=1
autostart=true
autorestart=false
stdout_logfile=syslog
stderr_logfile=syslog

{% if INSTANCES %}
{% for redis_inst, redis_items in INSTANCES.iteritems() %}
[program: {{ redis_inst }}]
command=/bin/bash -c "{ [[ -s /var/lib/{{ redis_inst }}/dump.rdb ]] || rm -f /var/lib/{{ redis_inst }}/dump.rdb; } && mkdir -p /var/lib/{{ redis_inst }} && exec /usr/bin/redis-server /etc/redis/redis.conf --port {{ redis_items['port'] }} --unixsocket {{ redis_items['socket'] }} --pidfile /var/run/redis/{{ redis_inst }}.pid --dir /var/lib/{{ redis_inst }}"
priority=2
autostart=true
autorestart=false
stdout_logfile=syslog
stderr_logfile=syslog
{% endfor %}
{% endif %}
1 change: 1 addition & 0 deletions files/build_templates/database.service.j2
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
Description=Database container
Requires=docker.service
After=docker.service
After=rc-local.service
lguohan marked this conversation as resolved.
Show resolved Hide resolved

[Service]
User=root
Expand Down
10 changes: 6 additions & 4 deletions files/build_templates/docker_image_ctl.j2
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,7 @@ function postStartAction()
{
{%- if docker_container_name == "database" %}
# Wait until redis starts
REDIS_SOCK="/var/run/redis/redis.sock"
until [[ $(/usr/bin/docker exec database redis-cli -s $REDIS_SOCK ping | grep -c PONG) -gt 0 ]]; do
sleep 1;
done
/usr/bin/docker exec database ping_pong_db_insts
if [[ ("$BOOT_TYPE" == "warm" || "$BOOT_TYPE" == "fastfast") && -f $WARM_DIR/dump.rdb ]]; then
rm -f $WARM_DIR/dump.rdb
else
Expand Down Expand Up @@ -163,6 +160,11 @@ start() {

{%- if docker_container_name == "database" %}
echo "Creating new {{docker_container_name}} container"
# if database_config exists in old_config, use it; otherwise use the default one in new image
if [ -f /etc/sonic/old_config/database_config.json ]; then
echo "Use database_config.json from old system..."
mv /etc/sonic/old_config/database_config.json /etc/sonic/
fi
lguohan marked this conversation as resolved.
Show resolved Hide resolved
{%- else %}
echo "Creating new {{docker_container_name}} container with HWSKU $HWSKU"
{%- endif %}
Expand Down