refac: atomic merge, lost-update race, RunPurge cost, duplicated walks
This commit is contained in:
1 parent
0fc3511e2b
commit
074944c99a
45 files changed
+2204
-267
No files matched your search
@@ -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 {
|
||||
|
||||
Reference in new issue
Block a user