diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index f1f943a2c2..31b88a7981 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -423,6 +423,8 @@ var migrations = []Migration{ NewMigration("Update counts of all open milestones", updateOpenMilestoneCounts), // v230 -> v231 NewMigration("Add ConfidentialClient column (default true) to OAuth2Application table", addConfidentialClientColumnToOAuth2ApplicationTable), + // v231 -> v232 + NewMigration("Add index for hook_task", addIndexForHookTask), } // GetCurrentDBVersion returns the current db version diff --git a/models/migrations/v231.go b/models/migrations/v231.go new file mode 100644 index 0000000000..34dc72294a --- /dev/null +++ b/models/migrations/v231.go @@ -0,0 +1,19 @@ +// Copyright 2022 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "xorm.io/xorm" +) + +func addIndexForHookTask(x *xorm.Engine) error { + type HookTask struct { + ID int64 `xorm:"pk autoincr"` + HookID int64 `xorm:"index"` + UUID string `xorm:"unique"` + } + + return x.Sync(new(HookTask)) +} diff --git a/models/webhook/hooktask.go b/models/webhook/hooktask.go index 2b9b63c09b..246484aea9 100644 --- a/models/webhook/hooktask.go +++ b/models/webhook/hooktask.go @@ -103,9 +103,9 @@ type HookResponse struct { // HookTask represents a hook task. type HookTask struct { - ID int64 `xorm:"pk autoincr"` - HookID int64 - UUID string + ID int64 `xorm:"pk autoincr"` + HookID int64 `xorm:"index"` + UUID string `xorm:"unique"` api.Payloader `xorm:"-"` PayloadContent string `xorm:"LONGTEXT"` EventType HookEventType @@ -270,7 +270,7 @@ func CleanupHookTaskTable(ctx context.Context, cleanupType HookTaskCleanupType, return db.ErrCancelledf("Before deleting hook_task records for hook id %d", hookID) default: } - if err = deleteDeliveredHookTasksByWebhook(hookID, numberToKeep); err != nil { + if err = deleteDeliveredHookTasksByWebhook(ctx, hookID, numberToKeep); err != nil { return err } } @@ -279,10 +279,10 @@ func CleanupHookTaskTable(ctx context.Context, cleanupType HookTaskCleanupType, return nil } -func deleteDeliveredHookTasksByWebhook(hookID int64, numberDeliveriesToKeep int) error { +func deleteDeliveredHookTasksByWebhook(ctx context.Context, hookID int64, numberDeliveriesToKeep int) error { log.Trace("Deleting hook_task rows for webhook %d, keeping the most recent %d deliveries", hookID, numberDeliveriesToKeep) deliveryDates := make([]int64, 0, 10) - err := db.GetEngine(db.DefaultContext).Table("hook_task"). + err := db.GetEngine(ctx).Table("hook_task"). Where("hook_task.hook_id = ? AND hook_task.is_delivered = ? AND hook_task.delivered is not null", hookID, true). Cols("hook_task.delivered"). Join("INNER", "webhook", "hook_task.hook_id = webhook.id"). @@ -294,7 +294,7 @@ func deleteDeliveredHookTasksByWebhook(hookID int64, numberDeliveriesToKeep int) } if len(deliveryDates) > 0 { - deletes, err := db.GetEngine(db.DefaultContext). + deletes, err := db.GetEngine(ctx). Where("hook_id = ? and is_delivered = ? and delivered <= ?", hookID, true, deliveryDates[0]). Delete(new(HookTask)) if err != nil {