func()

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)
		}
	}
}