feat(server/m7-scan-progress): wire stagePublisher into 4 scan stages
Each of the 4 stage workers (library walk, MBID backfill, cover enrich, artist art enrich) gains a progressCb parameter that receives a snapshot of the current running state per item processed. The orchestrator stores the snapshot in a local var that the publisher's marshal closure reads at flush time. scanrun.go's 4 stage blocks are rewritten to construct one publisher per stage, pass a Tick-firing closure to the worker as progressCb, and call Flush() after the worker returns (routing any persist error to captureErr — preserves today's diagnostic behavior). The previous post-stage UpdateScanRun* calls are removed; the publisher's Flush handles the final write. Cadence: every 500 items OR every 1s, whichever fires first. Outside-orchestrator callers (scanner_test.go, enricher_test.go) pass nil for progressCb — no-op behavior preserved for tests that don't need progress observability. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -135,7 +135,8 @@ func (e *Enricher) recordArtistArt(ctx context.Context, artistID pgtype.UUID, th
|
||||
// EnrichArtistBatch drains up to limit artists whose eligibility loop
|
||||
// determines they need processing. Iterates serially. Returns
|
||||
// per-batch tallies for the orchestrator's scan-run record.
|
||||
func (e *Enricher) EnrichArtistBatch(ctx context.Context, limit int, dataDir string) (processed, succeeded, failed int, err error) {
|
||||
func (e *Enricher) EnrichArtistBatch(ctx context.Context, limit int, dataDir string,
|
||||
progressCb func(processed, succeeded, failed int)) (processed, succeeded, failed int, err error) {
|
||||
if limit <= 0 {
|
||||
return 0, 0, 0, nil
|
||||
}
|
||||
@@ -156,12 +157,18 @@ func (e *Enricher) EnrichArtistBatch(ctx context.Context, limit int, dataDir str
|
||||
e.logger.Warn("coverart: artist batch entry failed",
|
||||
"artist_id", uuidString(id), "err", eerr)
|
||||
failed++
|
||||
if progressCb != nil {
|
||||
progressCb(processed, succeeded, failed)
|
||||
}
|
||||
continue
|
||||
}
|
||||
// Re-read to classify.
|
||||
row, rerr := q.GetArtistByID(ctx, id)
|
||||
if rerr != nil {
|
||||
failed++
|
||||
if progressCb != nil {
|
||||
progressCb(processed, succeeded, failed)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if row.ArtistArtSource != nil &&
|
||||
@@ -171,6 +178,9 @@ func (e *Enricher) EnrichArtistBatch(ctx context.Context, limit int, dataDir str
|
||||
} else {
|
||||
failed++
|
||||
}
|
||||
if progressCb != nil {
|
||||
progressCb(processed, succeeded, failed)
|
||||
}
|
||||
}
|
||||
return processed, succeeded, failed, nil
|
||||
}
|
||||
|
||||
@@ -146,7 +146,8 @@ func (e *Enricher) recordAlbumCover(ctx context.Context, albumID pgtype.UUID, pa
|
||||
// EnrichBatch drains up to limit albums whose eligibility loop
|
||||
// determines they need processing. Iterates serially. Returns
|
||||
// per-batch tallies for the orchestrator's scan-run record.
|
||||
func (e *Enricher) EnrichBatch(ctx context.Context, limit int) (processed, succeeded, failed int, err error) {
|
||||
func (e *Enricher) EnrichBatch(ctx context.Context, limit int,
|
||||
progressCb func(processed, succeeded, failed int)) (processed, succeeded, failed int, err error) {
|
||||
if limit <= 0 {
|
||||
return 0, 0, 0, nil
|
||||
}
|
||||
@@ -167,12 +168,18 @@ func (e *Enricher) EnrichBatch(ctx context.Context, limit int) (processed, succe
|
||||
e.logger.Warn("coverart: batch entry failed",
|
||||
"album_id", uuidString(id), "err", eerr)
|
||||
failed++
|
||||
if progressCb != nil {
|
||||
progressCb(processed, succeeded, failed)
|
||||
}
|
||||
continue
|
||||
}
|
||||
// Re-read to classify.
|
||||
row, rerr := q.GetAlbumWithFirstTrackPath(ctx, id)
|
||||
if rerr != nil {
|
||||
failed++
|
||||
if progressCb != nil {
|
||||
progressCb(processed, succeeded, failed)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if row.CoverArtSource != nil &&
|
||||
@@ -184,6 +191,9 @@ func (e *Enricher) EnrichBatch(ctx context.Context, limit int) (processed, succe
|
||||
} else {
|
||||
failed++
|
||||
}
|
||||
if progressCb != nil {
|
||||
progressCb(processed, succeeded, failed)
|
||||
}
|
||||
}
|
||||
return processed, succeeded, failed, nil
|
||||
}
|
||||
|
||||
@@ -263,7 +263,7 @@ func TestEnrichBatch_DrainsNullSourceOnly(t *testing.T) {
|
||||
}
|
||||
|
||||
e := newTestEnricher(t, pool)
|
||||
processed, _, _, err := e.EnrichBatch(context.Background(), 100)
|
||||
processed, _, _, err := e.EnrichBatch(context.Background(), 100, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("batch: %v", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user