4
4
#include < sys/socket.h>
5
5
#include < linux/if.h>
6
6
#include < netlink/route/link.h>
7
+ #include < chrono>
7
8
#include " logger.h"
8
9
#include " netmsg.h"
9
10
#include " dbconnector.h"
10
11
#include " producerstatetable.h"
12
+ #include " warm_restart.h"
11
13
#include " teamsync.h"
12
14
13
15
using namespace std ;
16
+ using namespace std ::chrono;
14
17
using namespace swss ;
15
18
16
19
/* Taken from drivers/net/team/team.c */
@@ -22,6 +25,34 @@ TeamSync::TeamSync(DBConnector *db, DBConnector *stateDb, Select *select) :
22
25
m_lagMemberTable(db, APP_LAG_MEMBER_TABLE_NAME),
23
26
m_stateLagTable(stateDb, STATE_LAG_TABLE_NAME)
24
27
{
28
+ WarmStart::initialize (" teamsyncd" , " teamd" );
29
+ WarmStart::checkWarmStart (" teamsyncd" , " teamd" );
30
+ m_warmstart = WarmStart::isWarmStart ();
31
+
32
+ if (m_warmstart)
33
+ {
34
+ m_start_time = steady_clock::now ();
35
+ auto warmRestartIval = WarmStart::getWarmStartTimer (" teamsyncd" , " teamd" );
36
+ m_pending_timeout = warmRestartIval ? warmRestartIval : DEFAULT_WR_PENDING_TIMEOUT;
37
+ m_lagTable.create_temp_view ();
38
+ m_lagMemberTable.create_temp_view ();
39
+ SWSS_LOG_NOTICE (" Starting in warmstart mode" );
40
+ }
41
+ }
42
+
43
+ void TeamSync::periodic ()
44
+ {
45
+ if (m_warmstart)
46
+ {
47
+ auto diff = duration_cast<seconds>(steady_clock::now () - m_start_time);
48
+ if (diff.count () > m_pending_timeout)
49
+ {
50
+ applyState ();
51
+ m_warmstart = false ; // apply state just once
52
+ }
53
+ }
54
+
55
+ doSelectableTask ();
25
56
}
26
57
27
58
void TeamSync::doSelectableTask ()
@@ -44,6 +75,23 @@ void TeamSync::doSelectableTask()
44
75
m_selectablesToRemove.clear ();
45
76
}
46
77
78
+ void TeamSync::applyState ()
79
+ {
80
+ SWSS_LOG_NOTICE (" Applying state" );
81
+
82
+ m_lagTable.apply_temp_view ();
83
+ m_lagMemberTable.apply_temp_view ();
84
+
85
+ for (auto &it: m_stateLagTablePreserved)
86
+ {
87
+ const auto &lagName = it.first ;
88
+ const auto &fvVector = it.second ;
89
+ m_stateLagTable.set (lagName, fvVector);
90
+ }
91
+
92
+ m_stateLagTablePreserved.clear ();
93
+ }
94
+
47
95
void TeamSync::onMsg (int nlmsg_type, struct nl_object *obj)
48
96
{
49
97
struct rtnl_link *link = (struct rtnl_link *)obj;
@@ -90,7 +138,14 @@ void TeamSync::addLag(const string &lagName, int ifindex, bool admin_state,
90
138
fvVector.clear ();
91
139
FieldValueTuple s (" state" , " ok" );
92
140
fvVector.push_back (s);
93
- m_stateLagTable.set (lagName, fvVector);
141
+ if (m_warmstart)
142
+ {
143
+ m_stateLagTablePreserved[lagName] = fvVector;
144
+ }
145
+ else
146
+ {
147
+ m_stateLagTable.set (lagName, fvVector);
148
+ }
94
149
95
150
/* Create the team instance */
96
151
auto sync = make_shared<TeamPortSync>(lagName, ifindex, &m_lagMemberTable);
@@ -116,7 +171,15 @@ void TeamSync::removeLag(const string &lagName)
116
171
if (m_teamSelectables.find (lagName) == m_teamSelectables.end ())
117
172
return ;
118
173
119
- m_stateLagTable.del (lagName);
174
+ if (m_warmstart)
175
+ {
176
+ m_stateLagTablePreserved.erase (lagName);
177
+ }
178
+ else
179
+ {
180
+ m_stateLagTable.del (lagName);
181
+ }
182
+
120
183
m_selectablesToRemove.insert (lagName);
121
184
}
122
185
0 commit comments