Move scene post update hook to outside Identify transaction (#1953)

* Move update post hook call outside transaction
* Make Scene Movies resolver use read transaction
This commit is contained in:
WithoutPants 2021-11-06 09:58:52 +11:00 committed by GitHub
parent dbfd92f9a8
commit 5bb5f6f2ce
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 43 deletions

View file

@ -140,7 +140,7 @@ func (r *sceneResolver) Studio(ctx context.Context, obj *models.Scene) (ret *mod
} }
func (r *sceneResolver) Movies(ctx context.Context, obj *models.Scene) (ret []*models.SceneMovie, err error) { func (r *sceneResolver) Movies(ctx context.Context, obj *models.Scene) (ret []*models.SceneMovie, err error) {
if err := r.withTxn(ctx, func(repo models.Repository) error { if err := r.withReadTxn(ctx, func(repo models.ReaderRepository) error {
qb := repo.Scene() qb := repo.Scene()
mqb := repo.Movie() mqb := repo.Movie()

View file

@ -33,7 +33,7 @@ type SceneIdentifier struct {
SceneUpdatePostHookExecutor SceneUpdatePostHookExecutor SceneUpdatePostHookExecutor SceneUpdatePostHookExecutor
} }
func (t *SceneIdentifier) Identify(ctx context.Context, repo models.Repository, scene *models.Scene) error { func (t *SceneIdentifier) Identify(ctx context.Context, txnManager models.TransactionManager, scene *models.Scene) error {
result, err := t.scrapeScene(scene) result, err := t.scrapeScene(scene)
if err != nil { if err != nil {
return err return err
@ -45,7 +45,7 @@ func (t *SceneIdentifier) Identify(ctx context.Context, repo models.Repository,
} }
// results were found, modify the scene // results were found, modify the scene
if err := t.modifyScene(ctx, repo, scene, result); err != nil { if err := t.modifyScene(ctx, txnManager, scene, result); err != nil {
return fmt.Errorf("error modifying scene: %v", err) return fmt.Errorf("error modifying scene: %v", err)
} }
@ -165,34 +165,44 @@ func (t *SceneIdentifier) getSceneUpdater(ctx context.Context, s *models.Scene,
return ret, nil return ret, nil
} }
func (t *SceneIdentifier) modifyScene(ctx context.Context, repo models.Repository, scene *models.Scene, result *scrapeResult) error { func (t *SceneIdentifier) modifyScene(ctx context.Context, txnManager models.TransactionManager, s *models.Scene, result *scrapeResult) error {
updater, err := t.getSceneUpdater(ctx, scene, result, repo) var updater *scene.UpdateSet
if err != nil { if err := txnManager.WithTxn(ctx, func(repo models.Repository) error {
var err error
updater, err = t.getSceneUpdater(ctx, s, result, repo)
if err != nil {
return err
}
// don't update anything if nothing was set
if updater.IsEmpty() {
logger.Infof("Nothing to set for %s", s.Path)
return nil
}
_, err = updater.Update(repo.Scene(), t.ScreenshotSetter)
if err != nil {
return fmt.Errorf("error updating scene: %w", err)
}
as := ""
title := updater.Partial.Title
if title != nil {
as = fmt.Sprintf(" as %s", title.String)
}
logger.Infof("Successfully identified %s%s using %s", s.Path, as, result.source.Name)
return nil
}); err != nil {
return err return err
} }
// don't update anything if nothing was set
if updater.IsEmpty() {
logger.Infof("Nothing to set for %s", scene.Path)
return nil
}
_, err = updater.Update(repo.Scene(), t.ScreenshotSetter)
if err != nil {
return fmt.Errorf("error updating scene: %w", err)
}
// fire post-update hooks // fire post-update hooks
updateInput := updater.UpdateInput() if !updater.IsEmpty() {
fields := utils.NotNilFields(updateInput, "json") updateInput := updater.UpdateInput()
t.SceneUpdatePostHookExecutor.ExecuteSceneUpdatePostHooks(ctx, updateInput, fields) fields := utils.NotNilFields(updateInput, "json")
t.SceneUpdatePostHookExecutor.ExecuteSceneUpdatePostHooks(ctx, updateInput, fields)
as := ""
title := updater.Partial.Title
if title != nil {
as = fmt.Sprintf(" as %s", title.String)
} }
logger.Infof("Successfully identified %s%s using %s", scene.Path, as, result.source.Name)
return nil return nil
} }

View file

@ -130,25 +130,23 @@ func (j *IdentifyJob) identifyScene(ctx context.Context, s *models.Scene, source
return return
} }
if err := j.txnManager.WithTxn(context.TODO(), func(r models.Repository) error { var taskError error
var taskError error j.progress.ExecuteTask("Identifying "+s.Path, func() {
j.progress.ExecuteTask("Identifying "+s.Path, func() { task := identify.SceneIdentifier{
task := identify.SceneIdentifier{ DefaultOptions: j.input.Options,
DefaultOptions: j.input.Options, Sources: sources,
Sources: sources, ScreenshotSetter: &scene.PathsScreenshotSetter{
ScreenshotSetter: &scene.PathsScreenshotSetter{ Paths: instance.Paths,
Paths: instance.Paths, FileNamingAlgorithm: instance.Config.GetVideoFileNamingAlgorithm(),
FileNamingAlgorithm: instance.Config.GetVideoFileNamingAlgorithm(), },
}, SceneUpdatePostHookExecutor: j.postHookExecutor,
SceneUpdatePostHookExecutor: j.postHookExecutor, }
}
taskError = task.Identify(ctx, r, s) taskError = task.Identify(ctx, j.txnManager, s)
}) })
return taskError if taskError != nil {
}); err != nil { logger.Errorf("Error encountered identifying %s: %v", s.Path, taskError)
logger.Errorf("Error encountered identifying %s: %v", s.Path, err)
} }
j.progress.Increment() j.progress.Increment()