use a map for txn protection mark set

This commit is contained in:
vyzo 2021-06-25 19:41:31 +03:00
parent 65ccc99e79
commit 6af3a23dd4
2 changed files with 60 additions and 1 deletions

View File

@ -2,6 +2,7 @@ package splitstore
import (
"path/filepath"
"sync"
"golang.org/x/xerrors"
@ -32,9 +33,67 @@ func OpenMarkSetEnv(path string, mtype string) (MarkSetEnv, error) {
return NewBloomMarkSetEnv(false)
case "bloomts":
return NewBloomMarkSetEnv(true)
case "map":
return NewMapMarkSetEnv(false)
case "mapts":
return NewMapMarkSetEnv(true)
case "bolt":
return NewBoltMarkSetEnv(filepath.Join(path, "markset.bolt"))
default:
return nil, xerrors.Errorf("unknown mark set type %s", mtype)
}
}
type MapMarkSetEnv struct {
ts bool
}
var _ MarkSetEnv = (*MapMarkSetEnv)(nil)
type MapMarkSet struct {
mx sync.Mutex
cids map[cid.Cid]struct{}
ts bool
}
var _ MarkSet = (*MapMarkSet)(nil)
func NewMapMarkSetEnv(ts bool) (*MapMarkSetEnv, error) {
return &MapMarkSetEnv{ts: ts}, nil
}
func (e *MapMarkSetEnv) Create(name string, sizeHint int64) (MarkSet, error) {
return &MapMarkSet{
cids: make(map[cid.Cid]struct{}),
ts: e.ts,
}, nil
}
func (e *MapMarkSetEnv) Close() error {
return nil
}
func (s *MapMarkSet) Mark(cid cid.Cid) error {
if s.ts {
s.mx.Lock()
defer s.mx.Unlock()
}
s.cids[cid] = struct{}{}
return nil
}
func (s *MapMarkSet) Has(cid cid.Cid) (bool, error) {
if s.ts {
s.mx.Lock()
defer s.mx.Unlock()
}
_, ok := s.cids[cid]
return ok, nil
}
func (s *MapMarkSet) Close() error {
return nil
}

View File

@ -168,7 +168,7 @@ func Open(path string, ds dstore.Datastore, hot, cold bstore.Blockstore, cfg *Co
}
// the txn markset env
txnEnv, err := OpenMarkSetEnv(path, "bloomts")
txnEnv, err := OpenMarkSetEnv(path, "mapts")
if err != nil {
_ = tracker.Close()
_ = env.Close()