diff --git a/peer_cache.go b/peer_cache.go index 390a164c..69e785bb 100644 --- a/peer_cache.go +++ b/peer_cache.go @@ -177,24 +177,22 @@ func (cache *PeerCache) decodeUpdate(update []byte, router *Router) (newPeers ma } } - unknownPeers := false for _, connsBuf := range decodedConns { - connsIterator(connsBuf, func(remoteNameByte []byte, _ string) { + err = connsIterator(connsBuf, func(remoteNameByte []byte, _ string) error { remoteName := PeerNameFromBin(remoteNameByte) if _, found := newPeers[remoteName]; found { - return + return nil } if _, found := cache.table[remoteName]; found { - return + return nil } // Update refers to a peer which we have no knowledge // of. Thus we can't apply the update. Abort. - unknownPeers = true + return UnknownPeersError{remoteName} }) - } - if unknownPeers { - err = UnknownPeersError{} - return + if err != nil { + break + } } return } @@ -282,7 +280,7 @@ func decodePeerNoConns(dec *gob.Decoder) (nameByte []byte, uid uint64, version u return } -func connsIterator(input []byte, fun func([]byte, string)) { +func connsIterator(input []byte, fun func([]byte, string) error) error { buf := new(bytes.Buffer) buf.Write(input) dec := gob.NewDecoder(buf) @@ -290,22 +288,26 @@ func connsIterator(input []byte, fun func([]byte, string)) { var nameByte []byte err := dec.Decode(&nameByte) if err == io.EOF { - return + return nil } checkFatal(err) var foundAt string checkFatal(dec.Decode(&foundAt)) - fun(nameByte, string(foundAt)) + if err = fun(nameByte, string(foundAt)); err != nil { + return err + } } + return nil } func readConnsMap(peer *Peer, buf []byte, table map[PeerName]*Peer) map[PeerName]Connection { conns := make(map[PeerName]Connection) - connsIterator(buf, func(nameByte []byte, remoteTCPAddr string) { + connsIterator(buf, func(nameByte []byte, remoteTCPAddr string) error { name := PeerNameFromBin(nameByte) remotePeer := table[name] conn := NewRemoteConnection(peer, remotePeer, remoteTCPAddr) conns[name] = conn + return nil }) return conns } diff --git a/types.go b/types.go index 020fba18..83daed99 100644 --- a/types.go +++ b/types.go @@ -123,6 +123,7 @@ type FrameTooBigError struct { } type UnknownPeersError struct { + Name PeerName } type NameCollisionError struct { diff --git a/utils.go b/utils.go index 22d7235b..72b8629d 100644 --- a/utils.go +++ b/utils.go @@ -39,7 +39,7 @@ func (ftbe FrameTooBigError) Error() string { } func (upe UnknownPeersError) Error() string { - return fmt.Sprint("Reference to unknown peers") + return fmt.Sprint("Reference to unknown peer: ", upe.Name) } func (nce NameCollisionError) Error() string {