From dfac4e1c0b69c184e637cccebd724a136facb3a5 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Mon, 29 Aug 2022 10:49:14 +0300 Subject: [PATCH] [#1691] blobovniczatree: Do not fill cache during initialization Signed-off-by: Evgenii Stratonikov --- .../blobstor/blobovniczatree/control.go | 59 ++++++++++++------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/pkg/local_object_storage/blobstor/blobovniczatree/control.go b/pkg/local_object_storage/blobstor/blobovniczatree/control.go index b3fba7645..ff7578a50 100644 --- a/pkg/local_object_storage/blobstor/blobovniczatree/control.go +++ b/pkg/local_object_storage/blobstor/blobovniczatree/control.go @@ -25,14 +25,19 @@ func (b *Blobovniczas) Init() error { 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 { - 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)) - - return nil + return false, nil }) } @@ -84,24 +89,9 @@ func (b *Blobovniczas) openBlobovnicza(p string) (*blobovnicza.Blobovnicza, erro return v.(*blobovnicza.Blobovnicza), nil } - b.openMtx.Lock() - defer b.openMtx.Unlock() - - 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) + blz, err := b.openBlobovniczaNoCache(p, true) + if err != nil { + return nil, err } b.activeMtx.Lock() @@ -114,3 +104,28 @@ func (b *Blobovniczas) openBlobovnicza(p string) (*blobovnicza.Blobovnicza, erro 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 +}