@@ -24,13 +24,34 @@ TeamSync::TeamSync(DBConnector *db, DBConnector *stateDb, Select *select) :
24
24
{
25
25
}
26
26
27
+ void TeamSync::doSelectableTask ()
28
+ {
29
+ /* Start to track the new team instances */
30
+ for (auto s : m_selectablesToAdd)
31
+ {
32
+ m_select->addSelectable (m_teamSelectables[s].get ());
33
+ }
34
+
35
+ m_selectablesToAdd.clear ();
36
+
37
+ /* No longer track the deprecated team instances */
38
+ for (auto s : m_selectablesToRemove)
39
+ {
40
+ m_select->removeSelectable (m_teamSelectables[s].get ());
41
+ m_teamSelectables.erase (s);
42
+ }
43
+
44
+ m_selectablesToRemove.clear ();
45
+ }
46
+
27
47
void TeamSync::onMsg (int nlmsg_type, struct nl_object *obj)
28
48
{
29
49
struct rtnl_link *link = (struct rtnl_link *)obj;
30
50
if ((nlmsg_type != RTM_NEWLINK) && (nlmsg_type != RTM_DELLINK))
31
51
return ;
32
52
33
53
string lagName = rtnl_link_get_name (link );
54
+
34
55
/* Listens to LAG messages */
35
56
char *type = rtnl_link_get_type (link );
36
57
if (!type || (strcmp (type, TEAM_DRV_NAME) != 0 ))
@@ -63,35 +84,40 @@ void TeamSync::addLag(const string &lagName, int ifindex, bool admin_state,
63
84
lagName.c_str (), admin_state ? " up" : " down" , oper_state ? " up" : " down" );
64
85
65
86
/* Return when the team instance has already been tracked */
66
- if (m_teamPorts .find (lagName) != m_teamPorts .end ())
87
+ if (m_teamSelectables .find (lagName) != m_teamSelectables .end ())
67
88
return ;
68
89
69
- /* Start track the team instance */
70
- auto sync = make_shared<TeamPortSync>(lagName, ifindex, &m_lagMemberTable);
71
- m_select->addSelectable (sync .get ());
72
- m_teamPorts[lagName] = sync ;
73
-
74
90
fvVector.clear ();
75
91
FieldValueTuple s (" state" , " ok" );
76
92
fvVector.push_back (s);
77
93
m_stateLagTable.set (lagName, fvVector);
94
+
95
+ /* Create the team instance */
96
+ auto sync = make_shared<TeamPortSync>(lagName, ifindex, &m_lagMemberTable);
97
+ m_teamSelectables[lagName] = sync ;
98
+ m_selectablesToAdd.insert (lagName);
78
99
}
79
100
80
101
void TeamSync::removeLag (const string &lagName)
81
102
{
103
+ /* Delete all members */
104
+ auto selectable = m_teamSelectables[lagName];
105
+ for (auto it : selectable->m_lagMembers )
106
+ {
107
+ m_lagMemberTable.del (lagName + " :" + it.first );
108
+ }
109
+
82
110
/* Delete the LAG */
83
111
m_lagTable.del (lagName);
84
112
85
113
SWSS_LOG_INFO (" Remove %s" , lagName.c_str ());
86
114
87
115
/* Return when the team instance hasn't been tracked before */
88
- if (m_teamPorts .find (lagName) == m_teamPorts .end ())
116
+ if (m_teamSelectables .find (lagName) == m_teamSelectables .end ())
89
117
return ;
90
118
91
- /* No longer track the current team instance */
92
- m_select->removeSelectable (m_teamPorts[lagName].get ());
93
- m_teamPorts.erase (lagName);
94
119
m_stateLagTable.del (lagName);
120
+ m_selectablesToRemove.insert (lagName);
95
121
}
96
122
97
123
const struct team_change_handler TeamSync::TeamPortSync::gPortChangeHandler = {
@@ -114,7 +140,8 @@ TeamSync::TeamPortSync::TeamPortSync(const string &lagName, int ifindex,
114
140
}
115
141
116
142
int err = team_init (m_team, ifindex);
117
- if (err) {
143
+ if (err)
144
+ {
118
145
team_free (m_team);
119
146
m_team = NULL ;
120
147
SWSS_LOG_ERROR (" Unable to init team socket" );
@@ -123,7 +150,8 @@ TeamSync::TeamPortSync::TeamPortSync(const string &lagName, int ifindex,
123
150
}
124
151
125
152
err = team_change_handler_register (m_team, &gPortChangeHandler , this );
126
- if (err) {
153
+ if (err)
154
+ {
127
155
team_free (m_team);
128
156
m_team = NULL ;
129
157
SWSS_LOG_ERROR (" Unable to register port change event" );
0 commit comments