Skip to content

Commit

Permalink
fix: potential race condition in member store index
Browse files Browse the repository at this point in the history
  • Loading branch information
aeddi authored and moul committed Dec 2, 2019
1 parent 46da53c commit 41cd222
Showing 1 changed file with 22 additions and 4 deletions.
26 changes: 22 additions & 4 deletions go/internal/orbitutil/member_store_index.go
@@ -1,6 +1,8 @@
package orbitutil

import (
"sync"

ipfslog "berty.tech/go-ipfs-log"
"berty.tech/go-orbit-db/iface"
"berty.tech/go-orbit-db/stores/operation"
Expand Down Expand Up @@ -39,12 +41,16 @@ func (i *indexEntry) findParent(index *memberStoreIndex) *indexEntry {
}

type memberStoreIndex struct {
group *group.Group
entries map[string]*indexEntry
members []*group.MemberDevice
group *group.Group
entries map[string]*indexEntry
muEntries sync.RWMutex
members []*group.MemberDevice
muMembers sync.RWMutex
}

func (m *memberStoreIndex) Get(key string) interface{} {
m.muMembers.RLock()
defer m.muMembers.RUnlock()
return m.members
}

Expand All @@ -57,6 +63,9 @@ func (m *memberStoreIndex) checkMemberLogEntryPayloadFirst(entry *indexEntry) er
}

func (m *memberStoreIndex) checkMemberLogEntryPayloadInvited(entry *indexEntry) error {
m.muEntries.RLock()
defer m.muEntries.RUnlock()

for _, e := range m.entries {
if e.memberDevice.Device.Equals(entry.parentPubKey) {
return nil
Expand Down Expand Up @@ -89,11 +98,18 @@ func (m *memberStoreIndex) UpdateIndex(log ipfslog.Log, entries []ipfslog.Entry)
)

entryHash := e.GetHash().String()
if idxE, ok = m.entries[entryHash]; !ok {

m.muEntries.RLock()
idxE, ok = m.entries[entryHash]
m.muEntries.RUnlock()

if !ok {
payload := &group.MemberEntryPayload{}

idxE = &indexEntry{}
m.muEntries.Lock()
m.entries[entryHash] = idxE
m.muEntries.Unlock()

if entryBytes, idxE.err = unwrapOperation(e); idxE.err != nil {
continue
Expand Down Expand Up @@ -145,7 +161,9 @@ func (m *memberStoreIndex) validateEntry(entry *indexEntry, isRoot bool) {
entry.parent = entry.findParent(m)

if hasAllParentsValid(entry, m) {
m.muMembers.Lock()
m.members = append(m.members, entry.memberDevice)
m.muMembers.Unlock()
entry.fullyValid = true
}

Expand Down

0 comments on commit 41cd222

Please sign in to comment.