track in flight writes in badger markste, as they happen outside the lock

This commit is contained in:
vyzo
2021-07-23 12:47:18 +03:00
parent f75d982c76
commit f492f8d450
+20 -4
View File
@@ -24,7 +24,9 @@ type BadgerMarkSet struct {
mx sync.RWMutex
cond sync.Cond
pend map[string]struct{}
writing map[int]map[string]struct{}
writers int
seqno int
db *badger.DB
path string
@@ -72,9 +74,10 @@ func (e *BadgerMarkSetEnv) Create(name string, sizeHint int64) (MarkSet, error)
}
ms := &BadgerMarkSet{
pend: make(map[string]struct{}),
db: db,
path: path,
pend: make(map[string]struct{}),
writing: make(map[int]map[string]struct{}),
db: db,
path: path,
}
ms.cond.L = &ms.mx
@@ -101,12 +104,17 @@ func (s *BadgerMarkSet) Mark(c cid.Cid) error {
}
pend := s.pend
seqno := s.seqno
s.seqno++
s.writing[seqno] = pend
s.pend = make(map[string]struct{})
s.writers++
s.mx.Unlock()
defer func() {
s.mx.Lock()
delete(s.writing, seqno)
s.writers--
if s.writers == 0 {
s.cond.Broadcast()
@@ -142,11 +150,19 @@ func (s *BadgerMarkSet) Has(c cid.Cid) (bool, error) {
}
key := c.Hash()
_, ok := s.pend[string(key)]
pendKey := string(key)
_, ok := s.pend[pendKey]
if ok {
return true, nil
}
for _, wr := range s.writing {
_, ok := wr[pendKey]
if ok {
return true, nil
}
}
err := s.db.View(func(txn *badger.Txn) error {
_, err := txn.Get(key)
return err