diff --git a/Iceshrimp.Backend/Core/Services/UserService.cs b/Iceshrimp.Backend/Core/Services/UserService.cs index 3d30f5af..cdc2f4ef 100644 --- a/Iceshrimp.Backend/Core/Services/UserService.cs +++ b/Iceshrimp.Backend/Core/Services/UserService.cs @@ -704,18 +704,22 @@ public class UserService( // Clean up user list memberships await db.UserListMembers.Where(p => p.UserList.User == user && p.User == followee).ExecuteDeleteAsync(); } - + [SuppressMessage("ReSharper", "SuggestBaseTypeForParameter", Justification = "Method only makes sense for users")] private void UpdateUserPinnedNotesInBackground(ASActor actor, User user, bool force = false) { if (followupTaskSvc.IsBackgroundWorker && !force) return; + if (KeyedLocker.IsInUse($"pinnedNotes:{user.Id}")) return; _ = followupTaskSvc.ExecuteTask("UpdateUserPinnedNotes", async provider => { - var bgDb = provider.GetRequiredService(); - var bgNoteSvc = provider.GetRequiredService(); - var bgUser = await bgDb.Users.IncludeCommonProperties().FirstOrDefaultAsync(p => p.Id == user.Id); - if (bgUser == null) return; - await bgNoteSvc.UpdatePinnedNotesAsync(actor, bgUser); + using (await KeyedLocker.LockAsync($"pinnedNotes:{user.Id}")) + { + var bgDb = provider.GetRequiredService(); + var bgNoteSvc = provider.GetRequiredService(); + var bgUser = await bgDb.Users.IncludeCommonProperties().FirstOrDefaultAsync(p => p.Id == user.Id); + if (bgUser == null) return; + await bgNoteSvc.UpdatePinnedNotesAsync(actor, bgUser); + } }); }