[#1691] blobovniczatree: Do not fill cache during initialization

Signed-off-by: Evgenii Stratonikov <evgeniy@morphbits.ru>
This commit is contained in:
Evgenii Stratonikov 2022-08-29 10:49:14 +03:00 committed by fyrchik
parent df88afeef3
commit dfac4e1c0b

View file

@ -25,14 +25,19 @@ func (b *Blobovniczas) Init() error {
return nil return nil
} }
return b.iterateBlobovniczas(false, func(p string, blz *blobovnicza.Blobovnicza) error { return b.iterateLeaves(func(p string) (bool, error) {
blz, err := b.openBlobovniczaNoCache(p, false)
if err != nil {
return true, err
}
defer blz.Close()
if err := blz.Init(); err != nil { if err := blz.Init(); err != nil {
return fmt.Errorf("could not initialize blobovnicza structure %s: %w", p, err) return true, fmt.Errorf("could not initialize blobovnicza structure %s: %w", p, err)
} }
b.log.Debug("blobovnicza successfully initialized, closing...", zap.String("id", p)) b.log.Debug("blobovnicza successfully initialized, closing...", zap.String("id", p))
return false, nil
return nil
}) })
} }
@ -84,24 +89,9 @@ func (b *Blobovniczas) openBlobovnicza(p string) (*blobovnicza.Blobovnicza, erro
return v.(*blobovnicza.Blobovnicza), nil return v.(*blobovnicza.Blobovnicza), nil
} }
b.openMtx.Lock() blz, err := b.openBlobovniczaNoCache(p, true)
defer b.openMtx.Unlock() if err != nil {
return nil, err
b.lruMtx.Lock()
v, ok = b.opened.Get(p)
b.lruMtx.Unlock()
if ok {
// blobovnicza should be opened in cache
return v.(*blobovnicza.Blobovnicza), nil
}
blz := blobovnicza.New(append(b.blzOpts,
blobovnicza.WithReadOnly(b.readOnly),
blobovnicza.WithPath(filepath.Join(b.rootPath, p)),
)...)
if err := blz.Open(); err != nil {
return nil, fmt.Errorf("could not open blobovnicza %s: %w", p, err)
} }
b.activeMtx.Lock() b.activeMtx.Lock()
@ -114,3 +104,28 @@ func (b *Blobovniczas) openBlobovnicza(p string) (*blobovnicza.Blobovnicza, erro
return blz, nil return blz, nil
} }
func (b *Blobovniczas) openBlobovniczaNoCache(p string, tryCache bool) (*blobovnicza.Blobovnicza, error) {
b.openMtx.Lock()
defer b.openMtx.Unlock()
if tryCache {
b.lruMtx.Lock()
v, ok := b.opened.Get(p)
b.lruMtx.Unlock()
if ok {
// blobovnicza should be opened in cache
return v.(*blobovnicza.Blobovnicza), nil
}
}
blz := blobovnicza.New(append(b.blzOpts,
blobovnicza.WithReadOnly(b.readOnly),
blobovnicza.WithPath(filepath.Join(b.rootPath, p)),
)...)
if err := blz.Open(); err != nil {
return nil, fmt.Errorf("could not open blobovnicza %s: %w", p, err)
}
return blz, nil
}