From 2d0ea600173d280e24bfeccf225a8af688563226 Mon Sep 17 00:00:00 2001 From: Karl Persson Date: Tue, 8 Oct 2024 19:53:23 +0200 Subject: [PATCH] ServiceAccounts: Run migration in batches (#94429) * ServiceAccounts: Run migration in batches --- .../sqlstore/migrations/accesscontrol/orphaned.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pkg/services/sqlstore/migrations/accesscontrol/orphaned.go b/pkg/services/sqlstore/migrations/accesscontrol/orphaned.go index 05ade14da83..e96f966c862 100644 --- a/pkg/services/sqlstore/migrations/accesscontrol/orphaned.go +++ b/pkg/services/sqlstore/migrations/accesscontrol/orphaned.go @@ -49,7 +49,13 @@ func (m *orphanedServiceAccountPermissions) Exec(sess *xorm.Session, mg *migrato return nil } - // Then find all existing service accounts + return batch(len(ids), batchSize, func(start, end int) error { + return m.exec(sess, mg, ids[start:end]) + }) +} + +func (m *orphanedServiceAccountPermissions) exec(sess *xorm.Session, mg *migrator.Migrator, ids []int64) error { + // get all service accounts from batch raw := "SELECT u.id FROM " + mg.Dialect.Quote("user") + " AS u WHERE u.is_service_account AND u.id IN(?" + strings.Repeat(",?", len(ids)-1) + ")" args := make([]any, 0, len(ids)) for _, id := range ids { @@ -57,7 +63,7 @@ func (m *orphanedServiceAccountPermissions) Exec(sess *xorm.Session, mg *migrato } var existingIDs []int64 - err = sess.SQL(raw, args...).Find(&existingIDs) + err := sess.SQL(raw, args...).Find(&existingIDs) if err != nil { return fmt.Errorf("failed to fetch existing service accounts: %w", err) }