From d4975cbffdf32cf5a7ebc40a07422a52f63f94fd Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Mon, 10 Mar 2025 01:25:17 +0200 Subject: [PATCH] crypto/sql_store: fix MarkTrackedUsersOutdated for big lists --- crypto/sql_store.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/crypto/sql_store.go b/crypto/sql_store.go index b3c3c4d9..514c1e8c 100644 --- a/crypto/sql_store.go +++ b/crypto/sql_store.go @@ -13,6 +13,7 @@ import ( "encoding/json" "errors" "fmt" + "slices" "strings" "sync" "time" @@ -829,11 +830,13 @@ func (store *SQLCryptoStore) FilterTrackedUsers(ctx context.Context, users []id. // MarkTrackedUsersOutdated flags that the device list for given users are outdated. func (store *SQLCryptoStore) MarkTrackedUsersOutdated(ctx context.Context, users []id.UserID) (err error) { - if store.DB.Dialect == dbutil.Postgres && PostgresArrayWrapper != nil { - _, err = store.DB.Exec(ctx, "UPDATE crypto_tracked_user SET devices_outdated = true WHERE user_id = ANY($1)", PostgresArrayWrapper(users)) - } else { - placeholders, params := userIDsToParams(users) - _, err = store.DB.Exec(ctx, "UPDATE crypto_tracked_user SET devices_outdated = true WHERE user_id IN ("+placeholders+")", params...) + for chunk := range slices.Chunk(users, 1000) { + if store.DB.Dialect == dbutil.Postgres && PostgresArrayWrapper != nil { + _, err = store.DB.Exec(ctx, "UPDATE crypto_tracked_user SET devices_outdated = true WHERE user_id = ANY($1)", PostgresArrayWrapper(chunk)) + } else { + placeholders, params := userIDsToParams(chunk) + _, err = store.DB.Exec(ctx, "UPDATE crypto_tracked_user SET devices_outdated = true WHERE user_id IN ("+placeholders+")", params...) + } } return }