blobovniczatree: Return source error from Init() #1630

Merged
fyrchik merged 1 commit from dstepanov-yadro/frostfs-node:fix/blobovniczatree_init_error into master 2025-02-04 07:13:47 +00:00
2 changed files with 60 additions and 27 deletions

View file

@ -41,35 +41,34 @@ func (b *Blobovniczas) initializeDBs(ctx context.Context) error {
}
eg, egCtx := errgroup.WithContext(ctx)
eg.SetLimit(b.blzInitWorkerCount)
err = b.iterateIncompletedRebuildDBPaths(egCtx, func(p string) (bool, error) {
eg.Go(func() error {
p = strings.TrimSuffix(p, rebuildSuffix)
shBlz := b.getBlobovniczaWithoutCaching(p)
blz, err := shBlz.Open(egCtx)
if err != nil {
return err
}
defer shBlz.Close(egCtx)
moveInfo, err := blz.ListMoveInfo(egCtx)
if err != nil {
return err
}
for _, move := range moveInfo {
b.deleteProtectedObjects.Add(move.Address)
}
b.log.Debug(egCtx, logs.BlobovniczatreeBlobovniczaSuccessfullyInitializedClosing, zap.String("id", p))
return nil
})
return false, nil
})
if err != nil {
_ = eg.Wait()
return err
if b.blzInitWorkerCount > 0 {
Review

blzInitWorkerCount could be -1 (means no limit)

`blzInitWorkerCount` could be -1 (means no limit)
eg.SetLimit(b.blzInitWorkerCount + 1)
}
eg.Go(func() error {
return b.iterateIncompletedRebuildDBPaths(egCtx, func(p string) (bool, error) {
eg.Go(func() error {
p = strings.TrimSuffix(p, rebuildSuffix)
shBlz := b.getBlobovniczaWithoutCaching(p)
blz, err := shBlz.Open(egCtx)
if err != nil {
return err
}
defer shBlz.Close(egCtx)
moveInfo, err := blz.ListMoveInfo(egCtx)
if err != nil {
return err
}
for _, move := range moveInfo {
b.deleteProtectedObjects.Add(move.Address)
}
b.log.Debug(egCtx, logs.BlobovniczatreeBlobovniczaSuccessfullyInitializedClosing, zap.String("id", p))
return nil
})
return false, nil
})
})
return eg.Wait()
}

View file

@ -2,6 +2,9 @@ package blobovniczatree
import (
"context"
"os"
"path"
"strconv"
"testing"
objectCore "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/object"
@ -129,3 +132,34 @@ func TestObjectsAvailableAfterDepthAndWidthEdit(t *testing.T) {
require.NoError(t, blz.Close(context.Background()))
}
func TestInitBlobovniczasInitErrorType(t *testing.T) {
t.Parallel()
rootDir := t.TempDir()
for idx := 0; idx < 10; idx++ {
f, err := os.Create(path.Join(rootDir, strconv.FormatInt(int64(idx), 10)+".db"))
require.NoError(t, err)
_, err = f.Write([]byte("invalid db"))
require.NoError(t, err)
require.NoError(t, f.Close())
f, err = os.Create(path.Join(rootDir, strconv.FormatInt(int64(idx), 10)+".db"+rebuildSuffix))
require.NoError(t, err)
require.NoError(t, f.Close())
}
blz := NewBlobovniczaTree(
context.Background(),
WithBlobovniczaShallowDepth(1),
WithBlobovniczaShallowWidth(1),
WithRootPath(rootDir),
)
require.NoError(t, blz.Open(mode.ComponentReadWrite))
err := blz.Init()
require.Contains(t, err.Error(), "open blobovnicza")
require.Contains(t, err.Error(), "invalid database")
require.NoError(t, blz.Close(context.Background()))
}