From af2cb17f804354f3d212ed99a9dee5dabdb02827 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 27 Apr 2019 22:15:45 +0300 Subject: [PATCH 1/3] read/write protocol lock --- peerstore.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/peerstore.go b/peerstore.go index 306127e..f7f87b8 100644 --- a/peerstore.go +++ b/peerstore.go @@ -21,7 +21,7 @@ type peerstore struct { PeerMetadata // lock for protocol information, separate from datastore lock - protolock sync.Mutex + protolock sync.RWMutex internedProtocols map[string]string } @@ -142,8 +142,8 @@ func (ps *peerstore) getProtocolMap(p peer.ID) (map[string]struct{}, error) { } func (ps *peerstore) GetProtocols(p peer.ID) ([]string, error) { - ps.protolock.Lock() - defer ps.protolock.Unlock() + ps.protolock.RLock() + defer ps.protolock.RUnlock() pmap, err := ps.getProtocolMap(p) if err != nil { return nil, err @@ -158,8 +158,8 @@ func (ps *peerstore) GetProtocols(p peer.ID) ([]string, error) { } func (ps *peerstore) SupportsProtocols(p peer.ID, protos ...string) ([]string, error) { - ps.protolock.Lock() - defer ps.protolock.Unlock() + ps.protolock.RLock() + defer ps.protolock.RUnlock() pmap, err := ps.getProtocolMap(p) if err != nil { return nil, err From 0ddad15bd27d79ddc03ba50ae6bf43b5e26ed460 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 27 Apr 2019 22:19:39 +0300 Subject: [PATCH 2/3] read/write address book lock --- pstoremem/addr_book.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pstoremem/addr_book.go b/pstoremem/addr_book.go index 723b433..002f8b1 100644 --- a/pstoremem/addr_book.go +++ b/pstoremem/addr_book.go @@ -30,7 +30,7 @@ var _ pstore.AddrBook = (*memoryAddrBook)(nil) // memoryAddrBook manages addresses. type memoryAddrBook struct { - addrmu sync.Mutex + addrmu sync.RWMutex // Use pointers to save memory. Maps always leave some fraction of their // space unused. storing the *values* directly in the map will // drastically increase the space waste. In our case, by 6x. @@ -68,8 +68,8 @@ func (mab *memoryAddrBook) gc() { } func (mab *memoryAddrBook) PeersWithAddrs() peer.IDSlice { - mab.addrmu.Lock() - defer mab.addrmu.Unlock() + mab.addrmu.RLock() + defer mab.addrmu.RUnlock() pids := make(peer.IDSlice, 0, len(mab.addrs)) for pid := range mab.addrs { @@ -178,8 +178,8 @@ func (mab *memoryAddrBook) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL t // Addresses returns all known (and valid) addresses for a given func (mab *memoryAddrBook) Addrs(p peer.ID) []ma.Multiaddr { - mab.addrmu.Lock() - defer mab.addrmu.Unlock() + mab.addrmu.RLock() + defer mab.addrmu.RUnlock() amap, found := mab.addrs[p] if !found { @@ -210,8 +210,8 @@ func (mab *memoryAddrBook) ClearAddrs(p peer.ID) { // AddrStream returns a channel on which all new addresses discovered for a // given peer ID will be published. func (mab *memoryAddrBook) AddrStream(ctx context.Context, p peer.ID) <-chan ma.Multiaddr { - mab.addrmu.Lock() - defer mab.addrmu.Unlock() + mab.addrmu.RLock() + defer mab.addrmu.RUnlock() baseaddrslice := mab.addrs[p] initial := make([]ma.Multiaddr, 0, len(baseaddrslice)) From 3cd491431b49f98799a34b54b8981eb251a9cbf1 Mon Sep 17 00:00:00 2001 From: vyzo Date: Sat, 27 Apr 2019 22:19:49 +0300 Subject: [PATCH 3/3] read/write metadata lock --- pstoremem/metadata.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pstoremem/metadata.go b/pstoremem/metadata.go index 5562c9c..162bee5 100644 --- a/pstoremem/metadata.go +++ b/pstoremem/metadata.go @@ -16,7 +16,7 @@ type memoryPeerMetadata struct { // store other data, like versions //ds ds.ThreadSafeDatastore ds map[metakey]interface{} - dslock sync.Mutex + dslock sync.RWMutex } var _ pstore.PeerMetadata = (*memoryPeerMetadata)(nil) @@ -35,8 +35,8 @@ func (ps *memoryPeerMetadata) Put(p peer.ID, key string, val interface{}) error } func (ps *memoryPeerMetadata) Get(p peer.ID, key string) (interface{}, error) { - ps.dslock.Lock() - defer ps.dslock.Unlock() + ps.dslock.RLock() + defer ps.dslock.RUnlock() i, ok := ps.ds[metakey{p, key}] if !ok { return nil, pstore.ErrNotFound