-
Notifications
You must be signed in to change notification settings - Fork 10
/
consensus_peer.go
102 lines (87 loc) · 2.55 KB
/
consensus_peer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright (c) 2020 The Meter.io developers
// Distributed under the GNU Lesser General Public License v3.0 software license, see the accompanying
// file LICENSE or <https://www.gnu.org/licenses/lgpl-3.0.html>
package consensus
import (
"bytes"
"fmt"
"net"
"net/http"
"strings"
"time"
"github.com/inconshreveable/log15"
"github.com/meterio/meter-pov/types"
)
// Consensus Topology Peer
type ConsensusPeer struct {
name string
netAddr types.NetAddress
logger log15.Logger
magic [4]byte
}
func newConsensusPeer(name string, ip net.IP, port uint16, magic [4]byte) *ConsensusPeer {
return &ConsensusPeer{
name: name,
netAddr: types.NetAddress{
IP: ip,
Port: port,
},
logger: log15.New("pkg", "peer", "peer", name, "ip", ip.String()),
magic: magic,
}
}
func (peer *ConsensusPeer) sendPacemakerMsg(rawData []byte, msgSummary string, msgHashHex string, relay bool) error {
// full size message may taker longer time (> 2s) to complete the tranport.
var netClient = &http.Client{
Timeout: time.Second * 4, // 2
}
split := strings.Split(msgSummary, " ")
name := ""
tail := ""
if len(split) > 0 {
name = split[0]
tail = strings.Join(split[1:], " ")
}
if relay {
peer.logger.Info("Relay>> "+name+" "+msgHashHex+"]", "size", len(rawData))
} else {
peer.logger.Info("Send>> "+name+" "+msgHashHex+" "+tail, "size", len(rawData))
}
url := "http://" + peer.netAddr.IP.String() + ":8670/pacemaker"
_, err := netClient.Post(url, "application/json", bytes.NewBuffer(rawData))
if err != nil {
peer.logger.Error("Failed to send message to peer", "err", err)
return err
}
return nil
}
func (peer *ConsensusPeer) sendCommitteeMsg(rawData []byte, msgSummary string, msgHashHex string, relay bool) error {
var netClient = &http.Client{
Timeout: time.Second * 4,
}
split := strings.Split(msgSummary, " ")
name := ""
tail := ""
if len(split) > 0 {
name = split[0]
tail = strings.Join(split[1:], " ")
}
if relay {
peer.logger.Info("Relay>> "+name+" "+msgHashHex+"]", "size", len(rawData))
} else {
peer.logger.Info("Send>> "+name+" "+msgHashHex+" "+tail, "size", len(rawData))
}
url := "http://" + peer.netAddr.IP.String() + ":8670/committee"
_, err := netClient.Post(url, "application/json", bytes.NewBuffer(rawData))
if err != nil {
peer.logger.Error("Failed to send message to peer", "err", err)
return err
}
return nil
}
func (cp *ConsensusPeer) FullString() string {
return fmt.Sprintf("%s:%d", cp.netAddr.IP.String(), cp.netAddr.Port)
}
func (cp *ConsensusPeer) String() string {
return cp.netAddr.IP.String()
}