From 5197d8f344f14ead84c85b4ffc3a6c4bb7d520af Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 27 May 2019 14:41:29 -0700 Subject: [PATCH] feat: intern agent versions This also starts taking up a bunch of memory after a while. --- p2p/host/peerstore/pstoremem/metadata.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) 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 }