Skip to content

Commit 260f979

Browse files
authored
Merge pull request #588 from libp2p/feat/reduce-allocations
feat: reduce allocations
2 parents 7951e3c + 68edc96 commit 260f979

File tree

5 files changed

+123
-85
lines changed

5 files changed

+123
-85
lines changed

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ require (
2828
github.com/libp2p/go-netroute v0.1.2
2929
github.com/multiformats/go-base32 v0.0.3
3030
github.com/multiformats/go-multiaddr v0.2.1
31-
github.com/multiformats/go-multiaddr-dns v0.2.0
3231
github.com/multiformats/go-multiaddr-net v0.1.4
3332
github.com/multiformats/go-multihash v0.0.13
3433
github.com/multiformats/go-multistream v0.1.1

pb/bytestring.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package dht_pb
2+
3+
import (
4+
"encoding/json"
5+
)
6+
7+
type byteString string
8+
9+
func (b byteString) Marshal() ([]byte, error) {
10+
return []byte(b), nil
11+
}
12+
13+
func (b *byteString) MarshalTo(data []byte) (int, error) {
14+
return copy(data, *b), nil
15+
}
16+
17+
func (b *byteString) Unmarshal(data []byte) error {
18+
*b = byteString(data)
19+
return nil
20+
}
21+
22+
func (b *byteString) Size() int {
23+
return len(*b)
24+
}
25+
26+
func (b byteString) MarshalJSON() ([]byte, error) {
27+
return json.Marshal([]byte(b))
28+
}
29+
30+
func (b *byteString) UnmarshalJSON(data []byte) error {
31+
var buf []byte
32+
err := json.Unmarshal(data, &buf)
33+
if err != nil {
34+
return err
35+
}
36+
*b = byteString(buf)
37+
return nil
38+
}
39+
40+
func (b byteString) Equal(other byteString) bool {
41+
return b == other
42+
}

pb/dht.pb.go

Lines changed: 58 additions & 61 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pb/dht.proto

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ syntax = "proto3";
99
package dht.pb;
1010

1111
import "github.com/libp2p/go-libp2p-record/pb/record.proto";
12+
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
1213

1314
message Message {
1415
enum MessageType {
@@ -37,7 +38,7 @@ message Message {
3738

3839
message Peer {
3940
// ID of a given peer.
40-
bytes id = 1;
41+
bytes id = 1 [(gogoproto.customtype) = "byteString", (gogoproto.nullable) = false];
4142

4243
// multiaddrs for a given peer
4344
repeated bytes addrs = 2;
@@ -63,9 +64,9 @@ message Message {
6364

6465
// Used to return peers closer to a key in a query
6566
// GET_VALUE, GET_PROVIDERS, FIND_NODE
66-
repeated Peer closerPeers = 8;
67+
repeated Peer closerPeers = 8 [(gogoproto.nullable) = false];
6768

6869
// Used to return Providers
6970
// GET_VALUE, ADD_PROVIDER, GET_PROVIDERS
70-
repeated Peer providerPeers = 9;
71+
repeated Peer providerPeers = 9 [(gogoproto.nullable) = false];
7172
}

pb/message.go

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,43 +25,41 @@ func NewMessage(typ Message_MessageType, key []byte, level int) *Message {
2525
return m
2626
}
2727

28-
func peerRoutingInfoToPBPeer(p PeerRoutingInfo) *Message_Peer {
29-
pbp := new(Message_Peer)
28+
func peerRoutingInfoToPBPeer(p PeerRoutingInfo) Message_Peer {
29+
var pbp Message_Peer
3030

3131
pbp.Addrs = make([][]byte, len(p.Addrs))
3232
for i, maddr := range p.Addrs {
3333
pbp.Addrs[i] = maddr.Bytes() // Bytes, not String. Compressed.
3434
}
35-
s := string(p.ID)
36-
pbp.Id = []byte(s)
37-
c := ConnectionType(p.Connectedness)
38-
pbp.Connection = c
35+
pbp.Id = byteString(p.ID)
36+
pbp.Connection = ConnectionType(p.Connectedness)
3937
return pbp
4038
}
4139

42-
func peerInfoToPBPeer(p peer.AddrInfo) *Message_Peer {
43-
pbp := new(Message_Peer)
40+
func peerInfoToPBPeer(p peer.AddrInfo) Message_Peer {
41+
var pbp Message_Peer
4442

4543
pbp.Addrs = make([][]byte, len(p.Addrs))
4644
for i, maddr := range p.Addrs {
4745
pbp.Addrs[i] = maddr.Bytes() // Bytes, not String. Compressed.
4846
}
49-
pbp.Id = []byte(p.ID)
47+
pbp.Id = byteString(p.ID)
5048
return pbp
5149
}
5250

5351
// PBPeerToPeer turns a *Message_Peer into its peer.AddrInfo counterpart
54-
func PBPeerToPeerInfo(pbp *Message_Peer) *peer.AddrInfo {
55-
return &peer.AddrInfo{
56-
ID: peer.ID(pbp.GetId()),
52+
func PBPeerToPeerInfo(pbp Message_Peer) peer.AddrInfo {
53+
return peer.AddrInfo{
54+
ID: peer.ID(pbp.Id),
5755
Addrs: pbp.Addresses(),
5856
}
5957
}
6058

6159
// RawPeerInfosToPBPeers converts a slice of Peers into a slice of *Message_Peers,
6260
// ready to go out on the wire.
63-
func RawPeerInfosToPBPeers(peers []peer.AddrInfo) []*Message_Peer {
64-
pbpeers := make([]*Message_Peer, len(peers))
61+
func RawPeerInfosToPBPeers(peers []peer.AddrInfo) []Message_Peer {
62+
pbpeers := make([]Message_Peer, len(peers))
6563
for i, p := range peers {
6664
pbpeers[i] = peerInfoToPBPeer(p)
6765
}
@@ -72,7 +70,7 @@ func RawPeerInfosToPBPeers(peers []peer.AddrInfo) []*Message_Peer {
7270
// which can be written to a message and sent out. the key thing this function
7371
// does (in addition to PeersToPBPeers) is set the ConnectionType with
7472
// information from the given network.Network.
75-
func PeerInfosToPBPeers(n network.Network, peers []peer.AddrInfo) []*Message_Peer {
73+
func PeerInfosToPBPeers(n network.Network, peers []peer.AddrInfo) []Message_Peer {
7674
pbps := RawPeerInfosToPBPeers(peers)
7775
for i, pbp := range pbps {
7876
c := ConnectionType(n.Connectedness(peers[i].ID))
@@ -81,8 +79,8 @@ func PeerInfosToPBPeers(n network.Network, peers []peer.AddrInfo) []*Message_Pee
8179
return pbps
8280
}
8381

84-
func PeerRoutingInfosToPBPeers(peers []PeerRoutingInfo) []*Message_Peer {
85-
pbpeers := make([]*Message_Peer, len(peers))
82+
func PeerRoutingInfosToPBPeers(peers []PeerRoutingInfo) []Message_Peer {
83+
pbpeers := make([]Message_Peer, len(peers))
8684
for i, p := range peers {
8785
pbpeers[i] = peerRoutingInfoToPBPeer(p)
8886
}
@@ -91,10 +89,11 @@ func PeerRoutingInfosToPBPeers(peers []PeerRoutingInfo) []*Message_Peer {
9189

9290
// PBPeersToPeerInfos converts given []*Message_Peer into []peer.AddrInfo
9391
// Invalid addresses will be silently omitted.
94-
func PBPeersToPeerInfos(pbps []*Message_Peer) []*peer.AddrInfo {
92+
func PBPeersToPeerInfos(pbps []Message_Peer) []*peer.AddrInfo {
9593
peers := make([]*peer.AddrInfo, 0, len(pbps))
9694
for _, pbp := range pbps {
97-
peers = append(peers, PBPeerToPeerInfo(pbp))
95+
ai := PBPeerToPeerInfo(pbp)
96+
peers = append(peers, &ai)
9897
}
9998
return peers
10099
}
@@ -109,7 +108,7 @@ func (m *Message_Peer) Addresses() []ma.Multiaddr {
109108
for _, addr := range m.Addrs {
110109
maddr, err := ma.NewMultiaddrBytes(addr)
111110
if err != nil {
112-
log.Debugw("error decoding multiaddr for peer", "peer", m.GetId(), "error", err)
111+
log.Debugw("error decoding multiaddr for peer", "peer", peer.ID(m.Id), "error", err)
113112
continue
114113
}
115114

0 commit comments

Comments
 (0)