fix ui race for package count (#2839)

Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
This commit is contained in:
Alex Goodman 2024-05-06 11:45:52 -04:00 committed by GitHub
parent 00ff3ffda9
commit a56eff90d6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 30 additions and 31 deletions

View File

@ -36,14 +36,22 @@ type Accessor interface {
} }
type sbomBuilder struct { type sbomBuilder struct {
sbom *sbom.SBOM sbom *sbom.SBOM
lock *sync.RWMutex lock *sync.RWMutex
onWrite []func(*sbom.SBOM)
} }
func NewBuilder(s *sbom.SBOM) Builder { func NewBuilder(s *sbom.SBOM, onWrite ...func(*sbom.SBOM)) Builder {
return &sbomBuilder{ return &sbomBuilder{
sbom: s, sbom: s,
lock: &sync.RWMutex{}, lock: &sync.RWMutex{},
onWrite: onWrite,
}
}
func (b sbomBuilder) onWriteEvent() {
for _, fn := range b.onWrite {
fn(b.sbom)
} }
} }
@ -52,6 +60,7 @@ func (b sbomBuilder) WriteToSBOM(fn func(*sbom.SBOM)) {
defer b.lock.Unlock() defer b.lock.Unlock()
fn(b.sbom) fn(b.sbom)
b.onWriteEvent()
} }
func (b sbomBuilder) ReadFromSBOM(fn func(*sbom.SBOM)) { func (b sbomBuilder) ReadFromSBOM(fn func(*sbom.SBOM)) {
@ -66,6 +75,7 @@ func (b sbomBuilder) AddPackages(p ...pkg.Package) {
defer b.lock.Unlock() defer b.lock.Unlock()
b.sbom.Artifacts.Packages.Add(p...) b.sbom.Artifacts.Packages.Add(p...)
b.onWriteEvent()
} }
func (b sbomBuilder) AddRelationships(relationship ...artifact.Relationship) { func (b sbomBuilder) AddRelationships(relationship ...artifact.Relationship) {
@ -73,6 +83,7 @@ func (b sbomBuilder) AddRelationships(relationship ...artifact.Relationship) {
defer b.lock.Unlock() defer b.lock.Unlock()
b.sbom.Relationships = append(b.sbom.Relationships, relationship...) b.sbom.Relationships = append(b.sbom.Relationships, relationship...)
b.onWriteEvent()
} }
func (b sbomBuilder) SetLinuxDistribution(release linux.Release) { func (b sbomBuilder) SetLinuxDistribution(release linux.Release) {
@ -80,4 +91,5 @@ func (b sbomBuilder) SetLinuxDistribution(release linux.Release) {
defer b.lock.Unlock() defer b.lock.Unlock()
b.sbom.Artifacts.LinuxDistribution = &release b.sbom.Artifacts.LinuxDistribution = &release
b.onWriteEvent()
} }

View File

@ -4,11 +4,9 @@ import (
"context" "context"
"fmt" "fmt"
"sort" "sort"
"time"
"github.com/dustin/go-humanize" "github.com/dustin/go-humanize"
"github.com/scylladb/go-set/strset" "github.com/scylladb/go-set/strset"
"github.com/wagoodman/go-progress"
"github.com/anchore/syft/internal/bus" "github.com/anchore/syft/internal/bus"
"github.com/anchore/syft/internal/sbomsync" "github.com/anchore/syft/internal/sbomsync"
@ -63,9 +61,9 @@ func CreateSBOM(ctx context.Context, src source.Source, cfg *CreateSBOMConfig) (
} }
catalogingProgress := monitorCatalogingTask(src.ID(), taskGroups) catalogingProgress := monitorCatalogingTask(src.ID(), taskGroups)
packageCatalogingProgress := monitorPackageCatalogingTask(s.Artifacts.Packages) packageCatalogingProgress := monitorPackageCatalogingTask()
builder := sbomsync.NewBuilder(&s) builder := sbomsync.NewBuilder(&s, monitorPackageCount(packageCatalogingProgress))
for i := range taskGroups { for i := range taskGroups {
err := task.NewTaskExecutor(taskGroups[i], cfg.Parallelism).Execute(ctx, resolver, builder, catalogingProgress) err := task.NewTaskExecutor(taskGroups[i], cfg.Parallelism).Execute(ctx, resolver, builder, catalogingProgress)
if err != nil { if err != nil {
@ -80,7 +78,14 @@ func CreateSBOM(ctx context.Context, src source.Source, cfg *CreateSBOMConfig) (
return &s, nil return &s, nil
} }
func monitorPackageCatalogingTask(pkgs *pkg.Collection) *monitor.CatalogerTaskProgress { func monitorPackageCount(prog *monitor.CatalogerTaskProgress) func(s *sbom.SBOM) {
return func(s *sbom.SBOM) {
count := humanize.Comma(int64(s.Artifacts.Packages.PackageCount()))
prog.AtomicStage.Set(fmt.Sprintf("%s packages", count))
}
}
func monitorPackageCatalogingTask() *monitor.CatalogerTaskProgress {
info := monitor.GenericTask{ info := monitor.GenericTask{
Title: monitor.Title{ Title: monitor.Title{
Default: "Packages", Default: "Packages",
@ -90,25 +95,7 @@ func monitorPackageCatalogingTask(pkgs *pkg.Collection) *monitor.CatalogerTaskPr
ParentID: monitor.TopLevelCatalogingTaskID, ParentID: monitor.TopLevelCatalogingTaskID,
} }
prog := bus.StartCatalogerTask(info, -1, "") return bus.StartCatalogerTask(info, -1, "")
go func() {
ticker := time.NewTicker(200 * time.Millisecond)
defer ticker.Stop()
for {
<-ticker.C
count := humanize.Comma(int64(pkgs.PackageCount()))
prog.AtomicStage.Set(fmt.Sprintf("%s packages", count))
if progress.IsCompleted(prog) {
break
}
}
}()
return prog
} }
func monitorCatalogingTask(srcID artifact.ID, tasks [][]task.Task) *monitor.CatalogerTaskProgress { func monitorCatalogingTask(srcID artifact.ID, tasks [][]task.Task) *monitor.CatalogerTaskProgress {

View File

@ -3,14 +3,14 @@ package spdxjson
import ( import (
"bytes" "bytes"
"flag" "flag"
"github.com/anchore/syft/syft/artifact"
"github.com/anchore/syft/syft/file"
"strings" "strings"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/anchore/syft/syft/artifact"
"github.com/anchore/syft/syft/file"
"github.com/anchore/syft/syft/format/internal/spdxutil" "github.com/anchore/syft/syft/format/internal/spdxutil"
"github.com/anchore/syft/syft/format/internal/testutil" "github.com/anchore/syft/syft/format/internal/testutil"
"github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/pkg"