track in flight writes in badger markste, as they happen outside the lock
This commit is contained in:
parent
f75d982c76
commit
f492f8d450
@ -24,7 +24,9 @@ type BadgerMarkSet struct {
|
|||||||
mx sync.RWMutex
|
mx sync.RWMutex
|
||||||
cond sync.Cond
|
cond sync.Cond
|
||||||
pend map[string]struct{}
|
pend map[string]struct{}
|
||||||
|
writing map[int]map[string]struct{}
|
||||||
writers int
|
writers int
|
||||||
|
seqno int
|
||||||
|
|
||||||
db *badger.DB
|
db *badger.DB
|
||||||
path string
|
path string
|
||||||
@ -72,9 +74,10 @@ func (e *BadgerMarkSetEnv) Create(name string, sizeHint int64) (MarkSet, error)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ms := &BadgerMarkSet{
|
ms := &BadgerMarkSet{
|
||||||
pend: make(map[string]struct{}),
|
pend: make(map[string]struct{}),
|
||||||
db: db,
|
writing: make(map[int]map[string]struct{}),
|
||||||
path: path,
|
db: db,
|
||||||
|
path: path,
|
||||||
}
|
}
|
||||||
ms.cond.L = &ms.mx
|
ms.cond.L = &ms.mx
|
||||||
|
|
||||||
@ -101,12 +104,17 @@ func (s *BadgerMarkSet) Mark(c cid.Cid) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pend := s.pend
|
pend := s.pend
|
||||||
|
seqno := s.seqno
|
||||||
|
s.seqno++
|
||||||
|
s.writing[seqno] = pend
|
||||||
s.pend = make(map[string]struct{})
|
s.pend = make(map[string]struct{})
|
||||||
s.writers++
|
s.writers++
|
||||||
s.mx.Unlock()
|
s.mx.Unlock()
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
s.mx.Lock()
|
s.mx.Lock()
|
||||||
|
|
||||||
|
delete(s.writing, seqno)
|
||||||
s.writers--
|
s.writers--
|
||||||
if s.writers == 0 {
|
if s.writers == 0 {
|
||||||
s.cond.Broadcast()
|
s.cond.Broadcast()
|
||||||
@ -142,11 +150,19 @@ func (s *BadgerMarkSet) Has(c cid.Cid) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
key := c.Hash()
|
key := c.Hash()
|
||||||
_, ok := s.pend[string(key)]
|
pendKey := string(key)
|
||||||
|
_, ok := s.pend[pendKey]
|
||||||
if ok {
|
if ok {
|
||||||
return true, nil
|
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 := s.db.View(func(txn *badger.Txn) error {
|
||||||
_, err := txn.Get(key)
|
_, err := txn.Get(key)
|
||||||
return err
|
return err
|
||||||
|
Loading…
Reference in New Issue
Block a user