1
1
#! /bin/bash
2
2
3
- start () {
3
+ SERVICE=" swss"
4
+ PEER=" syncd"
5
+ DEBUGLOG=" /tmp/swss-syncd-debug.log"
6
+ LOCKFILE=" /tmp/swss-syncd-lock"
7
+
8
+ function debug()
9
+ {
10
+ /bin/echo ` date` " - $1 " >> ${DEBUGLOG}
11
+ }
12
+
13
+ function lock_service_state_change()
14
+ {
15
+ debug " Locking ${LOCKFILE} from ${SERVICE} service"
16
+
17
+ exec {LOCKFD}> ${LOCKFILE}
18
+ /usr/bin/flock -x ${LOCKFD}
19
+ trap " /usr/bin/flock -u ${LOCKFD} " 0 2 3 15
20
+
21
+ debug " Locked ${LOCKFILE} (${LOCKFD} ) from ${SERVICE} service"
22
+ }
23
+
24
+ function unlock_service_state_change()
25
+ {
26
+ debug " Unlocking ${LOCKFILE} (${LOCKFD} ) from ${SERVICE} service"
27
+ /usr/bin/flock -u ${LOCKFD}
28
+ }
29
+
30
+ function check_warm_boot()
31
+ {
32
+ SYSTEM_WARM_START=` /usr/bin/redis-cli -n 4 hget " WARM_RESTART|system" enable`
33
+ SERVICE_WARM_START=` /usr/bin/redis-cli -n 4 hget " WARM_RESTART|${SERVICE} " enable`
34
+ if [[ x" $SYSTEM_WARM_START " == x" true" ]] || [[ x" $SERVICE_WARM_START " == x" true" ]]; then
35
+ WARM_BOOT=" true"
36
+ else
37
+ WARM_BOOT=" false"
38
+ fi
39
+ }
40
+
41
+ function validate_restart_count()
42
+ {
43
+ if [[ x" $WARM_BOOT " == x" true" ]]; then
44
+ RESTART_COUNT=` /usr/bin/redis-cli -n 6 hget " WARM_RESTART_TABLE|orchagent" restart_count`
45
+ # We have to make sure db data has not been flushed.
46
+ if [[ -z " $RESTART_COUNT " ]]; then
47
+ WARM_BOOT=" false"
48
+ fi
49
+ fi
50
+ }
51
+
52
+ function wait_for_database_service()
53
+ {
4
54
# Wait for redis server start before database clean
5
55
until [[ $( /usr/bin/docker exec database redis-cli ping | grep -c PONG) -gt 0 ]];
6
56
do sleep 1;
@@ -10,66 +60,58 @@ start() {
10
60
until [[ $( /usr/bin/docker exec database redis-cli -n 4 GET " CONFIG_DB_INITIALIZED" ) ]];
11
61
do sleep 1;
12
62
done
63
+ }
13
64
14
- SYSTEM_WARM_START=` /usr/bin/docker exec database redis-cli -n 4 HGET " WARM_RESTART|system" enable`
15
- SWSS_WARM_START=` /usr/bin/docker exec database redis-cli -n 4 HGET " WARM_RESTART|swss" enable`
16
- # if warm start enabled, just do swss docker start.
17
- # Don't flush DB or try to start other modules.
18
- if [[ " $SYSTEM_WARM_START " == " true" ]] || [[ " $SWSS_WARM_START " == " true" ]]; then
19
- RESTART_COUNT=` redis-cli -n 6 hget " WARM_RESTART_TABLE|orchagent" restart_count`
20
- # We have to make sure db data has not been flushed.
21
- if [[ -n " $RESTART_COUNT " ]]; then
22
- /usr/bin/swss.sh start
23
- /usr/bin/swss.sh attach
24
- return 0
25
- fi
26
- fi
65
+ start () {
66
+ debug " Starting ${SERVICE} service..."
67
+
68
+ lock_service_state_change
69
+
70
+ wait_for_database_service
71
+ check_warm_boot
72
+ validate_restart_count
27
73
28
- # Flush DB
29
- /usr/bin/docker exec database redis-cli -n 0 FLUSHDB
30
- /usr/bin/docker exec database redis-cli -n 1 FLUSHDB
31
- /usr/bin/docker exec database redis-cli -n 2 FLUSHDB
32
- /usr/bin/docker exec database redis-cli -n 5 FLUSHDB
33
- /usr/bin/docker exec database redis-cli -n 6 FLUSHDB
34
-
35
- # platform specific tasks
36
- if [ x$sonic_asic_platform == x' mellanox' ]; then
37
- FAST_BOOT=1
38
- /usr/bin/mst start
39
- /usr/bin/mlnx-fw-upgrade.sh
40
- /etc/init.d/sxdkernel start
41
- /sbin/modprobe i2c-dev
42
- /etc/mlnx/mlnx-hw-management start
43
- elif [ x$sonic_asic_platform == x' cavium' ]; then
44
- /etc/init.d/xpnet.sh start
74
+ debug " Warm boot flag: ${SERVICE} ${WARM_BOOT} ."
75
+
76
+ # Don't flush DB during warm boot
77
+ if [[ x" $WARM_BOOT " != x" true" ]]; then
78
+ /usr/bin/docker exec database redis-cli -n 0 FLUSHDB
79
+ /usr/bin/docker exec database redis-cli -n 2 FLUSHDB
80
+ /usr/bin/docker exec database redis-cli -n 5 FLUSHDB
81
+ /usr/bin/docker exec database redis-cli -n 6 FLUSHDB
45
82
fi
46
83
47
- # start swss and syncd docker
48
- /usr/bin/swss.sh start
49
- /usr/bin/syncd.sh start
50
- /usr/bin/swss.sh attach
84
+ # start service docker
85
+ /usr/bin/${SERVICE} .sh start
86
+ debug " Started ${SERVICE} service..."
87
+
88
+ # Unlock has to happen before reaching out to peer service
89
+ unlock_service_state_change
90
+
91
+ if [[ x" $WARM_BOOT " != x" true" ]]; then
92
+ /bin/systemctl start ${PEER}
93
+ fi
94
+ /usr/bin/${SERVICE} .sh attach
51
95
}
52
96
53
97
stop () {
54
- /usr/bin/swss.sh stop
98
+ debug " Stopping ${SERVICE} service... "
55
99
56
- SYSTEM_WARM_START=` redis-cli -n 4 hget " WARM_RESTART|system" enable`
57
- SWSS_WARM_START=` redis-cli -n 4 hget " WARM_RESTART|swss" enable`
58
- # if warm start enabled, just stop swss docker, then return
59
- if [[ " $SYSTEM_WARM_START " == " true" ]] || [[ " $SWSS_WARM_START " == " true" ]]; then
60
- return 0
61
- fi
100
+ [[ -f ${LOCKFILE} ]] || /usr/bin/touch ${LOCKFILE}
101
+
102
+ lock_service_state_change
103
+ check_warm_boot
104
+ debug " Warm boot flag: ${SERVICE} ${WARM_BOOT} ."
105
+
106
+ /usr/bin/${SERVICE} .sh stop
107
+ debug " Stopped ${SERVICE} service..."
62
108
63
- /usr/bin/syncd.sh stop
109
+ # Unlock has to happen before reaching out to peer service
110
+ unlock_service_state_change
64
111
65
- # platform specific tasks
66
- if [ x$sonic_asic_platform == x' mellanox' ]; then
67
- /etc/mlnx/mlnx-hw-management stop
68
- /etc/init.d/sxdkernel stop
69
- /usr/bin/mst stop
70
- elif [ x$sonic_asic_platform == x' cavium' ]; then
71
- /etc/init.d/xpnet.sh stop
72
- /etc/init.d/xpnet.sh start
112
+ # if warm start enabled or peer lock exists, don't stop peer service docker
113
+ if [[ x" $WARM_BOOT " != x" true" ]]; then
114
+ /bin/systemctl stop ${PEER}
73
115
fi
74
116
}
75
117
0 commit comments