func (peers *Peers) applyUpdate(update []byte) (peerNameSet, peerNameSet, error) {
	peers.Lock()
	var pending peersPendingNotifications
	defer peers.unlockAndNotify(&pending)

	newPeers, decodedUpdate, decodedConns, err := peers.decodeUpdate(update)
	if err != nil {
		return nil, nil, err
	}

	// Add new peers
	for name, newPeer := range newPeers {
		peers.byName[name] = newPeer
		peers.addByShortID(newPeer, &pending)
	}

	// Now apply the updates
	newUpdate := peers.applyDecodedUpdate(decodedUpdate, decodedConns, &pending)
	peers.garbageCollect(&pending)
	for _, peerRemoved := range pending.removed {
		delete(newUpdate, peerRemoved.Name)
	}

	updateNames := make(peerNameSet)
	for _, peer := range decodedUpdate {
		updateNames[peer.Name] = struct{}{}
	}

	return updateNames, newUpdate, nil
}
func (peers *Peers) applyUpdate(update []byte) (peerNameSet, peerNameSet, error) {
	peers.Lock()
	var pending peersPendingNotifications
	defer peers.unlockAndNotify(&pending)

	newPeers, decodedUpdate, decodedConns, err := peers.decodeUpdate(update)
	if err != nil {
		return nil, nil, err
	}

	
	for name, newPeer := range newPeers {
		peers.byName[name] = newPeer
		peers.addByShortID(newPeer, &pending)
	}

	
	newUpdate := peers.applyDecodedUpdate(decodedUpdate, decodedConns, &pending)
	peers.garbageCollect(&pending)
	for _, peerRemoved := range pending.removed {
		delete(newUpdate, peerRemoved.Name)
	}

	updateNames := make(peerNameSet)
	for _, peer := range decodedUpdate {
		updateNames[peer.Name] = struct{}{}
	}

	return updateNames, newUpdate, nil
}
func ( peers * Peers ) applyUpdate ( update [ ] byte ) ( peerNameSet , peerNameSet , error ) { peers . Lock ( ) var pending peersPendingNotifications defer peers . unlockAndNotify ( & pending ) newPeers , decodedUpdate , decodedConns , err := peers . decodeUpdate ( update ) if err != nil { return nil , nil , err } // Add new peers for name , newPeer := range newPeers { peers . byName [ name ] = newPeer peers . addByShortID ( newPeer , & pending ) } // Now apply the updates newUpdate := peers . applyDecodedUpdate ( decodedUpdate , decodedConns , & pending ) peers . garbageCollect ( & pending ) for _ , peerRemoved := range pending . removed { delete ( newUpdate , peerRemoved . Name ) } updateNames := make ( peerNameSet ) for _ , peer := range decodedUpdate { updateNames [ peer . Name ] = struct { } { } } return updateNames , newUpdate , nil }
// Merge an incoming update with our own topology.
//
// We add peers hitherto unknown to us, and update peers for which the
// update contains a more recent version than known to us. The return
// value is a) a representation of the received update, and b) an
// "improved" update containing just these new/updated elements.
Merge an incoming update with our own topology . We add peers hitherto unknown to us and update peers for which the update contains a more recent version than known to us . The return value is a ) a representation of the received update and b ) an improved update containing just these new / updated elements .