Commit d2e2c56c authored by Steven Allen's avatar Steven Allen

feat: intern agent versions

This also starts taking up a bunch of memory after a while.
parent fd3ea885
...@@ -7,6 +7,11 @@ import ( ...@@ -7,6 +7,11 @@ import (
pstore "github.com/libp2p/go-libp2p-peerstore" pstore "github.com/libp2p/go-libp2p-peerstore"
) )
var internKeys = map[string]bool{
"AgentVersion": true,
"ProtocolVersion": true,
}
type metakey struct { type metakey struct {
id peer.ID id peer.ID
key string key string
...@@ -15,8 +20,9 @@ type metakey struct { ...@@ -15,8 +20,9 @@ type metakey struct {
type memoryPeerMetadata struct { type memoryPeerMetadata struct {
// store other data, like versions // store other data, like versions
//ds ds.ThreadSafeDatastore //ds ds.ThreadSafeDatastore
ds map[metakey]interface{} ds map[metakey]interface{}
dslock sync.RWMutex dslock sync.RWMutex
interned map[string]interface{}
} }
var _ pstore.PeerMetadata = (*memoryPeerMetadata)(nil) var _ pstore.PeerMetadata = (*memoryPeerMetadata)(nil)
...@@ -30,6 +36,13 @@ func NewPeerMetadata() pstore.PeerMetadata { ...@@ -30,6 +36,13 @@ func NewPeerMetadata() pstore.PeerMetadata {
func (ps *memoryPeerMetadata) Put(p peer.ID, key string, val interface{}) error { func (ps *memoryPeerMetadata) Put(p peer.ID, key string, val interface{}) error {
ps.dslock.Lock() ps.dslock.Lock()
defer ps.dslock.Unlock() 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 ps.ds[metakey{p, key}] = val
return nil return nil
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment