diff --git a/p2p/host/peerstore/pstoremem/metadata.go b/p2p/host/peerstore/pstoremem/metadata.go index 162bee5087..9adebd8ae9 100644 --- a/p2p/host/peerstore/pstoremem/metadata.go +++ b/p2p/host/peerstore/pstoremem/metadata.go @@ -7,6 +7,11 @@ import ( pstore "github.com/libp2p/go-libp2p-peerstore" ) +var internKeys = map[string]bool{ + "AgentVersion": true, + "ProtocolVersion": true, +} + type metakey struct { id peer.ID key string @@ -15,8 +20,9 @@ type metakey struct { type memoryPeerMetadata struct { // store other data, like versions //ds ds.ThreadSafeDatastore - ds map[metakey]interface{} - dslock sync.RWMutex + ds map[metakey]interface{} + dslock sync.RWMutex + interned map[string]interface{} } var _ pstore.PeerMetadata = (*memoryPeerMetadata)(nil) @@ -30,6 +36,13 @@ func NewPeerMetadata() pstore.PeerMetadata { func (ps *memoryPeerMetadata) Put(p peer.ID, key string, val interface{}) error { ps.dslock.Lock() defer ps.dslock.Unlock() + if vals, ok := val.(string); ok && internKeys[key] { + if interned, ok := ps.interned[vals]; ok { + val = interned + } else { + ps.interned[vals] = val + } + } ps.ds[metakey{p, key}] = val return nil } diff --git a/p2p/host/peerstore/pstoremem/protobook.go b/p2p/host/peerstore/pstoremem/protobook.go index 04cd14591c..3a5550d2b6 100644 --- a/p2p/host/peerstore/pstoremem/protobook.go +++ b/p2p/host/peerstore/pstoremem/protobook.go @@ -8,11 +8,6 @@ import ( pstore "github.com/libp2p/go-libp2p-peerstore" ) -const ( - maxInternedProtocols = 512 - maxInternedProtocolSize = 256 -) - type protoSegment struct { sync.RWMutex protocols map[peer.ID]map[string]struct{} @@ -35,7 +30,7 @@ var _ pstore.ProtoBook = (*memoryProtoBook)(nil) func NewProtoBook() pstore.ProtoBook { return &memoryProtoBook{ - interned: make(map[string]string, maxInternedProtocols), + interned: make(map[string]string, 256), segments: func() (ret protoSegments) { for i := range ret { ret[i] = &protoSegment{ @@ -48,10 +43,6 @@ func NewProtoBook() pstore.ProtoBook { } func (pb *memoryProtoBook) internProtocol(proto string) string { - if len(proto) > maxInternedProtocolSize { - return proto - } - // check if it is interned with the read lock pb.lk.RLock() interned, ok := pb.interned[proto] @@ -71,11 +62,6 @@ func (pb *memoryProtoBook) internProtocol(proto string) string { return interned } - // if we've filled the table, throw it away and start over - if len(pb.interned) >= maxInternedProtocols { - pb.interned = make(map[string]string, maxInternedProtocols) - } - pb.interned[proto] = proto return proto }