forked from cerc-io/plugeth
p2p: delete Server.Broadcast
This commit is contained in:
parent
2f249fea44
commit
dbdc5fd4b3
14
p2p/peer.go
14
p2p/peer.go
@ -273,20 +273,6 @@ func (p *Peer) getProto(code uint64) (*protoRW, error) {
|
|||||||
return nil, newPeerError(errInvalidMsgCode, "%d", code)
|
return nil, newPeerError(errInvalidMsgCode, "%d", code)
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeProtoMsg sends the given message on behalf of the given named protocol.
|
|
||||||
// this exists because of Server.Broadcast.
|
|
||||||
func (p *Peer) writeProtoMsg(protoName string, msg Msg) error {
|
|
||||||
proto, ok := p.running[protoName]
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("protocol %s not handled by peer", protoName)
|
|
||||||
}
|
|
||||||
if msg.Code >= proto.Length {
|
|
||||||
return newPeerError(errInvalidMsgCode, "code %x is out of range for protocol %q", msg.Code, protoName)
|
|
||||||
}
|
|
||||||
msg.Code += proto.offset
|
|
||||||
return p.rw.WriteMsg(msg)
|
|
||||||
}
|
|
||||||
|
|
||||||
type protoRW struct {
|
type protoRW struct {
|
||||||
Protocol
|
Protocol
|
||||||
in chan Msg
|
in chan Msg
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package p2p
|
package p2p
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
@ -107,44 +106,6 @@ func TestPeerProtoEncodeMsg(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPeerWriteForBroadcast(t *testing.T) {
|
|
||||||
closer, rw, peer, peerErr := testPeer([]Protocol{discard})
|
|
||||||
defer closer()
|
|
||||||
|
|
||||||
emptymsg := func(code uint64) Msg {
|
|
||||||
return Msg{Code: code, Size: 0, Payload: bytes.NewReader(nil)}
|
|
||||||
}
|
|
||||||
|
|
||||||
// test write errors
|
|
||||||
if err := peer.writeProtoMsg("b", emptymsg(3)); err == nil {
|
|
||||||
t.Errorf("expected error for unknown protocol, got nil")
|
|
||||||
}
|
|
||||||
if err := peer.writeProtoMsg("discard", emptymsg(8)); err == nil {
|
|
||||||
t.Errorf("expected error for out-of-range msg code, got nil")
|
|
||||||
} else if perr, ok := err.(*peerError); !ok || perr.Code != errInvalidMsgCode {
|
|
||||||
t.Errorf("wrong error for out-of-range msg code, got %#v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// setup for reading the message on the other end
|
|
||||||
read := make(chan struct{})
|
|
||||||
go func() {
|
|
||||||
if err := ExpectMsg(rw, 16, nil); err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
close(read)
|
|
||||||
}()
|
|
||||||
|
|
||||||
// test successful write
|
|
||||||
if err := peer.writeProtoMsg("discard", emptymsg(0)); err != nil {
|
|
||||||
t.Errorf("expect no error for known protocol: %v", err)
|
|
||||||
}
|
|
||||||
select {
|
|
||||||
case <-read:
|
|
||||||
case err := <-peerErr:
|
|
||||||
t.Fatalf("peer stopped: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestPeerPing(t *testing.T) {
|
func TestPeerPing(t *testing.T) {
|
||||||
closer, rw, _, _ := testPeer(nil)
|
closer, rw, _, _ := testPeer(nil)
|
||||||
defer closer()
|
defer closer()
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package p2p
|
package p2p
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"errors"
|
"errors"
|
||||||
@ -14,7 +13,6 @@ import (
|
|||||||
"github.com/ethereum/go-ethereum/logger/glog"
|
"github.com/ethereum/go-ethereum/logger/glog"
|
||||||
"github.com/ethereum/go-ethereum/p2p/discover"
|
"github.com/ethereum/go-ethereum/p2p/discover"
|
||||||
"github.com/ethereum/go-ethereum/p2p/nat"
|
"github.com/ethereum/go-ethereum/p2p/nat"
|
||||||
"github.com/ethereum/go-ethereum/rlp"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -159,45 +157,6 @@ func (srv *Server) AddPeer(node *discover.Node) {
|
|||||||
srv.staticNodes[node.ID] = node
|
srv.staticNodes[node.ID] = node
|
||||||
}
|
}
|
||||||
|
|
||||||
// Broadcast sends an RLP-encoded message to all connected peers.
|
|
||||||
// This method is deprecated and will be removed later.
|
|
||||||
func (srv *Server) Broadcast(protocol string, code uint64, data interface{}) error {
|
|
||||||
return srv.BroadcastLimited(protocol, code, func(i float64) float64 { return i }, data)
|
|
||||||
}
|
|
||||||
|
|
||||||
// BroadcastsRange an RLP-encoded message to a random set of peers using the limit function to limit the amount
|
|
||||||
// of peers.
|
|
||||||
func (srv *Server) BroadcastLimited(protocol string, code uint64, limit func(float64) float64, data interface{}) error {
|
|
||||||
var payload []byte
|
|
||||||
if data != nil {
|
|
||||||
var err error
|
|
||||||
payload, err = rlp.EncodeToBytes(data)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
srv.lock.RLock()
|
|
||||||
defer srv.lock.RUnlock()
|
|
||||||
|
|
||||||
i, max := 0, int(limit(float64(len(srv.peers))))
|
|
||||||
for _, peer := range srv.peers {
|
|
||||||
if i >= max {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if peer != nil {
|
|
||||||
var msg = Msg{Code: code}
|
|
||||||
if data != nil {
|
|
||||||
msg.Payload = bytes.NewReader(payload)
|
|
||||||
msg.Size = uint32(len(payload))
|
|
||||||
}
|
|
||||||
peer.writeProtoMsg(protocol, msg)
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start starts running the server.
|
// Start starts running the server.
|
||||||
// Servers can be re-used and started again after stopping.
|
// Servers can be re-used and started again after stopping.
|
||||||
func (srv *Server) Start() (err error) {
|
func (srv *Server) Start() (err error) {
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
package p2p
|
package p2p
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"io"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"sync"
|
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -121,45 +118,6 @@ func TestServerDial(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestServerBroadcast(t *testing.T) {
|
|
||||||
var connected sync.WaitGroup
|
|
||||||
srv := startTestServer(t, func(p *Peer) {
|
|
||||||
p.running = matchProtocols([]Protocol{discard}, []Cap{discard.cap()}, p.rw)
|
|
||||||
connected.Done()
|
|
||||||
})
|
|
||||||
defer srv.Stop()
|
|
||||||
|
|
||||||
// create a few peers
|
|
||||||
var conns = make([]net.Conn, 8)
|
|
||||||
connected.Add(len(conns))
|
|
||||||
deadline := time.Now().Add(3 * time.Second)
|
|
||||||
dialer := &net.Dialer{Deadline: deadline}
|
|
||||||
for i := range conns {
|
|
||||||
conn, err := dialer.Dial("tcp", srv.ListenAddr)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("conn %d: dial error: %v", i, err)
|
|
||||||
}
|
|
||||||
defer conn.Close()
|
|
||||||
conn.SetDeadline(deadline)
|
|
||||||
conns[i] = conn
|
|
||||||
}
|
|
||||||
connected.Wait()
|
|
||||||
|
|
||||||
// broadcast one message
|
|
||||||
srv.Broadcast("discard", 0, []string{"foo"})
|
|
||||||
golden := unhex("66e94d166f0a2c3b884cfa59ca34")
|
|
||||||
|
|
||||||
// check that the message has been written everywhere
|
|
||||||
for i, conn := range conns {
|
|
||||||
buf := make([]byte, len(golden))
|
|
||||||
if _, err := io.ReadFull(conn, buf); err != nil {
|
|
||||||
t.Errorf("conn %d: read error: %v", i, err)
|
|
||||||
} else if !bytes.Equal(buf, golden) {
|
|
||||||
t.Errorf("conn %d: msg mismatch\ngot: %x\nwant: %x", i, buf, golden)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This test checks that connections are disconnected
|
// This test checks that connections are disconnected
|
||||||
// just after the encryption handshake when the server is
|
// just after the encryption handshake when the server is
|
||||||
// at capacity.
|
// at capacity.
|
||||||
|
Loading…
Reference in New Issue
Block a user