refac: atomic merge, lost-update race, RunPurge cost, duplicated walks

This commit is contained in:
Florian Sylvain committed 2026-10-21 22:47:46 +02:00
1 parent 0fc3511e2b
commit 074944c99a
45 files changed
+2204 -267

No files matched your search

+8 -8
View File
@@ -58,7 +58,7 @@ type producerPurgeRunner struct {
var _ useCases.PurgeRunner = &producerPurgeRunner{}
func (r *producerPurgeRunner) Execute(*string) (purge.RunResult, error) {
func (r *producerPurgeRunner) Execute(context.Context, *string) (purge.RunResult, error) {
r.calls++
return r.result, r.err
}
@@ -245,7 +245,7 @@ func TestActivityLogProducersFailureReasons(t *testing.T) {
t.Helper()
h := newActivityHarness(t)
scheduler := useCases.NewPurgeSchedulerUseCase(dueSettings(), &producerPurgeRunner{err: err}, h.recorder)
if _, _, tickErr := scheduler.Tick(*purgeTime("2026-10-05T09:00:00Z")); !errors.Is(tickErr, err) {
if _, _, tickErr := scheduler.Tick(testCtx, *purgeTime("2026-10-05T09:00:00Z")); !errors.Is(tickErr, err) {
t.Fatalf("tick err = %v", tickErr)
}
return onlyEvent(t, h)
@@ -322,7 +322,7 @@ func TestActivityLogProducersScheduledPurge(t *testing.T) {
runner := &producerPurgeRunner{result: purge.RunResult{GroupsTotal: 2, GroupsPurged: 2, Merged: 3, ArticlesUpdated: 5}}
scheduler := useCases.NewPurgeSchedulerUseCase(due(), runner, h.recorder)
if _, ran, err := scheduler.Tick(now); err != nil || !ran {
if _, ran, err := scheduler.Tick(testCtx, now); err != nil || !ran {
t.Fatalf("ran = %v, err = %v", ran, err)
}
@@ -341,7 +341,7 @@ func TestActivityLogProducersScheduledPurge(t *testing.T) {
runner := &producerPurgeRunner{result: purge.RunResult{GroupsTotal: 3, GroupsPurged: 2, FailedGroups: 1, Merged: 2, ArticlesUpdated: 2}}
scheduler := useCases.NewPurgeSchedulerUseCase(due(), runner, h.recorder)
if _, _, err := scheduler.Tick(now); err != nil {
if _, _, err := scheduler.Tick(testCtx, now); err != nil {
t.Fatal(err)
}
@@ -356,10 +356,10 @@ func TestActivityLogProducersScheduledPurge(t *testing.T) {
h := newActivityHarness(t)
notDue := newMockPurgeSettingsRepo()
runner := &producerPurgeRunner{}
if _, ran, err := useCases.NewPurgeSchedulerUseCase(notDue, runner, h.recorder).Tick(now); err != nil || ran {
if _, ran, err := useCases.NewPurgeSchedulerUseCase(notDue, runner, h.recorder).Tick(testCtx, now); err != nil || ran {
t.Fatalf("ran = %v, err = %v", ran, err)
}
if _, ran, err := useCases.NewPurgeSchedulerUseCase(due(), runner, h.recorder).Tick(now); err != nil || !ran {
if _, ran, err := useCases.NewPurgeSchedulerUseCase(due(), runner, h.recorder).Tick(testCtx, now); err != nil || !ran {
t.Fatalf("ran = %v, err = %v", ran, err)
}
assertNoEvents(t, h)
@@ -369,7 +369,7 @@ func TestActivityLogProducersScheduledPurge(t *testing.T) {
h := newActivityHarness(t)
runner := &producerPurgeRunner{err: errRepositoryFailure}
if _, _, err := useCases.NewPurgeSchedulerUseCase(due(), runner, h.recorder).Tick(now); err == nil {
if _, _, err := useCases.NewPurgeSchedulerUseCase(due(), runner, h.recorder).Tick(testCtx, now); err == nil {
t.Fatal("expected an error")
}
@@ -383,7 +383,7 @@ func TestActivityLogProducersScheduledPurge(t *testing.T) {
images := &producerBlockingImageRepo{mockImageRepo: newMockImageRepo(), entered: make(chan struct{}, 2), release: make(chan struct{})}
articles := newMockArticleRepo()
storage := newMockImageStorage()
merge := useCases.NewMergeMediaUseCase(images, articles, storage, newMockVariantFileRepo(), h.recorder, plainSites(), plainAuthors(), newMockContentTypeRepo(), newMockEntryRepo())
merge := newTestMergeMedia(images, articles, storage, newMockVariantFileRepo(), h.recorder, plainSites(), plainAuthors(), newMockContentTypeRepo(), newMockEntryRepo())
run := useCases.NewRunPurgeUseCase(images, articles, merge, newMockPurgeSettingsRepo(), func() time.Time { return now }, log.New(io.Discard, "", 0), h.recorder, plainSites(), plainAuthors())
finished := make(chan struct{})