From 0c784b4cc908b41fb16f967616ce5762d86597b8 Mon Sep 17 00:00:00 2001 From: Tigor Hutasuhut Date: Mon, 3 Jun 2024 23:31:45 +0700 Subject: [PATCH] fix: database lock by adding lock function when set schedule --- api/pubsub_download.go | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/api/pubsub_download.go b/api/pubsub_download.go index 687309a..e47d09f 100644 --- a/api/pubsub_download.go +++ b/api/pubsub_download.go @@ -96,26 +96,28 @@ func (api *API) PubsubStartDownloadSubreddit(ctx context.Context, params PubsubS return errs.Wrapw(err, "failed to verify subreddit existence", "params", params) } - err = api.withTransaction(ctx, func(exec bob.Executor) error { - _, err := api.scheduleSet(ctx, exec, ScheduleSetParams{ - Subreddit: subreddit.Name, - Status: ScheduleStatusEnqueued, + api.lockf(func() { + err = api.withTransaction(ctx, func(exec bob.Executor) error { + _, err := api.scheduleSet(ctx, exec, ScheduleSetParams{ + Subreddit: subreddit.Name, + Status: ScheduleStatusEnqueued, + }) + if err != nil { + return err + } + + payload, err := json.Marshal(subreddit) + if err != nil { + return errs.Wrapw(err, "failed to marshal subreddit") + } + + err = api.publisher.Publish(downloadTopic, message.NewMessage(watermill.NewUUID(), payload)) + if err != nil { + return errs.Wrapw(err, "failed to enqueue reddit download", "params", params) + } + return nil }) - if err != nil { - return err - } - - payload, err := json.Marshal(subreddit) - if err != nil { - return errs.Wrapw(err, "failed to marshal subreddit") - } - - err = api.publisher.Publish(downloadTopic, message.NewMessage(watermill.NewUUID(), payload)) - if err != nil { - return errs.Wrapw(err, "failed to enqueue reddit download", "params", params) - } - return nil }) - return nil + return err }