take advantage of MarkSet/Visitor unification to atomically check+mark

This commit is contained in:
vyzo
2021-08-10 10:47:01 +03:00
parent cb3c53664d
commit 563fa1e31a
+50 -3
View File
@@ -296,6 +296,17 @@ func (s *SplitStore) doTxnProtect(root cid.Cid, markSet MarkSet) error {
return errStopWalk
}
visitor, ok := markSet.(MarkSetVisitor)
if ok {
visit, err := visitor.Visit(c)
if err != nil {
return xerrors.Errorf("error visiting object: %w", err)
}
if !visit {
return errStopWalk
}
} else {
mark, err := markSet.Has(c)
if err != nil {
return xerrors.Errorf("error checking markset: %w", err)
@@ -306,7 +317,12 @@ func (s *SplitStore) doTxnProtect(root cid.Cid, markSet MarkSet) error {
return errStopWalk
}
return markSet.Mark(c)
if err = markSet.Mark(c); err != nil {
return xerrors.Errorf("error marking object: %w", err)
}
}
return nil
},
func(c cid.Cid) error {
if s.txnMissing != nil {
@@ -416,6 +432,16 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
return errStopWalk
}
if visitor, ok := markSet.(MarkSetVisitor); ok {
visit, err := visitor.Visit(c)
if err != nil {
return xerrors.Errorf("error visiting object: %w", err)
}
if !visit {
return errStopWalk
}
} else {
has, err := markSet.Has(c)
if err != nil {
return xerrors.Errorf("error checking markset: %w", err)
@@ -425,8 +451,13 @@ func (s *SplitStore) doCompact(curTs *types.TipSet) error {
return errStopWalk
}
if err = markSet.Mark(c); err != nil {
return xerrors.Errorf("error marking: %w", err)
}
}
count++
return markSet.Mark(c)
return nil
})
if err != nil {
@@ -1111,6 +1142,17 @@ func (s *SplitStore) waitForMissingRefs(markSet MarkSet) {
return errStopWalk
}
visitor, ok := markSet.(MarkSetVisitor)
if ok {
visit, err := visitor.Visit(c)
if err != nil {
return xerrors.Errorf("error visiting object: %w", err)
}
if !visit {
return errStopWalk
}
} else {
mark, err := markSet.Has(c)
if err != nil {
return xerrors.Errorf("error checking markset for %s: %w", c, err)
@@ -1120,8 +1162,13 @@ func (s *SplitStore) waitForMissingRefs(markSet MarkSet) {
return errStopWalk
}
if err = markSet.Mark(c); err != nil {
return xerrors.Errorf("error marking object: %w", err)
}
}
count++
return markSet.Mark(c)
return nil
},
func(c cid.Cid) error {
missing[c] = struct{}{}