package blobstor import ( "context" "sync/atomic" "time" "git.frostfs.info/TrueCloudLab/frostfs-observability/tracing" "golang.org/x/sync/errgroup" ) // DumpInfo returns information about blob stor. func (b *BlobStor) DumpInfo() Info { b.modeMtx.RLock() defer b.modeMtx.RUnlock() sub := make([]SubStorageInfo, len(b.storage)) for i := range b.storage { sub[i].Path = b.storage[i].Storage.Path() sub[i].Type = b.storage[i].Storage.Type() } return Info{ SubStorages: sub, } } // ObjectsCount returns Blobstore's total objects count. func (b *BlobStor) ObjectsCount(ctx context.Context) (uint64, error) { var err error startedAt := time.Now() defer func() { b.metrics.ObjectsCount(time.Since(startedAt), err == nil) }() ctx, span := tracing.StartSpanFromContext(ctx, "BlobStor.ObjectsCount") defer span.End() b.modeMtx.RLock() defer b.modeMtx.RUnlock() var result atomic.Uint64 eg, egCtx := errgroup.WithContext(ctx) for i := range b.storage { i := i eg.Go(func() error { v, e := b.storage[i].Storage.ObjectsCount(egCtx) if e != nil { return e } result.Add(v) return nil }) } if err = eg.Wait(); err != nil { return 0, err } return result.Load(), nil }