Merge pull request #79 from libp2p/feat/better-intern

improve interning
This commit is contained in:
Steven Allen 2019-05-28 01:38:17 -07:00 committed by GitHub
commit aeb6adb266
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 17 deletions

View File

@ -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
}

View File

@ -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
}