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

+12 -6
View File
@@ -36,7 +36,7 @@ func NewRunPurgeUseCase(imageRepository image.Repository, articleRepository arti
}
func (u *RunPurgeUseCase) Run(ctx context.Context, fingerprint *string) (purge.RunResult, error) {
result, err := u.Execute(fingerprint)
result, err := u.Execute(ctx, fingerprint)
event := audit.NewEvent(audit.ActionMediaPurge, audit.CategoryMedia)
if err != nil {
recordFailure(ctx, u.recorder, event, err)
@@ -55,7 +55,7 @@ func purgeParams(result purge.RunResult) map[string]any {
return params
}
func (u *RunPurgeUseCase) Execute(fingerprint *string) (purge.RunResult, error) {
func (u *RunPurgeUseCase) Execute(ctx context.Context, fingerprint *string) (purge.RunResult, error) {
if !u.guard.TryLock() {
return purge.RunResult{}, purge.ErrPurgeBusy
}
@@ -69,7 +69,10 @@ func (u *RunPurgeUseCase) Execute(fingerprint *string) (purge.RunResult, error)
return purge.RunResult{}, purge.ErrPurgeConflict
}
result := u.mergeGroups(plan)
result, err := u.mergeGroups(ctx, plan)
if err != nil {
return purge.RunResult{}, err
}
if err := u.recordRun(result); err != nil {
u.logger.Printf("purge: could not record the run result: %v", err)
return purge.RunResult{}, err
@@ -77,11 +80,14 @@ func (u *RunPurgeUseCase) Execute(fingerprint *string) (purge.RunResult, error)
return result, nil
}
func (u *RunPurgeUseCase) mergeGroups(plan purgePlan) purge.RunResult {
func (u *RunPurgeUseCase) mergeGroups(ctx context.Context, plan purgePlan) (purge.RunResult, error) {
result := purge.RunResult{GroupsTotal: len(plan.groups)}
updated := map[uint32]bool{}
for _, group := range plan.groups {
merged, err := u.merge.merge(group.kept.ID, slices.Clone(group.mergedIds))
if err := ctx.Err(); err != nil {
return purge.RunResult{}, err
}
merged, err := u.merge.merge(ctx, group.kept.ID, slices.Clone(group.mergedIds), plan.entries)
if err != nil {
result.FailedGroups++
continue
@@ -95,7 +101,7 @@ func (u *RunPurgeUseCase) mergeGroups(plan purgePlan) purge.RunResult {
}
}
result.ArticlesUpdated = len(updated)
return result
return result, nil
}
func (u *RunPurgeUseCase) recordRun(result purge.RunResult) error {