in pkg/config/xds/lds.go [110:156]
func (l *LdsManager) setupListeners(listeners []*xdsModel.Listener) {
//Make sure each one has a unique name like "host-port-protocol"
for _, v := range listeners {
v.Name = resolveListenerName(v.Address.SocketAddress.Address, int(v.Address.SocketAddress.Port), v.Protocol.String())
}
laterApplies := make([]func() error, 0, len(listeners))
toRemoveHash := make(map[string]struct{}, len(listeners))
lm := l.listenerMg
activeListeners, err := lm.CloneXdsControlListener()
if err != nil {
logger.Errorf("Clone Xds Control Listener fail: %s", err)
return
}
//put all current listeners to $toRemoveHash
for _, v := range activeListeners {
//Make sure each one has a unique name like "host-port-protocol"
v.Name = resolveListenerName(v.Address.SocketAddress.Address, v.Address.SocketAddress.Port, v.ProtocolStr)
toRemoveHash[v.Name] = struct{}{}
}
for _, listener := range listeners {
delete(toRemoveHash, listener.Name)
modelListener := l.makeListener(listener)
// add or update later after removes
switch {
case lm.HasListener(modelListener.Name):
laterApplies = append(laterApplies, func() error {
return lm.UpdateListener(&modelListener)
})
default:
laterApplies = append(laterApplies, func() error {
return lm.AddListener(&modelListener)
})
}
}
// remove the listeners first to prevent tcp port conflict
l.removeListeners(toRemoveHash)
//do update and add new cluster.
for _, fn := range laterApplies {
if err := fn(); err != nil {
logger.Errorf("can not modify listener", err)
}
}
}