Skip to content

Commit 2143dd3

Browse files
committed
removal of unavailable peers
1 parent 6a3deda commit 2143dd3

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

node/peerdiscovery.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import (
88

99
"github.com/volodymyrprokopyuk/go-blockchain/node/rpc"
1010
"google.golang.org/grpc"
11+
"google.golang.org/grpc/codes"
1112
"google.golang.org/grpc/credentials/insecure"
13+
"google.golang.org/grpc/status"
1214
)
1315

1416
type PeerReader interface {
@@ -103,6 +105,13 @@ func (d *PeerDiscovery) DiscoverPeers(period time.Duration) {
103105
for _, peer := range d.Peers() {
104106
if peer != d.cfg.NodeAddr {
105107
peers, err := d.grpcPeerDiscover(peer)
108+
errorStatus, assert := status.FromError(err)
109+
if assert && errorStatus.Code() == codes.Unavailable {
110+
d.mtx.Lock()
111+
delete(d.peers, peer)
112+
d.mtx.Unlock()
113+
continue
114+
}
106115
if err != nil {
107116
fmt.Println(err)
108117
continue

node/peerdiscovery_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,40 @@ func TestPeerDiscovery(t *testing.T) {
5252
t.Errorf("bootstrap address %v is not in node known peers", bootAddr)
5353
}
5454
}
55+
56+
func TestRemovalOfUnhealthyPeer(t *testing.T) {
57+
wg := new(sync.WaitGroup)
58+
// Create the peer discovery without staring for the bootstrap node
59+
bootPeerDisc := createPeerDiscovery(t.Context(), wg, true, false)
60+
// Start the gRPC server on the bootstrap node
61+
waitForPeersDiscovery := make(chan struct{})
62+
grpcStartSvr(t, bootAddr, func(grpcSrv *grpc.Server) {
63+
node := rpc.NewNodeSrv(bootPeerDisc, nil)
64+
rpc.RegisterNodeServer(grpcSrv, node)
65+
66+
go func() {
67+
<-waitForPeersDiscovery
68+
grpcSrv.Stop()
69+
}()
70+
})
71+
// Create and start the peer discovery for the new node
72+
nodePeerDisc := createPeerDiscovery(t.Context(), wg, false, true)
73+
// Wait for the peer discovery to discover peers
74+
time.Sleep(150 * time.Millisecond)
75+
// Verify that the bootstrap node and the new node have discovered each other
76+
77+
if !slices.Contains(bootPeerDisc.Peers(), nodeAddr) {
78+
t.Errorf("node address %v is not in bootstrap known peers", nodeAddr)
79+
}
80+
if !slices.Contains(nodePeerDisc.Peers(), bootAddr) {
81+
t.Errorf("bootstrap address %v is not in node known peers", bootAddr)
82+
}
83+
84+
waitForPeersDiscovery <- struct{}{}
85+
// Wait for the peer discovery to try to discover peers
86+
time.Sleep(250 * time.Millisecond)
87+
88+
if len(nodePeerDisc.Peers()) != 0 {
89+
t.Errorf("node peer discovery should not have any peers after the bootstrap node is stopped")
90+
}
91+
}

0 commit comments

Comments
 (0)